ข้อมูลและสถิติ
UAT 315 ปัญญาประดิษฐ์ การวิเคราะห์ข้อมูล และการมองเห็นด้วยคอมพิวเตอร์สำหรับระบบอากาศยานไร้คนขับ
บทเรียน
เมื่อเรียนจบโมดูลนี้ ผู้เรียนจะสามารถ
- เปรียบเทียบข้อมูลจากกล้อง RGB กล้องความร้อน กล้องหลายช่วงคลื่น และ LiDAR รวมทั้งข้อจำกัดของแต่ละชนิด
- อธิบายว่าภาพคืออาร์เรย์ของตัวเลข และคำนวณดัชนี NDVI จากช่วงคลื่นแดงและอินฟราเรดใกล้
- สร้างคุณลักษณะ (feature) จากข้อมูลดิบ และปรับสเกลข้อมูลก่อนส่งเข้าแบบจำลอง
- อธิบายวงจรข้อมูลของงาน AI ตั้งแต่เก็บข้อมูลจนถึงเฝ้าดูหลังใช้งาน
ทำไมต้องรู้
ปัญญาประดิษฐ์ (AI) ที่ดีที่สุดก็ให้ผลได้ไม่เกินคุณภาพของข้อมูลที่ป้อนเข้าไป โดรนหนึ่งลำอาจติดกล้องหลายชนิด แต่ละชนิดวัดคนละปริมาณ ถ้าไม่รู้ว่าค่าในไฟล์หมายถึงอะไร ผู้พัฒนาอาจสอนแบบจำลองให้ “อ่านอุณหภูมิ” จากภาพสีที่ไม่มีค่าวัดจริงอยู่เลย วิชานี้เริ่มจากข้อมูล เพราะงาน AI ส่วนใหญ่ในสนามจริงใช้เวลากับการเตรียมข้อมูลมากกว่าการเลือกแบบจำลอง
สถิติพื้นฐานที่ใช้ในวิชานี้เรียนแล้วใน UAT 106 ตัวอย่างโค้ดในบทใช้ข้อมูลสังเคราะห์ที่สร้างขึ้นในโค้ดเพื่อการเรียนเท่านั้น
เซนเซอร์หลักบนโดรน
| เซนเซอร์ | วัดอะไร | งานที่เหมาะ | ข้อจำกัดสำคัญ |
|---|---|---|---|
| กล้อง RGB | แสงสีแดง เขียว น้ำเงิน | ตรวจจับวัตถุ ทำแผนที่ | ขึ้นกับแสงและเงา มองไม่เห็นสิ่งที่ถูกบัง |
| กล้องความร้อน | รังสีอินฟราเรดความร้อน | ค้นหาคน ตรวจแผงโซลาร์ | ค่าอุณหภูมิขึ้นกับ emissivity และต้องเป็นกล้องแบบ radiometric |
| กล้องหลายช่วงคลื่น | การสะท้อนแสงหลายช่วง เช่น แดง ขอบแดง NIR | สุขภาพพืช | ต้องปรับเทียบค่าการสะท้อน |
| LiDAR | ระยะทางด้วยพัลส์เลเซอร์ | แบบจำลองความสูง ใต้เรือนยอดไม้ | ข้อมูลใหญ่ ราคาอุปกรณ์สูง |
Emissivity คือความสามารถของพื้นผิวในการแผ่รังสีความร้อน Teledyne FLIR อธิบายว่าพื้นผิวที่มี emissivity ต่ำกว่า 0.5 เช่น โลหะขัดเงา มักวัดอุณหภูมิได้ไม่แม่นยำ เพราะกล้องเห็นความร้อนที่สะท้อนมาจากสิ่งอื่นด้วย ภาพความร้อนที่แสดงเป็นสีจึงไม่ใช่ค่าอุณหภูมิเสมอไป ต้องรู้ว่ากล้องบันทึกค่าวัด (radiometric) หรือไม่ ตามที่หน่วยความรู้ “ข้อจำกัดภาพ RGB และภาพความร้อน” ของคลังความรู้โดรนเตือนไว้
ข้อมูล LiDAR มักเก็บในรูปแบบ LAS ข้อกำหนดของ USGS สำหรับงานแผนที่ระดับชาติกำหนดให้ใช้ LAS รุ่น 1.4 ไฟล์แต่ละจุดเก็บพิกัด x y z ความเข้มสัญญาณ และลำดับการสะท้อน
ภาพคืออาร์เรย์ของตัวเลข
คอมพิวเตอร์เห็นภาพเป็น อาร์เรย์ ของพิกเซล ภาพสีขนาด 120 × 160 จุดมีตัวเลข 120 × 160 × 3 = 57 600 ค่า แต่ละค่ามักเป็นจำนวนเต็ม 8 บิต (0 ถึง 255) ไลบรารีต่างกันอาจเรียงช่องสีต่างกัน เช่น OpenCV เรียงเป็น BGR ไม่ใช่ RGB ถ้าส่งลำดับผิด แบบจำลองจะเห็นสีผิดทั้งภาพ
กล้องหลายช่วงคลื่นให้ภาพแยกทีละช่วงคลื่น NDVI (Normalized Difference Vegetation Index) ที่ Rouse และคณะเสนอในปี 1974 ใช้ความจริงที่ว่าใบพืชสมบูรณ์สะท้อนอินฟราเรดใกล้ (NIR) มากแต่ดูดกลืนแสงแดงมาก ค่าอยู่ระหว่าง −1 ถึง +1
import numpy as np
surfaces = {"healthy crop": (0.50, 0.08), "stressed crop": (0.30, 0.12), "bare soil": (0.25, 0.20), "water": (0.02, 0.05)}
for name, (nir, red) in surfaces.items():
print(f"{name:<14} NIR {nir:.2f} Red {red:.2f} NDVI {(nir - red) / (nir + red):+.3f}")
healthy crop NIR 0.50 Red 0.08 NDVI +0.724
stressed crop NIR 0.30 Red 0.12 NDVI +0.429
bare soil NIR 0.25 Red 0.20 NDVI +0.111
water NIR 0.02 Red 0.05 NDVI -0.429
ค่าการสะท้อนเหล่านี้เป็นตัวเลขสมมติเพื่อฝึกคำนวณ พืชสมบูรณ์ได้ NDVI สูง พืชที่เครียดได้ต่ำลง ดินเปล่าใกล้ศูนย์ และน้ำติดลบ ขั้นต่อไปคือคำนวณทุกพิกเซลพร้อมกันด้วย numpy
nir = np.array([[0.50, 0.48, 0.30, 0.25],
[0.52, 0.45, 0.28, 0.24],
[0.02, 0.03, 0.26, 0.00],
[0.02, 0.02, 0.27, 0.00]])
red = np.array([[0.08, 0.09, 0.12, 0.20],
[0.07, 0.10, 0.13, 0.21],
[0.05, 0.05, 0.19, 0.00],
[0.06, 0.05, 0.20, 0.00]])
total = nir + red
ndvi = np.divide(nir - red, total, out=np.full_like(total, np.nan), where=total > 0)
print(np.round(ndvi, 2))
print("vegetation pixels (NDVI > 0.5):", int(np.sum(ndvi > 0.5)), " no-data pixels:", int(np.isnan(ndvi).sum()))
[[ 0.72 0.68 0.43 0.11]
[ 0.76 0.64 0.37 0.07]
[-0.43 -0.25 0.16 nan]
[-0.5 -0.43 0.15 nan]]
vegetation pixels (NDVI > 0.5): 4 no-data pixels: 2
สองพิกเซลมุมขวาล่างมีค่าเป็นศูนย์ทั้งสองช่วงคลื่น เช่น เป็นพื้นที่นอกภาพ การหารตรง ๆ จะได้ค่าไม่นิยาม np.divide(..., where=...) จึงใส่ nan ให้พิกเซลเหล่านั้นและรายงานแยก แทนที่จะปล่อยให้เป็นศูนย์ซึ่งจะถูกตีความผิดว่าเป็นดิน
ตัวอย่างที่ 1 ความสูงของสิ่งปลูกสร้างจาก LiDAR
กลุ่มจุด LiDAR ให้ค่าความสูง z ของทุกจุด ความสูงเหนือพื้นดินคือค่า z ลบความสูงของพื้น ตัวอย่างนี้ประมาณพื้นดินอย่างง่ายด้วยเปอร์เซ็นไทล์ที่ 5 ของจุดทั้งหมด ซึ่งใช้ได้เฉพาะพื้นที่ราบขนาดเล็ก
rng = np.random.default_rng(345)
ground = rng.normal(12.0, 0.05, 900)
roof = rng.normal(18.5, 0.08, 80)
tree = rng.uniform(13.0, 21.0, 120)
z = np.concatenate([ground, roof, tree])
z_ground = np.percentile(z, 5)
height = z - z_ground
print(f"points {z.size} estimated ground {z_ground:.2f} m")
print(f"points above 2 m: {int(np.sum(height > 2))} highest {height.max():.1f} m above ground")
points 1100 estimated ground 11.92 m
points above 2 m: 182 highest 9.1 m above ground
งานจริงใช้อัลกอริทึมจำแนกจุดพื้นดินที่ซับซ้อนกว่านี้มาก เพราะพื้นที่จริงมีความลาดชัน
คุณลักษณะและการปรับสเกล
คุณลักษณะ (feature) คือตัวเลขที่ป้อนให้แบบจำลอง ข้อมูลดิบจาก log การบินต้องแปลงเป็นคุณลักษณะที่มีความหมายก่อน เช่น ค่า RMS ของการสั่นในหนึ่งวินาที หรือกระแสไฟเฉลี่ยขณะลอยตัว คุณลักษณะต่างชนิดมีหน่วยและขนาดต่างกันมาก การสั่นอาจอยู่ราว 0.1 g ขณะที่กระแสอยู่ราว 20 A แบบจำลองหลายชนิดที่ใช้ระยะทางหรือการไล่ระดับ (gradient) จะให้น้ำหนักกับค่าที่ตัวเลขใหญ่มากเกินไป จึงต้อง ปรับมาตรฐาน (standardise) ให้ทุกคุณลักษณะมีค่าเฉลี่ย 0 และส่วนเบี่ยงเบนมาตรฐาน 1
from sklearn.preprocessing import StandardScaler
features = np.array([[0.11, 17.5], [0.13, 18.2], [0.21, 21.0], [0.12, 18.9], [0.18, 20.4]])
scaler = StandardScaler().fit(features)
print("mean", scaler.mean_.round(3), " sd", scaler.scale_.round(3))
print(scaler.transform(features).round(2))
mean [ 0.15 19.2 ] sd [0.038 1.316]
[[-1.04 -1.29]
[-0.52 -0.76]
[ 1.56 1.37]
[-0.78 -0.23]
[ 0.78 0.91]]
StandardScaler คำนวณส่วนเบี่ยงเบนมาตรฐานแบบหารด้วย (ไม่ใช่ อย่างที่ใช้ใน UAT 106) ซึ่งเหมาะกับการปรับสเกล ค่าเฉลี่ยและส่วนเบี่ยงเบนมาตรฐานที่ใช้ปรับต้องคำนวณจาก ชุดฝึกเท่านั้น แล้วนำไปใช้กับชุดทดสอบ ถ้าคำนวณจากข้อมูลทั้งหมด ข้อมูลของชุดทดสอบจะรั่วเข้าไปในการฝึกโดยไม่รู้ตัว ซึ่งจะเรียนละเอียดในโมดูล 4
วงจรข้อมูลของงาน AI
งาน AI ไม่ได้จบเมื่อฝึกแบบจำลองเสร็จ หลังนำไปใช้ต้องเฝ้าดูว่าผลยังดีอยู่หรือไม่ เพราะสภาพจริงเปลี่ยนได้ เช่น ฤดูกาลเปลี่ยนสีของพืช หรือเปลี่ยนรุ่นกล้อง ปรากฏการณ์ที่ข้อมูลใหม่ต่างจากข้อมูลฝึกเรียกว่า การเลื่อนของข้อมูล (data drift) ทุกขั้นต้องบันทึกที่มาและสิทธิ์การใช้ข้อมูล ตามที่เรียนใน UAT 313 และ UAT 105
กิจกรรมในชั้นเรียน
กิจกรรม: ออกแบบข้อมูลสำหรับภารกิจ
- แบ่งกลุ่ม เลือกภารกิจหนึ่ง เช่น ค้นหาผู้สูญหายในป่า ตรวจแผงโซลาร์ หรือประเมินนาข้าว แล้วเลือกเซนเซอร์ที่เหมาะพร้อมเหตุผลและข้อจำกัด
- เขียนรายการคุณลักษณะที่จะใช้ พร้อมหน่วยและวิธีคำนวณจากข้อมูลดิบ
- อ่านหน่วยความรู้ “ข้อจำกัดภาพ RGB และภาพความร้อน” แล้วเขียนสามคำถามที่ต้องถามผู้ส่งภาพความร้อนก่อนเชื่อค่าอุณหภูมิ
- วาดวงจรข้อมูลของภารกิจที่เลือก ระบุผู้รับผิดชอบและจุดที่ต้องตรวจคุณภาพในแต่ละขั้น
ข้อผิดพลาดที่พบบ่อย
ระวัง
- อ่านอุณหภูมิจากสีของภาพ ที่ไม่มีค่าวัดหรือไม่มีสเกล
- สลับลำดับช่องสี RGB กับ BGR ระหว่างไลบรารี
- ปล่อยให้การหารด้วยศูนย์กลายเป็นค่าปกติ แทนที่จะแยกเป็นข้อมูลที่ไม่มีค่า
- ปรับสเกลด้วยข้อมูลทั้งหมด ทำให้ข้อมูลทดสอบรั่ว
- คิดว่างาน AI จบเมื่อฝึกเสร็จ โดยไม่เฝ้าดูการเลื่อนของข้อมูล
สรุป
- เซนเซอร์แต่ละชนิดวัดคนละปริมาณ ภาพความร้อนต้องรู้ emissivity และต้องเป็นแบบ radiometric จึงอ่านอุณหภูมิได้
- ภาพคืออาร์เรย์ของตัวเลข NDVI คำนวณจาก NIR และแดง และต้องจัดการพิกเซลที่ไม่มีค่าอย่างชัดเจน
- คุณลักษณะต้องมีความหมาย และต้องปรับสเกลด้วยสถิติจากชุดฝึกเท่านั้น
- งาน AI เป็นวงจรที่ต้องเฝ้าดูหลังใช้งานและบันทึกสิทธิ์ข้อมูลทุกขั้น
แบบฝึกตรวจความเข้าใจ
- NIR = 0.40 และ Red = 0.10 มีค่า NDVI เท่าใด
- ภาพสีขนาด 100 × 200 พิกเซล มีตัวเลขกี่ค่า
- ทำไมกล้องความร้อนจึงวัดอุณหภูมิของแผ่นโลหะขัดเงาได้ไม่แม่นยำ
- คุณลักษณะมีค่าเฉลี่ย 20 และส่วนเบี่ยงเบนมาตรฐาน 2 ค่า 23 หลังปรับมาตรฐานเป็นเท่าใด
- จุด LiDAR สูง 31.4 m พื้นดินสูง 12.0 m จุดนี้สูงเหนือพื้นเท่าใด
เฉลย
- ค่า
- โลหะขัดเงามี emissivity ต่ำ กล้องจึงเห็นความร้อนที่สะท้อนจากสิ่งอื่นปนอยู่มาก
- m
สรุปสูตรสำคัญ
| ดัชนีพืชพรรณ NDVI | |
| การปรับมาตรฐาน (standardisation) | |
| ความสูงเหนือพื้นดินจาก LiDAR |
แหล่งอ้างอิงหลัก
- Szeliski, R. (2022). Computer vision: Algorithms and applications (2nd ed.). Springer. link
- Géron, A. (2025). Hands-on machine learning with Scikit-Learn and PyTorch. O'Reilly. link
- U.S. Geological Survey. Landsat normalized difference vegetation index. link
- Rouse, J. W., Haas, R. H., Schell, J. A., & Deering, D. W. (1974). Monitoring vegetation systems in the Great Plains with ERTS. Third ERTS-1 Symposium, NASA. link
- Teledyne FLIR. How does emissivity affect thermal imaging? link
- U.S. Geological Survey. Lidar base specification: Update of LAS reference to R15 (LAS 1.4). link
- scikit-learn developers. Metrics and scoring: Quantifying the quality of predictions (scikit-learn 1.9). link
- OpenCV. OpenCV documentation. link
อ่านเพิ่มเติม
ศึกษาหน่วยความรู้ที่กำหนดล่วงหน้า ดูสื่อประกอบ และทำ quiz ประจำโมดูล
สถิติเชิงพรรณนาและการแจกแจงความน่าจะเป็น
การจัดการและแสดงผลข้อมูลด้วย Python
ข้อจำกัดภาพ RGB และภาพความร้อน
ในชั้นเรียน / ภาคสนาม
บรรยาย อภิปรายกรณีศึกษา และแก้โจทย์ในชั้นเรียน
หลักฐานการเรียนรู้: ผล quiz และแบบฝึกหัดที่ส่ง