Maritime Situational Awareness ตอน 4: dark activities กับ sensor ที่เรือสั่งปิดปากไม่ได้

ตามหาเรือที่ดับ AIS ด้วย RF Detection ชายฝั่ง RF จากดาวเทียม ดาวเทียม SAR และ EO/IR แล้วให้ Machine Learning ชี้เป้าบนภาพ ก่อนเอา detection ที่ไม่มีชื่อกลับมาจับคู่กับ track ที่หลอมไว้ตอนที่แล้ว

19 กันยายน 2026เวลาอ่าน 14 นาที#GIS#Software Engineer
Maritime Situational Awareness ตอน 4: dark activities กับ sensor ที่เรือสั่งปิดปากไม่ได้

ว่าไงโหม๋ ตอนที่ 3 เราเพิ่งเอาเป้าจาก AIS เรดาร์ และกล้อง มาหลอมจนเรือหนึ่งลำเหลือหมุดเดียวบนแผนที่ ต่อจากตอนที่ 2 ที่เป็นเรดาร์ชายฝั่งกับกล้อง EO/IR และตอนที่ 1 ที่เป็น Signal Chain ตั้งแต่ขา RS-232 จนได้หมุดแรกขึ้นจอ ทั้งหมดอยู่ใต้โจทย์เดียวที่ตั้งไว้ใน Maritime Domain Awareness คือ "ตอนนี้ในทะเลมีอะไรอยู่บ้างวะ"

แล้วผมก็ปิดตอนที่แล้วไว้ว่าสามตอนนั้นคือ easy mode ล้วนๆ เพราะเรือที่เราไล่ตามมันยอมให้เห็น เปิด AIS ประกาศตัวเอง ลอยให้เรดาร์กวาดเจอ แล้วอยู่นิ่งในเฟรมตอนกล้องหันไปส่อง

ตอนที่ 4 คือฝั่งตรงข้ามของทุกอย่างที่ผ่านมา — เรือที่ ตั้งใจ ไม่ให้เราเห็น งานมันเลยพลิกจาก "รับของที่เขาส่งมาให้" เป็น "ไปเอาของที่เขาไม่ได้ส่งมา" ซึ่งแปลว่าต้องเปลี่ยนชุด sensor ทั้งยวง ไปใช้ของที่เรือสั่งให้หุบปากไม่ได้ ตั้งแต่ RF Detection ชายฝั่ง RF จากดาวเทียม ดาวเทียม SAR ดาวเทียม EO/IR แล้วจบที่ Machine Learning ที่เอามาชี้เป้าบนของพวกนั้น ซึ่งในตอนนี้จะออกหัวแตกน้อยหน่อย เน้น diagram เป็นตัวนำ โค้ดมีนิดเดียว สวัสดีป้า

และเรื่องนี้ไม่ได้จบแค่ประมงเถื่อนกับน้ำมันเถื่อนนะฮะ ระหว่างทางเราจะไปแตะสองคำที่โผล่ในข่าวถี่ขึ้นทุกปี คือ gray zone กับ สายเคเบิลใต้น้ำ ที่อยู่ดีๆ ก็ขาดพร้อมกันหลายเส้น

dark activities หน้าตาเป็นยังไง — ป้าที่ต้องอ่านจากถังขยะ

ย้อนไปหาป้าข้างบ้านจากบทความ MDA แป๊บนึง ป้าถนัดสืบด้วยการถามคน ถามยาม ถามแม่ค้าหน้าปากซอย วันไหนทุกคนยอมคุย ป้ารู้ครบตั้งแต่เงินเดือนยันวันเกิดแฟนเก่า

ทีนี้ถ้าเพื่อนบ้าน 4 ใน 5 คนเลิกคุยกับป้าพร้อมกันล่ะ ป้าก็ต้องเปลี่ยนวิธี ไปอ่านจากรอยเท้าหน้าบ้าน จากถังขยะที่มีกล่องพิซซ่าสองกล่องทั้งที่อยู่กันสองคน จากไฟที่ดับผิดเวลา จากเสียงรถเข้าบ้านตอนตีสอง — dark activities ในทะเลคืออันนี้ทั้งดุ้น แค่เปลี่ยนถังขยะเป็นภาพจากดาวเทียม

แผนภาพรวมรูปแบบ dark activities ห้าแบบบนแผนที่ทะเลเดียวกัน ช่องที่หนึ่งเส้นทาง AIS ที่ขาดหายไปเป็นช่วงแล้วโผล่ใหม่ไกลออกไป พร้อมวงประแสดงระยะสูงสุดที่เรือไปได้ระหว่างที่เงียบ ช่องที่สองเรือที่ประกาศพิกัดอยู่คนละที่กับตำแหน่งที่ตรวจจับได้จริง โดยลากเส้นโยงระหว่างสองจุดให้เห็นระยะที่ขัดกัน ช่องที่สามเรือสองลำเข้ามาจอดเทียบกันกลางทะเลด้วยความเร็วต่ำแล้วแยกย้ายกันไปคนละทาง ช่องที่สี่กลุ่มเรืออายุมากที่เจ้าของไม่ชัดเจนเดินทางเป็นขบวนเรียงกัน และช่องที่ห้าเรือลอยวนไปมาเหนือเส้นแนวสายเคเบิลใต้น้ำที่ลากพาดอยู่บนแผนที่ ทุกช่องมีป้ายกำกับชื่อรูปแบบเป็นภาษาอังกฤษ

รูปแบบที่เจอกันบ่อยมีประมาณนี้

  • AIS gap — เรือเงียบไปเฉยๆ เป็นชั่วโมงหรือเป็นวัน แล้วค่อยกลับมาพูดใหม่ ตัวช่องว่างเองยังไม่ผิดนะ เพราะสถานีรับล่ม อุปกรณ์เสีย หรืออยู่นอกระยะก็เงียบได้ ที่น่าสนใจคือลำที่เงียบบ่อยกว่าเพื่อน เงียบที่เดิมทุกครั้ง หรือเงียบพอดีตอนเข้าเขตที่ไม่ควรเข้า ฮั่นแน่
  • AIS spoofing — อันนี้หนักกว่าเงียบ เพราะมันไม่ได้หุบปาก แต่พูดโกหก ประกาศพิกัดอยู่กลางอ่าวไทยทั้งที่ตัวจริงอยู่อีกซีกโลก หรือหยิบ MMSI ของเรือลำอื่นมาสวม หรือที่เห็นบ่อยๆ คือมันมักจะวิ่งเป็นวงกลม หลายๆ จุดต่อๆ กันแบบเป็น pattern สวยงามเกินไป
  • Rendezvous — เรือสองลำนัดเจอกันกลางทะเล ชะลอความเร็วจนเกือบหยุด อยู่ติดกันสักพักใหญ่ แล้วแยกย้าย ถ้าถ่ายของหรือถ่ายน้ำมันกันจริงเขาเรียกว่า ship-to-ship (STS) transfer ซึ่งเป็นกิจกรรมปกติของการเดินเรือพาณิชย์ทั่วโลก สิ่งที่ทำให้น่าสงสัยคือทำที่ไหน ตอนกี่โมง และตอนนั้นมีใครดับ AIS อยู่บ้าง
  • Dark fleet / shadow fleet — กองเรือที่ตัวตนพร่ามัวทั้งกอง อายุมาก เปลี่ยนชื่อเปลี่ยนธงบ่อย เจ้าของเป็นบริษัทที่สาวไปแล้วเจอแต่ตู้ ปณ. พวกนี้ไม่ได้ผิดเพราะ "แล่นอยู่" แต่คือกลุ่มที่ออกแบบมาให้สืบยากตั้งแต่วันจดทะเบียน
  • Loitering ผิดที่ผิดเวลา — ไม่ได้ไปไหน ไม่ได้หาปลา แต่วนอยู่แถวนั้นนานผิดปกติ โดยเฉพาะเมื่อ "แถวนั้น" ดันเป็นแนวสายเคเบิลใต้น้ำหรือปากทางเข้าท่าเรือสำคัญ

สังเกตนะว่าไม่มีข้อไหนเป็นความผิดในตัวมันเอง ทุกข้อคือ ความผิดปกติ เฉยๆ งานของระบบจึงไม่ใช่การตัดสิน แต่คือยกมือบอกว่าตรงนี้แปลกนะ แล้วส่งต่อให้คนไปดู

คำว่า gray zone ที่เกริ่นไว้ตอนต้นก็เกิดจากช่องว่างตรงนี้แหละครับ มันคือการกระทำที่แรงพอจะสร้างผลกระทบ แต่จงใจเบาพอจะไม่ถึงขั้นใช้กำลัง และสำคัญที่สุดคือต้อง ปฏิเสธได้ กองเรือประมงที่โผล่มาแช่เป็นร้อยลำ เรือสำรวจที่เก็บข้อมูลก้นทะเลในที่ที่ไม่ควรวิ่ง เรือสินค้าที่บังเอิญลากสมออยู่เป็นสิบกิโลเมตร — ทุกเคสเตรียมคำอธิบายที่ฟังขึ้นไว้หมดแล้ว

เรื่องสายเคเบิลใต้น้ำยิ่งชัด ทราฟฟิกอินเทอร์เน็ตข้ามทวีปเกือบทั้งหมดวิ่งในสายเส้นเล็กๆ ที่นอนก้นทะเล และสถิติทั้งโลกบอกว่าสายขาดส่วนใหญ่มาจากสมอเรือกับอวนลาก ไม่ได้มาจากใครตั้งใจ — นั่นคือเหตุผลที่มันเป็นเครื่องมือ gray zone ชั้นดี เพราะ "อุบัติเหตุ" เป็นข้ออ้างที่เตรียมมาให้ฟรีอยู่แล้ว ข้อดีอย่างเดียวของฝั่งเราคือแนวเคเบิลส่วนใหญ่เป็นข้อมูลเปิด เอามาทำเป็น layer แล้วตั้ง Geofenced ได้ทันที

RF Detection ชายฝั่ง — ดับ AIS ได้ แต่ปิดตาตัวเองไม่ได้

ทีนี้มาลงมือกัน อันดับแรกที่คนมักลืมคือ เรือที่ดับ AIS ไม่ได้แปลว่ามันเงียบ มันแค่ปิดปากตัวที่ประกาศชื่อตัวเอง ของอย่างอื่นบนสะพานเดินเรือยังทำงานครบ เพราะถ้าปิดหมดจริงๆ ก็เดินเรือไม่ได้เหมือนกัน

ของที่ยังส่งคลื่นออกมาให้จับได้มีหลายอย่าง

  • เรดาร์เดินเรือ ตัวที่หมุนอยู่บนเสาต้นนั้น มันคือเครื่องส่งคลื่นไมโครเวฟกำลังสูงที่เปิดตลอด ไม่มีกัปตันคนไหนกล้าปิดตอนแล่นกลางคืนหรือทัศนวิสัยแย่ เพราะปิดแล้วชนเอาจริงๆ
  • วิทยุ VHF และ DSC ช่องเรียกขานกับช่องเรียกอัตโนมัติที่ใช้ติดต่อระหว่างเรือกับฝั่ง
  • บีคอนฉุกเฉินอย่าง EPIRB ไม่ได้ส่งตลอด แต่วันที่มันส่งคือวันที่มีคนกำลังจะตาย ระบบต้องได้ยินให้ได้ ไม่ว่าเรือลำนั้นจะโปร่งใสหรือไม่

เทียบกับป้าอีกทีคือ ต่อให้บ้านนั้นปิดไฟหมดทั้งหลัง ป้าก็ยังได้ยินเสียงคอมเพรสเซอร์แอร์หลังบ้าน

แผนภาพการหาตำบลที่ด้วย RF Detection จากสถานีชายฝั่งสามแห่ง แต่ละสถานีวาดเป็นเสาอากาศพร้อมลากเส้นแบริ่งเป็นลำแสงพุ่งออกไปในทะเล และมีแถบความคลาดเคลื่อนของมุมกางออกสองข้างของลำแสง เส้นจากทั้งสามสถานีตัดกันเป็นสามเหลี่ยมเล็กๆ ตรงตำแหน่งเรือ มีวงรีความไม่แน่นอนครอบไว้ ด้านข้างมีกล่องเปรียบเทียบสองกรณีวางบนล่าง กรณีบนสองเส้นตัดกันเกือบเก้าสิบองศาได้วงความไม่แน่นอนเล็กและกลม กรณีล่างสองเส้นตัดกันเป็นมุมแคบได้วงยาวรีพุ่งออกนอกฝั่ง พร้อมป้ายกำกับคำว่า AoA, TDOA และ cut angle

ได้สัญญาณพวกนี้แล้วจะรู้ตำแหน่งได้ยังไงอ่ะ? สถานีเดียวบอกได้แค่ "ทิศ" จึงต้องมีหลายสถานี แล้วเล่นสองท่าหลัก

  • AoA (Angle of Arrival) — แต่ละสถานีวัดว่าคลื่นวิ่งเข้ามาจากมุมไหน โดยดูความต่างของเฟสหรือความแรงระหว่างเสาอากาศหลายต้นที่วางห่างกันเป็นชุด แล้วลากเส้นแบริ่งออกไป จุดที่เส้นจากหลายสถานีตัดกันคือตำบลที่ของเป้า ท่านี้เองที่เรียกว่า cross-cut
  • TDOA (Time Difference of Arrival) — ไม่สนใจมุม แต่วัดว่าสัญญาณก้อนเดียวกันมาถึงสถานีไหนก่อนหลังกี่นาโนวินาที ความต่างของเวลาแปลงเป็นไฮเพอร์โบลาได้หนึ่งเส้นต่อหนึ่งคู่สถานี พอมีหลายคู่ก็ตัดกันเป็นจุด แม่นกว่าแต่แพงกว่า เพราะนาฬิกาทุกสถานีต้องตรงกันระดับนาโนวินาที ต้อง Time Server มาขึงเวลาให้

จุดที่คนทำระบบต้องจำให้ขึ้นใจคือ มุมตัดสำคัญกว่าความแม่นของมุม สองเส้นที่ตัดกันเกือบตั้งฉากได้จุดที่คมมาก แต่ถ้าสถานีสองแห่งอยู่ใกล้กันจนเส้นแทบขนาน ต่อให้วัดมุมแม่นระดับเศษองศา จุดตัดก็ยืดเป็นวงรียาวเหยียดอยู่ดี เรื่องนี้ฝั่งดาวเทียมเรียกว่า GDOP หลักการเดียวกันเป๊ะ — เลือกทำเลตั้งสถานีผิดตั้งแต่วันแรก ซื้อของแพงแค่ไหนก็ช่วยไม่ได้

โค้ดของท่า cross-cut ไม่ซับซ้อน แค่หาจุดตัดของเส้นตรงสองเส้นบนระนาบ แล้วคืนวงความไม่แน่นอนไปด้วยเสมอ

python
import math

R = 6371008.8                     # รัศมีโลกเฉลี่ย (เมตร)
SIGMA_DEG = 1.5                   # ความคลาดของการวัดมุมต่อสถานี (องศา) — ของจริงวัดเอาจากหน้างาน

def to_xy(lat, lon, lat0, lon0):  # ยุบเป็นระนาบ local รอบจุดอ้างอิง หน่วยเมตร
    return (math.radians(lon - lon0) * R * math.cos(math.radians(lat0)),
            math.radians(lat - lat0) * R)

def cross_cut(sta_a, brg_a, sta_b, brg_b):
    """sta = (lat, lon) ของสถานี, brg = แบริ่ง true ที่วัดได้ (องศา)"""
    lat0, lon0 = sta_a
    bx, by = to_xy(sta_b[0], sta_b[1], lat0, lon0)
    ua = (math.sin(math.radians(brg_a)), math.cos(math.radians(brg_a)))   # ทิศ: (ตะวันออก, เหนือ)
    ub = (math.sin(math.radians(brg_b)), math.cos(math.radians(brg_b)))
    det = ub[0] * ua[1] - ua[0] * ub[1]
    if abs(det) < 1e-9:                          # สองเส้นเกือบขนาน = อย่าไปเชื่อจุดตัด
        return None
    t = (ub[0] * by - ub[1] * bx) / det          # เดินจากสถานี A ไปตามเส้นของมันเท่าไหร่
    if t <= 0:                                   # จุดตัดอยู่ข้างหลังเสา = ไม่ใช่ของจริง
        return None
    x, y = t * ua[0], t * ua[1]
    cut = math.degrees(math.acos(max(-1.0, min(1.0, ua[0] * ub[0] + ua[1] * ub[1]))))
    cut = min(cut, 180 - cut)                    # มุมตัดของสองเส้น 0..90
    err_m = t * math.radians(SIGMA_DEG) / max(math.sin(math.radians(cut)), 0.08)
    return {"lat": lat0 + math.degrees(y / R),
            "lon": lon0 + math.degrees(x / (R * math.cos(math.radians(lat0)))),
            "err_m": err_m, "cut_deg": cut}      # ส่งวงกับมุมตัดไปด้วยเสมอ อย่าส่งแต่จุด

สองสถานีพอใช้ได้ แต่สามสถานีขึ้นไปดีกว่าเยอะ เพราะเส้นที่สามเป็นกรรมการคอยตัดจุดที่ไม่น่าเชื่อทิ้ง และช่วยกันปัญหาคลาสสิกของ RF อย่างคลื่นสะท้อนหลายทาง (multipath) กับวันที่ชั้นบรรยากาศเหนือทะเลทำตัวเป็นท่อนำคลื่น (ducting) จนสัญญาณจากเรือไกลลิบวิ่งมาถึงเสาเราหน้าตาเฉย

ข้อจำกัดที่ต้องพูดให้ชัดคือ RF Detection บอกได้แค่ว่า "ตรงนี้มีเครื่องส่งอยู่หนึ่งตัว" ไม่มีชื่อ ไม่มี MMSI ไม่มีธง ที่เหลือเป็นหน้าที่ของขั้น fusion ตอนท้ายเรื่อง

RF จากวงโคจร — ยกหูขึ้นไปวางกลางมหาสมุทร

เสาชายฝั่งจะดีแค่ไหนก็ได้ยินแค่ระยะขอบฟ้าวิทยุ ไม่กี่สิบไมล์ทะเลจากตัวมันเอง พ้นจากนั้นโลกก็โค้งหนีไปแล้ว แต่ของที่เรือส่งไม่ได้พุ่งออกข้างอย่างเดียว เรดาร์เดินเรือกับวิทยุบนสะพานเดินเรือหว่านขึ้นฟ้าด้วย ใครลอยอยู่ข้างบนก็เลยได้ยิน — เอาเครื่องรับไปติดบนดาวเทียมวงโคจรต่ำ รอบเดียวที่บินผ่านก็กวาดฟังได้ทั้งมหาสมุทร ลำที่ดับ AIS แล้ววิ่งหนีไปไกลเกินหูของชายฝั่ง แต่เรดาร์ยังหมุนอยู่บนหัวตัวเอง ก็โผล่มาในลิสต์ตรงนี้

แผนภาพ RF Detection จากวงโคจรสามส่วนเรียงซ้ายไปขวา ส่วนซ้ายเป็นฝูงดาวเทียมสามดวงบินเรียงกันเป็นรูปสามเหลี่ยมเหนือผืนทะเล ทุกดวงรับสัญญาณจากเรือลำเดียวกันที่อยู่ด้านล่าง มีเส้น TDOA เป็นไฮเพอร์โบลาสองสามเส้นและเส้น FDOA เป็นโค้งอีกชุดหนึ่งคนละสี ทั้งสองชุดตัดกันบนผิวทะเลตรงตำแหน่งเรือพอดี พร้อมป้ายกำกับคำว่า TDOA และ FDOA ส่วนกลางเป็นดาวเทียมดวงเดียวกับเส้นทางบินที่มีสามตำแหน่งตามเวลากำกับว่า t1 t2 t3 ใต้เส้นทางบินมีกราฟเล็กแสดงโค้งดอปเปลอร์เป็นความถี่เทียบกับเวลาที่ลาดจากสูงลงต่ำและผ่านจุดกลาง กับเส้น AoA ที่ลากจากดาวเทียมลงมาตัดผิวโลกได้จุดเดียว ส่วนขวาเป็นการ์ดลายนิ้วมือเรดาร์ที่วาดแถบ pulse train เป็นพัลส์เรียงกัน มีป้ายชี้ค่าพารามิเตอร์คือ PRF ความกว้างพัลส์ รอบหมุนของเสา และความเพี้ยนเฉพาะเครื่อง แล้วมีลูกศรชี้ไปยังการ์ดฐานข้อมูลที่จับคู่ลายนิ้วมือกับหมายเลข MMSI เป็นแถวๆ โดยมีหนึ่งแถวที่ป้ายชื่อบอกว่าเป็นเรือประมงแต่ลายนิ้วมือเป็นเรดาร์ของเรือสินค้า ถูกตีเครื่องหมายว่าค่าขัดกัน ด้านล่างสุดเป็นแถบเปรียบเทียบสองช่อง ช่องซ้ายคือสถานีชายฝั่งที่ได้ยินแค่ในระยะขอบฟ้าวิทยุ ช่องขวาคือวงโคจรที่ได้ยินทั้งมหาสมุทรแต่มาเป็นรอบเวลา

ท่าแรกคือ ยกเสาสามต้นขึ้นไปไว้บนฟ้า ดาวเทียมบินเป็นฝูงเล็กๆ สักสามดวงเกาะกลุ่มกันไม่ห่าง รับสัญญาณก้อนเดียวกัน แล้ววัดสองอย่าง อย่างแรกคือ TDOA ความต่างของเวลาที่มาถึงแต่ละดวง แปลงเป็นไฮเพอร์โบลาได้เหมือนตอนอยู่บนดิน อย่างที่สองคือ FDOA (Frequency Difference of Arrival) ความต่างของความถี่ดอปเปลอร์ เพราะแต่ละดวงวิ่งเข้าหาหรือหนีจากเป้าด้วยความเร็วไม่เท่ากัน สองชุดเส้นโค้งนี้ตัดกันบนผิวทะเลตรงไหน ตรงนั้นคือตำบลที่ หลักเดียวกับ cross-cut ของชายฝั่งเป๊ะ ต่างแค่สถานีวิ่งเจ็ดกิโลเมตรต่อวินาที และ "มุมตัด" กลายเป็นรูปทรงของฝูง บินเบียดกันเกินไปวงก็ยืดเป็นไข่เหมือนตั้งเสาชิดกัน นาฬิกาก็ยังต้องตรงระดับนาโนวินาทีอยู่ดี

ท่าที่สองคือ ดวงเดียวบอกได้เลย ฟังดูขัดกับที่เพิ่งพูด แต่ทำได้จริงสองวิธี

  • ใช้เวลาแทนจำนวนดวง บินผ่านเป้าแล้วฟังต่อเนื่องหลายสิบวินาที ความถี่ที่รับได้จะไล่จากสูงลงต่ำตามดอปเปลอร์ เป็นโค้งหนึ่งเส้น รูปทรงของโค้งบอกว่าเป้าห่างจากแนวบินเท่าไหร่ จังหวะที่ผ่านค่ากลางบอกตำแหน่งตามแนวบิน — เท่ากับเอาดวงเดียวไปยืนหลายที่ตามเวลา แล้ว cross-cut กับตัวเองในอดีต
  • AoA จากเสาอากาศแบบ array บนดาวเทียม วัดว่าคลื่นเข้ามาจากทิศไหน แล้วลากเส้นนั้นลงไปตัดผิวโลก ได้จุดเดียวจบ ที่ทำได้เพราะรู้แน่ๆ ว่าเป้าลอยอยู่บนผิวทะเล เท่ากับมี "ระนาบ" แถมมาฟรีหนึ่งอัน

ข้อแลกเปลี่ยนตรงไปตรงมา ดวงเดียวถูกกว่า ยิงง่ายกว่า ไม่ต้องประคองระยะในฝูง แต่วงความไม่แน่นอนใหญ่กว่าชัดเจน และเป้าที่ส่งสั้นๆ อย่างกดคีย์วิทยุพูดสามวินาที จับด้วยโค้งดอปเปลอร์ไม่ทัน เพราะโค้งยังลากไม่เป็นรูป เคสแบบนั้นต้องพึ่ง AoA หรือฝูงหลายดวง

ของแถมที่อยากให้จำไว้คือ ลายนิ้วมือของเครื่องส่ง เรดาร์เดินเรือแต่ละเครื่องมีบุคลิกของมัน ทั้งความถี่กลาง, PRF (pulse repetition frequency) หรือจังหวะยิงพัลส์, ความกว้างพัลส์, รอบหมุนของเสา และความเพี้ยนเล็กๆ ของฮาร์ดแวร์ตัวนั้นเอง วงการเรียกรวมว่า specific emitter identification ป้าข้างบ้านทำมาก่อนใครเพื่อน เพราะป้าจำเสียงเครื่องรถแต่ละบ้านได้โดยไม่ต้องเห็นทะเบียน

  • เดาชนิดเรือได้ จำแนกว่าเรดาร์ตัวนี้อยู่ตระกูลไหน แล้วเดาต่อว่าน่าจะเป็นเรือประมง เรือสินค้า หรือเรือรบ ทั้งที่ยังไม่เห็นภาพสักใบ
  • เปลี่ยนสัญญาณเป็นชื่อได้ ถ้าเคยได้ยินเครื่องนี้ตอนที่มันยังเปิด AIS ก็จับคู่ลายนิ้วมือกับ MMSI เก็บไว้ในฐานข้อมูล ครั้งหน้าที่มันดับ AIS ก็ยังพอรู้ว่าเป็นใคร
  • จับ spoofing ได้ ป้ายชื่อบอกว่าเป็นเรือประมงลำเล็ก แต่ลายนิ้วมือที่ได้ยินเป็นเรดาร์ของเรือสินค้าลำเบ้อเริ่ม นี่คือค่าขัดกันเต็มๆ ที่จะไปโผล่เป็น "กองที่สอง" ในหัวข้อ fusion ท้ายเรื่อง

ของพวกนี้ไม่ได้ศักดิ์สิทธิ์นะ ลายนิ้วมือเพี้ยนตามอุณหภูมิและอายุเครื่อง เรือเปลี่ยนเรดาร์ใหม่ก็นับหนึ่งใหม่ แถมต้องมีฐานข้อมูลที่สะสมนานพอจะมีของให้เทียบ — อีกเหตุผลที่ท้ายเรื่องจะพูดถึง Data Lake ว่าทำไมต้องเก็บของดิบตั้งแต่วันแรก

สรุปคือของที่ได้จากวงโคจรยังเป็น detection หน้าตาเดียวกับของชายฝั่ง มีพิกัด มีเวลา มีวงความไม่แน่นอน เพียงแต่คราวนี้พ่วงลายนิ้วมือมาด้วย ซึ่งบางทีแปลงกลับเป็นชื่อได้ ข้อจำกัดของ RF ทั้งบทคือได้ยินเฉพาะลำที่ยังส่งคลื่น ส่วนลำที่ใจถึงพอจะปิดทุกอย่างแล้วคลำทางไปเงียบๆ ไม่มีหูคู่ไหนช่วยได้ ต้องไปหาด้วยตาสถานเดียว

SAR Satellite — ทะลุเมฆ ทะลุกลางคืน แต่มาเป็นรอบ

อยู่บนวงโคจรกันแล้ว คราวนี้เปลี่ยนจากฟังเป็นมองบ้าง ตัวเอกของเรื่อง dark activities ทั้งโลกคือ SAR (Synthetic Aperture Radar) เรดาร์ที่ติดบนดาวเทียมและยิงคลื่นไมโครเวฟลงมาเอง

แผนภาพเปรียบเทียบดาวเทียม SAR กับดาวเทียม EO/IR แบ่งเป็นสองฝั่ง ฝั่งซ้ายดาวเทียม SAR ยิงลำคลื่นไมโครเวฟเฉียงลงมาทะลุชั้นเมฆในเวลากลางคืน ได้ภาพขาวดำที่ตัวเรือเป็นจุดสว่างจ้าบนพื้นทะเลสีมืด และวาดให้เห็นหางคลื่นรูปตัววีของเรือกับตัวเรือที่เหลื่อมออกจากปลายหางเพราะเรือกำลังเคลื่อนที่ ฝั่งขวาดาวเทียม EO/IR รับแสงอาทิตย์อย่างเดียวจึงมีก้อนเมฆบังจนเห็นแต่ขาว ข้างกันเป็นภาพสีตอนฟ้าเปิดที่เห็นรูปร่างเรือชัดจนแยกชนิดได้ และภาพแถบความร้อนตอนกลางคืนที่เห็นเรือเป็นจุดอุ่นบนพื้นเย็น ด้านล่างสุดเป็นแถบเวลาแนวนอนแสดงรอบโคจรที่ดาวเทียมกลับมาถ่ายซ้ำเป็นช่วงๆ มีช่องว่างคั่นชัดเจน และกล่องเทียบแนวกวาดกว้างที่ได้ความละเอียดต่ำ กับแนวกวาดแคบที่ได้ความละเอียดสูง

ประโยคที่เลาชอบใช้อธิบาย SAR ให้คนนอกฟังคือ มันพกไฟฉายของตัวเองไปด้วย กล้องต้องรอแสงอาทิตย์ แต่ SAR สร้างคลื่นเอง ยิงเอง รับเอง กลางคืนจึงถ่ายได้ เมฆหนาแค่ไหนก็ทะลุ ซึ่งกับทะเลบ้านเราที่หน้ามรสุมเมฆแทบไม่เคยเปิด ข้อนี้คือความต่างระหว่าง "มีข้อมูล" กับ "ไม่มี"

ส่วนคำว่า synthetic aperture คือเทคนิคที่ได้ภาพละเอียดโดยไม่ต้องแบกจานยักษ์ขึ้นไป — ดาวเทียมเก็บสัญญาณสะสมไปตลอดทางที่บิน แล้วประมวลผลรวมกันเสมือนมีเสาอากาศยาวเป็นกิโลเมตร ฉลาดโคตร

ทีนี้ทำไมเรือถึงโผล่บนภาพ SAR ชัดขนาดนั้น เหตุผลคือ ผิวทะเลเรียบสะท้อนคลื่นเฉียงหนีไปทางอื่น ดาวเทียมเลยแทบไม่ได้อะไรกลับมา ภาพออกมาเป็นสีดำ ส่วนเรือเหล็กเต็มไปด้วยมุมฉาก ทั้งกราบเรือกับผิวน้ำ ทั้งเก๋งกับดาดฟ้า มุมพวกนี้ทำตัวเป็นกระจกสะท้อนกลับที่เด้งคลื่นกลับไปหาต้นทางเต็มๆ ผลคือจุดขาวจ้าบนพื้นดำ

แต่มันมีเงื่อนไขของมัน สามข้อที่เจอบ่อยสุด

  • ทะเลไม่เรียบเสมอไป คลื่นลมแรงทำให้ผิวน้ำสะท้อนกลับทั่วทั้งภาพ พื้นหลังที่เคยดำกลายเป็นเทาหยาบ เรือลำเล็กจมหายไปในนั้น
  • เรือไม้กับเรือไฟเบอร์กลาสไม่ค่อยสะท้อน เรือประมงพื้นบ้านลำเล็กๆ จึงเป็นกลุ่มที่ SAR เห็นยากที่สุด ทั้งที่เราอยากเห็นพอๆ กับลำใหญ่
  • เป้าที่กำลังวิ่งจะวางผิดที่ อันนี้สนุกดี เพราะการเคลื่อนที่ของเรือทำให้ความถี่ที่สะท้อนกลับเพี้ยนด้วยปรากฏการณ์ดอปเปลอร์ ตัวประมวลผลภาพเลยวางตัวเรือเหลื่อมจากตำแหน่งจริงไปตามแนวที่ดาวเทียมบิน ภาพจึงออกมาเป็นเรือลอยอยู่ข้างๆ หางคลื่นของตัวเอง ฟังดูเหมือนบั๊ก แต่เป็นของแถม เพราะระยะที่เหลื่อมเอามาประมาณความเร็วเรือได้

ราคาที่ต้องจ่ายมีสองข้อ ข้อแรกคือ มันมาเป็นรอบ ดาวเทียมวงโคจรต่ำไม่ได้ลอยแช่เหนือหัวเรา มันวิ่งรอบโลกแล้วกลับมาผ่านที่เดิมตามคาบของมัน ต่อให้ยิงขึ้นไปเป็นฝูงจนรอบถี่ขึ้น ก็ยังเป็นภาพนิ่งเป็นช็อตๆ ไม่ใช่วิดีโอ ข้อสองคือ ความกว้างแลกกับความละเอียด โหมดกวาดกว้างเห็นผืนใหญ่แต่รายละเอียดน้อย โหมดละเอียดเห็นชัดแต่แคบ ต้องเลือกตั้งแต่ตอนสั่งถ่าย

วลีที่ผมเขียนไว้ตั้งแต่บทความ MDA ว่า "SAR ปิดไม่ได้ โกหกไม่ได้ แต่มาเป็นรอบ" จึงสรุปทั้งหัวข้อนี้ เรือหลอกมันไม่ได้ก็จริง แต่ หลบตารางเวลาของมันได้ และตารางนั้นคำนวณล่วงหน้าจากข้อมูลวงโคจรที่เปิดสาธารณะ

EO/IR Satellite — เห็นชัดกว่า แต่เงื่อนไขเยอะกว่า

อีกฝั่งคือดาวเทียมถ่ายภาพแบบ EO (Electro-Optical) ซึ่งก็คือกล้องถ่ายรูปดีๆ นี่แหละ แค่อยู่สูงมาก และ IR (Infrared) ที่รับคลื่นความร้อนแทนแสงที่ตามองเห็น ตัวเดียวกับที่เราสั่งให้หมุนไปส่องเป้าในตอนที่ 2 เพียงแต่คราวนี้ย้ายจากยอดเสาไปอยู่บนวงโคจร

ข้อได้เปรียบชัดมาก ภาพ EO เห็นเป็นรูปเรือจริงๆ เห็นสีตัวเรือ เห็นเครนบนดาดฟ้า แยกออกว่าเป็นเรือบรรทุกน้ำมันหรือเรือลากอวนคู่ ขณะที่จุดขาวบนภาพ SAR บอกได้แค่ "มีของโลหะยาวประมาณนี้" — เทียบกับป้าอีกทีคือ SAR บอกว่ามีรถจอดอยู่หน้าบ้าน ส่วน EO บอกว่ามันคือรถกระบะสีขาวที่มีสติกเกอร์ร้านวัสดุก่อสร้าง

แต่เงื่อนไขก็เยอะตามคุณภาพ เพราะ EO ขอสองอย่างพร้อมกันคือ แสงกับฟ้าเปิด กลางคืนถ่ายไม่ได้ เจอเมฆบังคือจบข่าว ซึ่งเมฆกับทะเลเขตร้อนเป็นของคู่กัน ส่วน IR ช่วยกลางคืนได้ด้วยการอ่านความต่างของอุณหภูมิ ตัวเรือกับปล่องที่อุ่นกว่าน้ำจะโผล่เป็นจุดสว่าง แต่หยาบกว่า EO และแพ้เมฆเหมือนกัน

อีกชิ้นที่คนไม่ค่อยนึกถึงคือ แถบกลางคืน ที่ไวต่อแสงจนเห็นไฟจากพื้นโลกได้ กลุ่มเรือประมงที่เปิดไฟล่อปลากลางทะเลจึงโผล่เป็นจุดเรืองแสงเป็นกลุ่มๆ เห้ย อันนี้คือ "ป้ามองเห็นไฟบ้านตอนตีสอง" ของจริงชัดๆ

ในทางปฏิบัติจึงไม่มีใครเลือกข้างระหว่าง SAR กับ EO/IR เขาใช้คู่กันด้วยท่าที่เรียกว่า tip & cue — ให้ SAR ที่กวาดกว้างและไม่แคร์เมฆ "ชี้" ก่อนว่ามีของต้องสงสัยตรงไหน แล้วสั่ง EO ที่แคบกว่าแต่ละเอียดกว่าไปถ่ายซ้ำจุดนั้นในรอบถัดไป มันคือ slew-to-cue ของตอนที่ 2 เป๊ะ ต่างแค่ของที่เราสั่งให้หันอยู่สูงหลายร้อยกิโลเมตร คิวยาว และคิดเงินเป็นภาพ แพงด้วย

หูตาอื่นๆ ที่ยังไม่ได้พูดถึง — เรือทิ้งร่องรอยไว้มากกว่าคลื่นวิทยุ

RF, SAR และ EO/IR คือสามตัวที่คนพูดถึงกันจนติดปากเวลาคุยเรื่อง dark activities แต่ของจริงมีหูตาอีกเยอะกว่านั้นมาก และทุกตัวตั้งอยู่บนหลักคิดเดียวกันหมด คือ เรือทำอะไรก็ทิ้งร่องรอยไว้ในตัวกลางบางอย่างเสมอ ไม่คลื่นวิทยุก็แสง ความร้อน เสียง แรงสั่น ไปจนถึงสัญญาณ GPS ที่สะท้อนออกจากตัวเรือ หัวข้อนี้ขอไล่คร่าวๆ เผื่อใครอยากไปขุดต่อ

แผนภาพภาพตัดขวางทะเลจากชายฝั่งออกไปถึงกลางมหาสมุทรและลึกลงไปใต้น้ำ วางหูตาแต่ละแบบไว้ตรงตำแหน่งที่มันอยู่จริง บนฝั่งเป็นเสาอากาศ HF Surface Wave Radar ต้นยาวที่มีลูกศรคลื่นเลี้ยวไปตามผิวทะเลข้ามเส้นขอบฟ้าออกไป ใต้น้ำเป็น hydrophone array วางอยู่บนพื้นทะเลกำลังรับคลื่นเสียงที่แผ่ออกมาจากใบจักรท้ายเรือ และมีสายเคเบิลใยแก้วทอดอยู่บนพื้นทะเลที่มีลำเลเซอร์วิ่งอยู่ในเส้นพร้อมจุดสั่นสว่างตรงที่เรือแล่นผ่านและตรงที่สมอตกลงมา ติดป้ายกำกับว่า DAS ที่ผิวน้ำมียานผิวน้ำไร้คนขับลำเล็กกับ glider ที่แบก sensor และทุ่นเสียงลอยอยู่ ในอากาศมีโดรนบินตรวจ ส่วนบนสุดในอวกาศเป็นดาวเทียม GNSS ที่ส่งสัญญาณลงมาสะท้อนตัวเรือแล้วเด้งไปเข้าดาวเทียมรับดวงเล็ก ติดป้ายกำกับว่า GNSS-R และ passive กลางภาพเป็นเรือเป้าหมายลำเดียวที่ดับ AIS แล้ว แต่มีไอคอนเล็กๆ รอบตัวแสดงร่องรอยที่มันทิ้งไว้ ทั้งคลื่นวิทยุ เสียง ความร้อน แรงสั่น และแสงสะท้อน ด้านล่างสุดเป็นแถบสรุปว่าทุกตัวคืนของออกมาเป็น detection ที่มีพิกัด เวลา และวงความไม่แน่นอน แล้วไหลเข้าท่อเดียวกัน

ที่พอจะไล่ได้ตอนนี้มีประมาณนี้

  • SONAR แบบ passive acoustic — ใบจักรเรือปั่นน้ำจนเกิดฟองแตกตัว (cavitation) เสียงกระจายในน้ำไปได้ไกลมาก hydrophone array ใต้น้ำจึงนั่งฟังเฉยๆ ไม่ต้องส่งอะไรออกไป ได้ทั้งทิศและ "ลายเสียง" คือโทนเครื่องยนต์บวกจังหวะใบจักรราว 150–2,000 Hz ที่จำแนกชนิดเรือได้แบบเดียวกับลายนิ้วมือ RF เรือปิดเรดาร์ปิด AIS ได้ แต่ปิดเสียงใบจักรตัวเองไม่ได้ ข้อแลกคือเสียงในน้ำเดินทางพิสดารตามชั้นอุณหภูมิ ติดตั้งแพง ระยะจำกัด
  • สายเคเบิลใต้น้ำที่ฟังตัวเองได้ (DAS — Distributed Acoustic Sensing) — ยิงเลเซอร์เข้าเส้นใยแก้วของสายที่นอนก้นทะเลอยู่แล้ว วัดการสั่นเล็กๆ ตลอดเส้น เท่ากับได้ hydrophone ยาวเป็นร้อยกิโลเมตรมาฟรีๆ จับได้ทั้งเรือแล่นผ่าน สมอตก อวนลาก งานวิจัยตอนนี้แม่นราวเก้าสิบกว่าเปอร์เซ็นต์ ระยะพลาดหลักร้อยเมตร วนกลับไปหาเรื่องสายเคเบิลถูกตัดตอนต้นพอดี เพราะสายกลายเป็น sensor เฝ้าตัวเอง
  • เรดาร์ข้ามขอบฟ้า (HF Surface Wave Radar) — คลื่นย่าน HF 3–30 MHz เลี้ยวเบนไปตามผิวทะเลได้ ไม่ติดโลกโค้งเหมือนเรดาร์ชายฝั่งในตอนที่ 2 กวาดไกลราว 200 ไมล์ทะเล ครอบ EEZ ทั้งผืนจากฝั่งเดียว ราคาที่จ่ายคือความละเอียดหยาบสุดๆ เป้าก้อนกว้างเป็นกิโลเมตร เสาอากาศยาวเป็นร้อยเมตร แถมคลื่นทะเลกับ ionosphere ยังกวน
  • passive radar และ GNSS-R — ไม่ต้องส่งคลื่นเองสักนิด ใช้ของที่ลอยเต็มอากาศอยู่แล้วเป็นไฟฉายแทน ทั้งสัญญาณ GNSS ที่สะท้อนจากผิวทะเลกับตัวเรือ หรือคลื่นวิทยุและทีวีภาคพื้น ตัวรับเงียบสนิทจนหาไม่เจอ ข้อเสียคือสัญญาณอ่อนมาก เห็นแต่เรือใหญ่ ยังเป็นงานวิจัยมากกว่าของใช้จริง
  • แสงไฟกลางคืน — อันนี้พูดไปแล้วในหัวข้อ EO/IR ทั้งแถบกลางคืนและไฟล่อปลา ขอนับรวมไว้ตรงนี้อีกทีว่ามันคือหูตาอีกตัวเต็มๆ ตัวหนึ่ง
  • ยานไร้คนขับ — เรือผิวน้ำไร้คนขับ (USV) กับ glider ที่แล่นด้วยพลังคลื่นหรือแสงแดดได้เป็นเดือน แบกทั้งกล้อง เรดาร์ตัวเล็ก เครื่องรับ RF และ hydrophone ไปนั่งเฝ้าตรงที่เสาชายฝั่งไปไม่ถึงและดาวเทียมไม่ได้อยู่บนหัว เสริมด้วยทุ่นเสียงติด AI ที่ตรวจเรือเร็วได้ real-time และโดรนตรวจภาพจากอากาศ
  • คน — ชาวประมงที่ออกทะเลทุกวัน คนท่าเรือ กลุ่มไลน์ในหมู่บ้าน ยังเป็น sensor ที่ถูกที่สุดในกองนี้อยู่ดี (ก็ยามหน้าปากซอยของป้าจากบทความ MDA นั่นเอง) ขอเก็บไว้เล่ายาวๆ ตอนที่ 5
  • ที่จินตนาการออกแต่ยังไม่ใช่ของใช้จริง — ลายความร้อนของน้ำหล่อเย็นเครื่องยนต์ที่ปล่อยทิ้งท้ายลำ แรงสั่นที่เซ็นเซอร์แผ่นดินไหวก้นทะเลอาจพอจับได้ หรือกระทั่ง Wi-Fi กับมือถือลูกเรือที่โผล่ในเครือข่ายภาคพื้น ย้ำว่ายังไม่ใช่ของใช้จริง แต่หลักคิดเดียวกันเป๊ะ

ไล่มาครบแล้วจะเห็นว่าทุกตัวคืนของหน้าตาเหมือนกันหมด คือ detection ที่มีพิกัด มีเวลา มีวงความไม่แน่นอน บางตัวพ่วงลายเสียงหรือลายนิ้วมือมาด้วย แล้วทั้งกองก็ไหลลงท่อเดียวกัน ผ่านหัวข้อ Machine Learning ถัดไป ไปบรรจบที่หัวข้อ fusion ท้ายเรื่อง ป้าเองก็ไม่ได้มีแต่ตา ป้ามีหู มีจมูก แล้วยังมีเพื่อนป้าอีกกองใหญ่

ได้ภาพมาแล้วทำไง — CFAR, CNN และจุดที่มันโดนหลอกง่ายกว่าที่คิด

ภาพดาวเทียมหนึ่งฉากกินพื้นที่ทะเลมหาศาล จะให้คนนั่งไล่ดูทีละตารางนิ้วก็ไม่ไหว ขั้นนี้เองที่ Machine Learning เข้ามาทำงาน

แผนภาพสายงานจากภาพและสัญญาณไปสู่เป้า เริ่มจากกล่องสามกล่องคือภาพ SAR ภาพ EO และสัญญาณ RF ไหลเข้าสู่ขั้นเตรียมข้อมูลที่ตัดภาพใหญ่เป็นแผ่นย่อยและกลบพื้นดินกับเกาะออกด้วย land mask ต่อด้วยขั้นตรวจจับที่วางสองทางคู่ขนานกัน ทางบนเป็น CFAR ที่เทียบความสว่างของจุดกับค่าเฉลี่ยพื้นหลังรอบๆ วาดเป็นกรอบหน้าต่างซ้อนกันสองชั้น ทางล่างเป็นโครงข่ายประสาทเทียมที่คืนกรอบล้อมเป้าพร้อมค่าความมั่นใจเป็นตัวเลข จากนั้นไหลเข้าขั้นจำแนกชนิดเรือ และขั้นคัดของหลอกที่มีไอคอนแท่นขุดเจาะกลางทะเล กังหันลม เกาะเล็ก และเป้าเงาจากคลื่นรบกวน ถูกตีกากบาททิ้ง ปลายทางออกมาเป็นรายการ detection ที่มีพิกัด เวลา ขนาดโดยประมาณ และค่าความมั่นใจ แต่ในช่องชื่อเรือเขียนว่าไม่ทราบ

ก่อนไปถึง deep learning ขอพูดถึงของเก่าที่ยังใช้อยู่ทุกวันนี้ คือ CFAR (Constant False Alarm Rate) วิธีคิดบ้านๆ มากคือ เอาหน้าต่างเล็กๆ ครอบจุดที่สนใจ แล้วใช้วงแหวนรอบนอกหาว่าพื้นหลังแถวนั้นสว่างเฉลี่ยเท่าไหร่ ถ้าตรงกลางสว่างเกินเกณฑ์ก็ประกาศว่าเจอเป้า ข้อดีคือมันปรับตัวตามพื้นหลังเอง ทะเลสงบใช้เกณฑ์ต่ำ คลื่นแรงก็ยกเกณฑ์ขึ้น เร็ว เบา และอธิบายได้ว่าทำไมถึงตัดสินแบบนั้น

ส่วน CNN (Convolutional Neural Network) หรือโมเดลตรวจจับวัตถุสมัยใหม่ เข้ามาช่วยตรงที่ CFAR ทำไม่ได้ คือการดู บริบทรอบข้าง จุดสว่างสองจุดอาจเหมือนกันเป๊ะ แต่ตัวหนึ่งมีหางคลื่นลากตามหลัง อีกตัวนิ่งสนิทอยู่ตำแหน่งเดิมทุกภาพย้อนหลังห้าปี โมเดลที่เห็นภาพทั้งแผ่นจะแยกเรือออกจากแท่นขุดเจาะได้ ส่วน CFAR มองสองอันนี้เท่ากันเสมอ ของจริงจึงวางสองชั้น ให้ CFAR คัดหยาบก่อน แล้วส่งเฉพาะแผ่นที่มีของเข้าโมเดลหนัก

แล้วมันพลาดตรงไหนบ้าง ต้องพูดกันตรงๆ

  • ของหลอกที่ไม่ใช่เรือ แท่นขุดเจาะ กังหันลม ทุ่นใหญ่ ขอบเกาะที่ land mask ตัดไม่หมด ล้วนสว่างสวยงามบนภาพ SAR ทางแก้ที่ได้ผลที่สุดไม่ใช่โมเดลที่ฉลาดขึ้น แต่คือ layer สิ่งปลูกสร้างถาวรที่เราทำเอง แล้วหักออกก่อนเข้าโมเดล
  • เป้าเงา เรือลำใหญ่มากๆ ทำให้เกิดเป้าปลอมเรียงเป็นแถว ซึ่งเป็นธรรมชาติของการประมวลผล SAR เอง คนอ่านภาพเป็นรู้ทันที แต่โมเดลที่ไม่เคยเห็นตอนเทรนจะนับเป็นเรือหลายลำ
  • ย้ายดาวเทียมแล้วโมเดลงอน โมเดลที่เทรนด้วยภาพจากดาวเทียมดวงหนึ่ง มุมตกกระทบหนึ่ง โพลาไรเซชันหนึ่ง พอเจอภาพจากอีกดวงก็ทำงานแย่ลงทันที นี่คือ domain shift แบบคลาสสิก ซ้ำร้ายภาพที่มีคนติดป้ายไว้ก็หายาก และของที่เราอยากจับที่สุดคือของที่มีน้อยที่สุดในชุดข้อมูลตามระเบียบ

ทีนี้คำถามสำคัญที่สุด — หลอกมันยากไหม? คำตอบคือ ไม่ต้องไปหลอกตัวภาพ ไปหลอกที่ป้ายชื่อง่ายกว่าเยอะ เพราะเดี๋ยวระบบจะเอา detection จากภาพไปจับคู่กับ AIS ถ้าใครปล่อยสัญญาณ AIS ปลอมให้มีเรือ "ที่มีเหตุผล" ลอยอยู่ตรงนั้นพอดี จุดขาวบนภาพก็จะถูกจับคู่ ถูกอธิบาย แล้วปิดเคสไปเงียบๆ เห้ย คิดดีๆ แล้วน่ากลัวกว่าโดนหลอกตรงๆ อีก งานยากของ Machine Learning ตรงนี้จึงไม่ใช่การเห็นเรือ แต่คือการมองพฤติกรรมย้อนหลัง

ฝั่งพฤติกรรมนี่แหละที่ทำได้โดยไม่ต้องมีภาพสักใบ แค่มีประวัติ track ที่เก็บมาตั้งแต่ตอนที่ 1 ก็ไล่หาช่วงเงียบกับจังหวะนัดเจอกันได้แล้ว

python
KT_TO_MS = 0.514444
GAP_MIN  = 30          # เงียบเกินเท่านี้ถือว่าน่าดู (นาที)
NEAR_M   = 1_000       # ใกล้กันเท่านี้ถือว่าเทียบลำกัน (เมตร)
SLOW_KT  = 2.0         # ช้าระดับนี้คือลอยเทียบกัน ไม่ใช่แล่นสวนกันผ่านไป
STAY_MS  = 20 * 60_000 # ต้องอยู่ด้วยกันนานเท่านี้ถึงจะนับ

def find_gaps(pings):
    """ช่วงที่เรือเงียบ พร้อมวงที่มันไปได้ไกลสุดระหว่างนั้น"""
    for prev, nxt in zip(pings, pings[1:]):
        quiet_s = (nxt.t - prev.t) / 1000
        if quiet_s < GAP_MIN * 60:
            continue
        reach_m = (prev.sog or 0) * KT_TO_MS * quiet_s          # เร็วล่าสุด x เวลาที่หายไป
        moved_m = haversine(prev.lat, prev.lon, nxt.lat, nxt.lon)
        yield {
            "from": prev.t, 
            "to": nxt.t, 
            "reach_m": reach_m,
            "teleport": moved_m > reach_m * 1.2
        }             # โผล่ไกลเกินกว่าที่ความเร็วจะพาไปได้

def find_rendezvous(a, b):
    """สองลำอยู่ติดกันนานๆ ด้วยความเร็วต่ำ — คู่ที่เอามาเทียบใช้ grid ของตอนที่ 3 คัดมาก่อนได้เลย"""
    close = [(pa, pb) for pa, pb in pair_by_time(a, b)
             if haversine(pa.lat, pa.lon, pb.lat, pb.lon) < NEAR_M
             and max(pa.sog or 0, pb.sog or 0) < SLOW_KT]
    if close and close[-1][0].t - close[0][0].t >= STAY_MS:
        return {"pair": (a.mmsi, b.mmsi), "start": close[0][0].t, "end": close[-1][0].t}

กฎที่เลายึดกับทุกโมเดลในงานสายนี้มีข้อเดียว คือ มันต้องคืนค่าความมั่นใจ ไม่ใช่คืนคำตอบ เพราะปลายทางคือใครสักคนต้องตัดสินใจส่งเรือออกไปดูจริงๆ ซึ่งมีต้นทุนทั้งน้ำมัน เวลา และความปลอดภัยของคนบนเรือลำนั้น

Fusion รอบสอง — จับคู่ของที่ไม่มีชื่อ กับของที่มีชื่อ

มาถึงจุดที่ทุกอย่างบรรจบกัน สังเกตไหมว่าทั้ง RF, SAR และ EO ให้ของแบบเดียวกันหมด คือ detection ที่มีพิกัดกับเวลา แต่ไม่มีตัวตน ส่วนของจากสามตอนแรกคือ track ที่มีตัวตนครบ ทั้ง MMSI ชื่อ ปลายทาง งานที่เหลือคือเอาสองกองมาทาบกัน แล้วดูว่าเหลืออะไรที่ทาบไม่ติด

แผนภาพการจับคู่ detection จากดาวเทียมกับ track ที่มีอยู่ ด้านซ้ายเป็นกองหมุด detection จากภาพดาวเทียมที่ในกล่องข้อมูลมีแต่พิกัดกับเวลา ช่องชื่อว่างเปล่า ด้านขวาเป็นกอง track ที่หลอมไว้แล้วจาก AIS และเรดาร์ซึ่งมีชื่อและ MMSI ครบ ตรงกลางแสดงการลากตำแหน่งของ track ไปข้างหน้าจนถึงเวลาที่ดาวเทียมถ่ายภาพ ด้วยลูกศรประยาวพร้อมวงความไม่แน่นอนที่บานใหญ่ขึ้นเรื่อยๆ ตามระยะเวลาที่เหลื่อมกัน และมีวง gate เล็กคงที่ของตอนที่ 3 วาดเทียบไว้ข้างกันให้เห็นความต่างของขนาด ด้านขวาสุดผลลัพธ์แยกเป็นสามกองเรียงลงมา กองที่จับคู่ได้และค่าตรงกัน กองที่จับคู่ได้แต่ค่าขัดกัน และกองที่จับคู่ไม่ได้เลยซึ่งติดป้ายกำกับว่า dark candidate

ขั้นตอนหน้าตาเหมือนตอนที่ 3 เป๊ะ ทั้ง gating ทั้ง association แต่มีสองเรื่องที่ทำให้ลอกโค้ดเดิมมาใช้ตรงๆ ไม่ได้

เรื่องแรก เวลามันเหลื่อมกันหนักมาก ตอนที่ 3 เราเทียบของที่ห่างกันไม่กี่วินาที gate เลยตั้งไว้ 500 เมตรกับ 30 วินาทีก็จบ แต่ภาพดาวเทียมที่เพิ่งได้มาอาจถ่ายไว้เมื่อสี่สิบนาทีก่อน เรือที่วิ่ง 12 นอตไปไกลหลายไมล์แล้ว gate จึงต้องบานตามเวลาที่เหลื่อม ไม่ใช่ค่าคงที่อีกต่อไป

python
BASE_M = 500                 # ค่าเดิมจากตอนที่ 3 ใช้เป็นพื้น
SLOP   = 1.3                 # เผื่อความไม่แน่นอนของความเร็วล่าสุด

def dark_gate_m(track, t_image_ms):
    """gate ที่บานตามเวลาที่เหลื่อมกันระหว่าง track กับเวลาถ่ายภาพ"""
    dt_s = abs(t_image_ms - track.t) / 1000
    return BASE_M + (track.sog or 0) * KT_TO_MS * dt_s * SLOP

พอ gate ใหญ่ขึ้น เป้าที่ตกเข้าวงเดียวกันก็เยอะขึ้นตาม ระยะอย่างเดียวจึงไม่พอ ต้องเอาอย่างอื่นมาถ่วง เช่น ขนาดที่ประมาณจากภาพเทียบกับความยาวเรือที่ AIS ประกาศไว้

เรื่องที่สอง ผลลัพธ์มีสามกอง ไม่ใช่สองกอง อันนี้คือหัวใจของทั้งตอนเลยนะฮะ

  • จับคู่ได้ และค่าไม่ขัดกัน — จบ เรือลำนี้โปร่งใส ปิดเคส
  • จับคู่ได้ แต่ค่าขัดกัน — เช่น ภาพบอกว่าของชิ้นนี้ยาวเป็นร้อยเมตร แต่ AIS ที่ทาบติดบอกว่าเป็นเรือประมงลำเล็ก อันนี้ น่าสนใจกว่ากองที่สาม เสียอีก เพราะแปลว่ามีคนพยายามอธิบายของชิ้นนี้ให้เราฟัง แต่คำอธิบายไม่ตรงกับของที่ตาเห็น
  • จับคู่ไม่ได้เลย — มีของอยู่ตรงนั้นจริง แต่ไม่มีใครในสารบบอ้างสิทธิ์ นี่คือ dark candidate ของแท้ ที่ต้องส่งให้คนไปหาคำตอบ

ตรงนี้ขอย้ำของที่เขียนไว้ตอนที่แล้ว คือ เก็บที่มาของทุกค่าเอาไว้เสมอ เพราะกองที่สองข้างบนจะเกิดไม่ได้ถ้าเราหลอมทุกอย่างเป็นก้อนเดียวจนแยกไม่ออกว่าค่าไหนมาจากใคร ความขัดแย้งจะหายไปเงียบๆ พร้อมกับเคสที่น่าสนใจที่สุด และมันต้องออกแบบกันตั้งแต่ชั้นเก็บข้อมูลข้างล่างสุด

ภาษาฝั่ง Big Data คือของดิบจากทุก sensor — ประโยค AIS, plot เรดาร์, แบริ่ง RF, ภาพดาวเทียม, detection จากโมเดล — ควรไหลลง Data Lake เป็นด่านแรก เก็บตามที่มันเป็น ไม่แปลง ไม่หลอม ไม่ตัดฟิลด์ที่ยังไม่รู้ว่าจะใช้ทำอะไร เพราะนี่คือชั้นเดียวที่ที่มาของทุกค่ายังอยู่ครบ

ถัดขึ้นมาค่อยเป็นชั้นอย่าง Data Fabric ที่ทำให้ข้อมูลหลายแหล่งหลายรูปแบบถูกค้นและเชื่อมกันได้โดยไม่ต้องขนมากองที่เดียว มี catalog กับ lineage กำกับว่าค่านี้มาจาก sensor ตัวไหน ผ่านการคำนวณอะไรมาบ้าง ปลายทางค่อยแตกเป็นสองทาง ทางหนึ่งคือ track ที่หลอมแล้วสำหรับขึ้นจอ อีกทางคือชุดข้อมูลสำหรับเทรนโมเดล ใครจะเรียก Lakehouse ทำเป็น Data Mesh หรือต่อเป็น warehouse/mart ก็ว่าไป

ที่อยากให้ผูกให้แน่นคือ กองที่สองเกิดได้เพราะเรายังย้อนไปดูค่าดิบต้นทางได้ ถ้า pipeline หลอมทิ้งตั้งแต่ปากทางหรือเก็บแต่ผลลัพธ์ ความขัดแย้งจะหายก่อนมีใครทันเห็น แถมโมเดลที่เทรนจากของที่หลอมแล้วก็จะเรียนความผิดพลาดของ fusion ไปด้วย ป้าถึงเก่งกว่าหลายระบบ เพราะป้าจดว่าข่าวไหนได้ยินจากใคร ไม่ได้จำแค่ข้อสรุป

ข้อสุดท้ายเป็นเรื่องจริยธรรมพอๆ กับเทคนิค — "ไม่เจอ" ไม่เท่ากับ "ไม่มี" ตรงไหนที่ดาวเทียมยังไม่ผ่าน คลื่นลมแรงจนภาพใช้ไม่ได้ หรืออยู่นอกระยะเสา RF จอต้องกล้าบอกตรงๆ ว่าพื้นที่นี้เรายังไม่ได้ดู พื้นที่สีขาวโล่งบนจอเฝ้าระวังเป็นคำโกหกที่แนบเนียนที่สุดแล้วอ่ะ

สรุป — dark ไม่ใช่คุณสมบัติของเรือ แต่เป็นคุณสมบัติของช่องว่างเรา

ถ้าจะเก็บกลับบ้านข้อเดียว ผมขอข้อนี้ครับ — คำว่า dark ไม่เคยเป็นคุณสมบัติของเรือ แต่เป็นคุณสมบัติของช่องว่างในระบบเรา เรือลำเดิม พิกัดเดิม วินาทีเดียวกัน อาจ dark สำหรับคนที่มีแค่ AIS แต่สว่างจ้าสำหรับคนที่มีภาพ SAR ในรอบนั้นพอดี คำถามที่ควรถามจึงไม่ใช่ "เรือลำนี้ dark หรือเปล่า" แต่คือ "ตอนนี้ยังมีตรงไหนที่เรามองไม่เห็น และมันมืดอยู่นานแค่ไหน"

และต่อให้มี sensor ที่ปิดปากไม่ได้อย่าง SAR อยู่ในมือ ข้อจำกัดก็ไม่หายไป มันแค่ย้ายที่ — จากเดิมเรือเลือกได้ว่าจะพูดหรือไม่พูด กลายเป็นเลือกได้ว่าจะทำตอนไหนที่ดาวเทียมไม่ได้อยู่บนหัว ของทุกชิ้นในตอนนี้จึงต้องกลับไปลงเอยที่เดิมกับสามตอนแรก คือทาบกับสิ่งที่เรารู้อยู่แล้ว เพราะ detection ที่ไม่มีบริบทก็แค่จุดขาวจุดหนึ่งบนภาพ

แล้วพอระบบชี้เป้าว่า "ลำนี้ไม่ชอบมาพากล" คำถามถัดไปคือ ใครเป็นเจ้าของ เคยทำแบบนี้มาก่อนกี่ครั้ง เชื่อมโยงกับลำไหนบ้าง — ชุดนี้ไม่มี sensor ตัวไหนตอบได้ มันคืองานข่าว

ตอนที่ 5 จะว่าด้วยฝั่ง INT ทั้งหลาย ตั้งแต่ OSINT ที่หาได้จากของเปิด ไปจนถึงการต่อจิ๊กซอว์หลายแหล่งให้เป็นเรื่องเดียวกัน แล้วก็ต้องกลับไปเจอป้าอีกรอบ เพราะสิ่งที่ป้าทำทุกเช้าหน้าปากซอยคือ Intelligence Cycle ของแท้

ปิดท้ายด้วยคำถามที่ผมอยากรู้จริงๆ — ใครเคยเจอเคสที่ระบบขึ้นเตือนว่าผิดปกติ แล้วตามไปดูจริงพบว่าธรรมดาสุดๆ บ้าง หรือกลับกัน เคสที่ทุกอย่างดูเนียนมาก จนมารู้ทีหลังว่าโดนหลอกอยู่หลายเดือน เล่าให้ฟังหน่อย เจอกันตอนหน้าฮะโหม๋