ด้วยความมันส์มือกับคุณคล็อดเอไอผู้ช่วยที่สามารถสร้างโค้ดภาษารัสท์ได้เร็ว ผมเลยสานต่อปรับปรุงโปรแกรมอรรถประโยชน์โพคัท (POCUT) ในตอนนี้สามารถวิว point cloud แบบ 3D ด้วยการบินดูแบบ Fly through สามารถปรับความเร็วในการบินได้ สามารถวัดระยะทางความสูงแบบพื้นฐานได้ และที่สำคัญคือมันเร็วครับ ไม่มีกระตุก นี่เป็นอานิสงส์ของภาษารัสท์ที่สร้างโค้ดรันได้เร็ว
3D Viewer
ปัญหาของโปรแกรมด้าน point cloud ที่ผมเจอคือไม่สามารถเดินดูหรือบินดู point cloud ได้อย่างอิสระ ทำให้เซอร์เวย์ที่ไปสำรวจมาก็อยากจะดูผลงานแบบ 3D ได้ง่ายๆ เจ้าของงานก็อยากดูอะไรที่มันง่ายๆเหมือนกัน
แรงบันดาลใจของผมคือโพทรี (Potree) ที่สามารถรันบนเวบหรือจากโปรแกรมเดสทอปได้ ปัญหาของโพทรีที่ผมเจอคือการเดินดูหรือบินดู ไม่สามารถทำได้ง่ายนัก ทั้งๆที่ปัญหานั้นไม่ใช่เรื่องใหญ่คือถ้าจะใช้เมาส์ซูมเข้าออก ดึงไปข้างหน้าและใช้คีย์บอร์ดไปพร้อมๆกันได้ ก็เหมือนคนที่เล่นเกมส์ 3D ในมุมมองบุคคลที่หนึ่งอย่างนั้นเลย น่าเสียดายครับทั้งๆที่ความเร็วของการแสดงผลของโพทรีอยู่ในขั้นที่เร็วแรง แต่ไม่สามารถเลือกสองอย่างพร้อมกันได้
ต่อไปผมจะกล่าวถึงสิ่งที่จะทำให้โพทรีและโพคัท สามารถแสดงผลได้เร็ว โพทรีใช้ octree ส่วนโพคัทใช้ COPC (Cloud Optimised Point Cloud) เวลาใช้งานโพทรีจะแปลงไฟล์เป็น octree ทันทีแบบไม่ต้องถาม ส่วนโพคัทถ้าอยากแสดงผล 3D จะต้องมีการสร้าง COPC
octree กับ COPC ต่างกันอย่างไร
เป็นคนละประเภทของสิ่งกัน และตรงนี้มักสับสนกัน octree คือโครงสร้างข้อมูล (data structure) เป็นแนวคิด คือเอาลูกบาศก์หนึ่งลูกมาแบ่งเป็นแปดส่วน แล้วแบ่งแต่ละส่วนออกเป็นแปดอีก ทำไปเรื่อย ๆ จนกว่าช่องจะเล็กพอ แนวคิดนี้ไม่เกี่ยวกับไฟล์เลย CloudCompare ใช้ octree ในหน่วยความจำเพื่อวาดภาพให้เร็ว ส่วนในเกมส์ใช้ตรวจการชนกันของวัตถุ PotreeConverter ก็สร้าง octree ลงดิสก์ในแบบของตัวเอง แต่ละโปรแกรมออกแบบวิธีจัดเก็บของตัวเองทั้งนั้น
COPC คือรูปแบบไฟล์ (file format) เป็นข้อกำหนดที่ระบุชัดเจนว่า จะเก็บ octree แบบหนึ่ง ไว้ภายในไฟล์ LAZ มาตรฐาน อย่างไร เพื่อให้โปรแกรมใดก็ตามหามันเจอได้เอง โดยไม่ต้องมีใครบอก
| octree | COPC | |
|---|---|---|
| คืออะไร | วิธีแบ่งปริภูมิ | รูปแบบการจัดวางไฟล์ |
| อยู่ที่ไหน | ปกติอยู่ในหน่วยความจำ | อยู่บนดิสก์ ในไฟล์ .copc.laz |
| เป็นมาตรฐานหรือไม่ | ไม่ | ใช่ มีข้อกำหนดที่เผยแพร่ไว้ |
| โปรแกรมอื่นอ่านได้ไหม | เฉพาะโปรแกรมที่สร้างมันขึ้นมา | โปรแกรมอ่าน LAS/LAZ ใด ๆ ก็ได้ |
สรุปสั้น ๆ octree คือวิธีจัดเรียงจุด ส่วน COPC คือข้อตกลงว่าจะบันทึกการจัดเรียงนั้นลงไฟล์อย่างไร COPC คือไฟล์ LAZ ธรรมดาที่จุดถูกจัดระเบียบเป็น octree แล้ว พร้อมแผนที่ในส่วนหัวบอกว่าอะไรอยู่ตรงไหน โปรแกรมที่เข้าใจมันจะอ่านเฉพาะส่วนที่ต้องการได้ ส่วนโปรแกรมที่ไม่เข้าใจก็ยังเปิดไฟล์ได้ตามปกติ
LAS, LAZ และ COPC คืออะไร
LAS คือรายการจุดที่เรียงต่อกันแบบแบน ๆ มีส่วนหัว (header) แล้วตามด้วยจุดทีละจุด ตามลำดับที่เครื่องสแกนหรือขั้นตอนรวมไฟล์เขียนออกมา รูปแบบนี้เรียบง่ายและใช้กันทั่วไป แต่ ลำดับของจุดไม่ได้บอกตำแหน่ง จุดสองจุดที่อยู่ติดกันในไฟล์ อาจอยู่ห่างกันเป็นกิโลเมตรบนพื้นที่จริง
LAZ คือไฟล์เดียวกันที่บีบอัดแล้ว โดยทั่วไปเล็กลงราว 4 เท่า ไม่ใช่ฟอร์แมตใหม่ เป็นเพียง LAS ที่ถูกบีบอัดไว้ สิ่งที่หลายคนไม่คาดคิดคือ การเขียน LAZ เร็วกว่าการเขียน LAS เพราะการบีบอัดลดจำนวนไบต์ที่ต้องเขียนลงมากกว่าเวลาที่เสียไปกับการคำนวณ จากงานจริงขนาด 15.7 GB เขียนเป็น LAZ ใช้เวลา 18.6 วินาที ได้ไฟล์ 3.6 GB ส่วน LAS ใช้ 20.2 วินาที ได้ไฟล์ 15.0 GB
ปัญหาจริง ๆ อยู่ที่ลำดับของจุด ไม่ใช่ขนาดไฟล์ เวลาโปรแกรมเปิดกลุ่มจุด 270 ล้านจุดเพื่อแสดงภาพรวมทั้งพื้นที่ มันไม่ได้ต้องการจุดครบ 270 ล้านจุด เพียงไม่กี่ล้านจุดก็ให้ภาพที่ตาเราแยกไม่ออกแล้ว แต่ในไฟล์ LAS หรือ LAZ ธรรมดา โปรแกรมไม่มีทางหยิบ “ไม่กี่ล้านจุดที่กระจายทั่วพื้นที่” ออกมาได้ โดยไม่อ่านทั้งหมดก่อน
COPC (Cloud Optimised Point Cloud) แก้ที่ลำดับของจุด โดยจัดเรียงจุดใหม่เป็นโครงสร้าง octree คือมีชั้นหยาบที่ครอบคลุมทั้งพื้นที่ แล้วไล่ละเอียดขึ้นเป็นชั้น ๆ พร้อมดัชนี (index) ที่บอกว่าแต่ละ node อยู่ตรงไหนในไฟล์ ข้อสำคัญคือ ไฟล์ COPC ยังเป็นไฟล์ LAZ 1.4 ที่ถูกต้องสมบูรณ์ โปรแกรมที่ไม่รู้จัก COPC ก็ยังเปิดได้ตามปกติ
ผลการทดสอบการอ่านไฟล์ COPC
ผลที่ได้ วัดจากกลุ่มจุด 269,884,607 จุด
| สิ่งที่ขอ | จำนวนจุด | เวลา |
|---|---|---|
| ภาพรวมหยาบที่สุด | 10,319 | 0.01 วินาที |
| level 0–4 | 5,931,901 | 0.18 วินาที |
| level 0–5 | 23,577,332 | 0.58 วินาที |
| ทั้งไฟล์ อ่านเรียงตามลำดับ | 269,884,607 | 8.1 วินาที |
โปรแกรมที่เดินตามโครงสร้าง octree ได้ภาพของทั้งพื้นที่จาก 5.9 ล้านจุด ใน ไม่ถึงหนึ่งในห้าวินาที
และตรงนี้คือส่วนที่น่าสนใจที่สุด Global Mapper ใช้เวลาราว 9 นาที ในการเปิดไฟล์นี้ พอทำ index แล้วเปิดไฟล์เดิมเหลือ 2:09 นาที เร็วขึ้น 4.2 เท่า — ผลลัพธ์ดี แต่ นั่นไม่ใช่ผลจากการใช้ index Global Mapper ยังคงอ่านจุดครบทั้ง 270 ล้านจุดเหมือนเดิม เพียงแต่เร็วขึ้นเพราะการทำ index ทำให้จุดถูกเรียงตามตำแหน่งแล้ว ไม่กระจัดกระจาย ถ้าโปรแกรมใช้โครงสร้าง octree จริง ๆ จะวาดภาพพื้นที่ได้ใน 0.18 วินาที เร็วกว่า 129 วินาทีถึง 700 เท่า
จุดไม่ถูกแตะต้อง ค่าพิกัดเท่าเดิม class เท่าเดิม จำนวนจุดเท่าเดิม เปลี่ยนเฉพาะลำดับและดัชนีเท่านั้น
ต้นทุน คือเวลาที่ใช้ทำ และไฟล์ที่ใหญ่ขึ้นเล็กน้อย งานจริงงานหนึ่งเปลี่ยนไฟล์ LAZ ขนาด 16.7 GB เป็น COPC ขนาด 18.66 GB มี 145,835 node ใน 11 ระดับ จ่ายครั้งเดียว แล้วการเปิดไฟล์ทุกครั้งหลังจากนั้นถูกลงหมด
การนำไปใช้
ควรใช้เมื่อไร กับไฟล์ที่ต้องเปิดบ่อย ๆ ต้องดูแบบ 3 มิติ หรือต้องส่งผ่านเครือข่าย ไม่จำเป็นเมื่อไร กับงานที่แปลงรอบเดียวจบ ถ้าเพียงปรับค่าระดับหรือแปลงระบบพิกัดแล้วเก็บไฟล์ จุดถูกอ่านครั้งเดียวอยู่แล้ว การทำ index จึงไม่ได้อะไรเพิ่ม
ดาวน์โหลดและติดตั้งโพคัทรุ่นล่าสุด
เข้าไปในบล็อกผมแล้วดาวน์โหลดตามลิ๊งค์นี้ ในขณะที่เขียนบทความนี้เป็นรุ่น 1.0.1.122

การสร้าง COPC
เพื่อท่องวิวสามมิติให้เร็วแรงแบบทะลุนรก จะต้องสร้างไฟล์ COPC กันก่อน ผมมีตัวอย่างไฟล์ poin cloud ชื่อ “Dumpsite_merged.laz” เปิดไฟล์ขึ้นมา โปรแกรมจะเสนอชื่อไฟล์ COPC ให้อัตโนมัติ

| รายการ | ค่า |
|---|---|
| จำนวนจุด | 138,732,924 |
| octree | 10,125 node, ลึก 9 ระดับ, span 128 |
| ระยะห่าง (spacing) | 20.358 ม. ที่ระดับราก ลดลงครึ่งหนึ่งทุกระดับจนถึง 0.0795 ม. |
| chunk | 10,125 (ใหญ่สุด 123,940 จุด เฉลี่ย 13,702 จุด) |
| ขนาดไฟล์ | 1.68 GB (ไฟล์ต้นทาง 1.56 GB) |
| เวลาที่ใช้ | 33.5 วินาที (4.14 ล้านจุด/วินาที, 24 threads) |
ไฟล์ 138 ล้านจุดใช้เวลาสร้างไฟล์ COPC เพียงแค่ 33.5 วินาที ก็เร็วได้น่าพอใจ จริงๆใจผมตั้งเป้า 10 ล้านจุดต่อวินาที
เปิดไฟล์ COPC ใน 3D Viewer
เปิดไฟล์ “Dumpsite_merged.copc.laz” โปรแกรมโพคัทเรนเดอร์จุดให้แบบไม่ต้องเร็วไม่ต้องรอ

ทดสอบความเร็ว
ก่อนจะพาบินไปดู point cloud ผมจะทำ speed test ก่อน คลิกที่ปุ่ม “Speedtest” รอไม่กี่วินาทีการทดสอบจะเสร็จพร้อมแสดงค่าออกมาให้ทราบ

ในขณะเดียวกันผมก็ไปทดสอบใน Cloudcompare (CC) เปิดไฟล์ COPC แต่พบว่า CC ไม่ได้ใช้งานรูปแบบนี้แต่อย่างใดเพราะการทดสอบ 3D เรนเดอร์ได้ช้ามาก ต่อมาใน CC ผมสร้าง octree ให้แล้วทำการทดสอบอีกครั้งพบว่าเร็วขึ้นมามากแบบเทียบกันไม่ได้
| การทดสอบ | fps | สิ่งที่วาดจริง |
|---|---|---|
| CloudCompare (ครั้งที่ 1) | 1.280 | จุดทั้งหมด 138.7 ล้านจุด |
| CloudCompare (ครั้งที่ 2) | 0.393 | จุดทั้งหมด 138.7 ล้านจุด |
| CloudCompare (หลัง ResampleWithOctree) | 91.636 | ชุดจุดที่ถูกลดจำนวนลงแล้ว |
| Pocut | 137.4 | เฉลี่ย 0.2 ล้านจุด เลือก level ให้เหมาะกับมุมมองในแต่ละเฟรม |
Dumpsite_merged.copc.laz จำนวน 138,732,924 จุด บนเครื่องเดียวกัน · Pocut วัดที่ความละเอียดหน้าต่าง 2464×1003, budget 6.0 ล้านจุด, point size 2 px, เปิด EDL · ตัวเลข fps ของ CloudCompare มาจาก log ของโปรแกรมเองความเร็วของ CC ที่ 91.6 fps ส่วนโพคัทที่ 137.4 fps ก็ถือว่าเร็วทั้งคู่แต่โพคัทเฉือนไปนิดหน่อย ลองดูคลิปที่อัดไว้ ใช้วิธี Fly through โดยใช้คีย์บอร์ดแบบเล่นเกมส์ WASD คู่กับเมาส์บังคับทิศทาง
การวัดระยะทาง
ตอนนี้ฟีเจอร์นี้ถือว่าเป็นอาหารเสริมเล็กน้อย สามารถวัดเป็นจุด ความสูงและระยะทางได้ ก็พอกล้อมแกล้มยังไม่ได้เน้นด้านนี้มากนัก วิธีใช้งานกดคีย์ M ไปมาจะสลับวัดจุด วัดระยะทาง วัดความสูง

ก้าวต่อไป
ลำดับต่อไปคือ classify ground ถือว่ายากระดับหิน จนคุณคล็อดเอไอต้องร้องขอชีวิตขอทำอย่างอื่นก่อน ในเบื้องต้นผมให้เขาอิมพลีเมนต์วิธีการของ Cloth Simulation Filter (CSF) คือการจำแนกจุดพื้นดินด้วยวิธี Cloth Simulation Filter (CSF) ซึ่งมีหลักการที่เข้าใจง่ายมาก คือพลิกกลุ่มจุดกลับหัว แล้วปล่อยผืนผ้าแข็ง ๆ ลงมาคลุมจากด้านบน ผืนผ้าจะไปวางตัวอยู่บนจุดที่ต่ำที่สุดของกลุ่มจุด (เมื่อมองกลับด้านปกติ) และแข็งพอที่จะทอดข้ามอาคารหรือต้นไม้ที่ไม่มีจุดพื้นดินอยู่ข้างใต้ จุดใดที่อยู่ห่างจากผืนผ้าไม่เกินค่าที่กำหนดไว้ ก็ถือว่าเป็นจุดพื้นดิน
สิ่งที่ตั้งใจไว้ตั้งแต่ต้นคือ จะไม่มีการย้ายหรือลบจุดใดเลย เปลี่ยนเฉพาะค่า class เท่านั้น ผลการจำแนกอาคารหรือสิ่งปลูกสร้างที่ทำไว้ก่อนหน้าจึงยังอยู่ครบ ตอนนี้ใช้งานได้แล้วทั้งทางบรรทัดคำสั่งและผ่านแท็บ Classify Ground ในหน้าต่างโปรแกรม เหลือเพียงการตรวจสอบผลลัพธ์เทียบกับ CloudCompare ให้ครบถ้วน แล้วจะปล่อยให้ใช้งานในรุ่นถัดไป
วิธี Cloth Simulation Filter มาจากงานวิจัยของ Zhang และคณะ (Remote Sensing, 2016, 8(6), 501) โดยทีมจาก Beijing Normal University ส่วนโค้ดอ้างอิงเผยแพร่ภายใต้สัญญาอนุญาต Apache 2.0

อีกอันที่ลืมไม่ได้คือ รูปแบบไฟล์ COPC (Cloud Optimized Point Cloud) ออกแบบโดย Andrew Bell, Howard Butler และ Connor Manning จาก Hobu, Inc. ในปี 2021 รายละเอียดข้อกำหนดอยู่ที่ https://copc.io — Pocut เขียนขึ้นตามข้อกำหนดนี้เอง ไม่ได้นำโค้ดของผู้ใดมาใช้แต่อย่างใด
โปรดติตดามตอนต่อไปครับ พบกับ Classify ground