# AI ตรวจขยะจากภาพโดรน: อ่านผลทดลอง 3 และ 30 epochs

อัปเดต 29 กันยายน 2026 — **ทำซ้ำกระบวนการเรียนรู้บนคอมพิวเตอร์ได้ แต่โมเดลยังตรวจจับได้ไม่ดีพอใช้งาน** และยังไม่ได้ทดสอบกับโดรนจริง

การทดลองนี้ใช้ภาพเดิม 12 ภาพจาก UAVVaste: train 8 ภาพ (21 วัตถุ) และ validation 4 ภาพ (33 วัตถุ) เริ่มจาก pretrained YOLO11n เดิม ใช้ seed=42, ขนาด 320, batch=4 และ AdamW เหมือนกัน เปรียบเทียบ 3 กับ 30 epochs เท่านั้น จำนวน epochs ทำให้ระยะของ learning-rate schedule เปลี่ยนด้วย จึงไม่ใช่การทดลองที่เปลี่ยนจำนวนรอบอย่างเดียวโดยรักษา learning rate ทุกก้าวไว้เท่ากัน

| ผลจาก last checkpoint | 3 epochs | 30 epochs |
|---|---:|---:|
| Train mAP50 (ช่วง 0–1) | 0 | 0.01335 |
| Validation mAP50 (ช่วง 0–1) | 0 | 0.00456 |
| กล่องตรวจพบที่ confidence ≥0.25 รวม 12 ภาพ | 0 | 0 |
| เวลารวมฝึกและตรวจผล (วินาที) | 25.916 | 141.565 |

**Loss ลดลงไม่ได้แปลว่าโมเดลพร้อมใช้** หลัง 30 epochs กล่องดิบระบุตำแหน่งดีขึ้นบ้าง แต่คะแนน confidence สูงสุดยังต่ำกว่า 0.019 และไม่มีผลตรวจจับที่เกณฑ์ 0.25 เลย รวมถึงภาพที่ใช้ฝึก

การคำนวณ AP ของไลบรารีใช้กล่องผู้สมัครตั้งแต่ confidence 0.001 แล้วสรุปตามลำดับคะแนนและการทับซ้อน ส่วนการนับกล่องข้างต้นใช้เกณฑ์ 0.25 คงที่ ตัวเลขทั้งสองจึงตอบคนละคำถาม เราไม่ได้ลดเกณฑ์ตรวจจับเพื่อทำให้ดูเหมือนผ่าน

พบข้อจำกัดที่ควรศึกษา: หลังย่อภาพ 3840×2160 เป็นเนื้อภาพ 320×180 ภายในกรอบ 320×320 วัตถุ validation 16 จาก 33 ชิ้นมีด้านสั้นน้อยกว่า 4 พิกเซล (เล็กสุด 1.25 พิกเซล) ตรวจ hash ของภาพ/label, class, พิกัด และจำนวนกล่องแล้วผ่านครบ และเทียบการแปลง COCO → YOLO กับต้นฉบับครบ 54 กล่องแล้ว ความต่างอยู่ในระดับการปัดเศษ

## ไฟล์ที่ใช้

- [ตัวเปิด sandbox](uav-readiness-launch.sh) และ [สคริปต์ฝึก/ประเมิน](uav-readiness-run.py): บันทึกทั้งสองไฟล์ไว้ในโฟลเดอร์เดียวกัน
- [รายการภาพ/label และ SHA-256](uav-training-manifest.json): ต้องวางข้างสคริปต์ โดยใช้ชื่อ `uav-training-manifest.json`
- [ผล 3 รอบ](uav-readiness-3-result.json), [ผล 30 รอบ](uav-readiness-30-result.json): ค่าตรวจจริง รายการ hash และ sandbox
- [CSV 3 รอบ](uav-readiness-3-epochs.csv), [CSV 30 รอบ](uav-readiness-30-epochs.csv): loss และ metric ราย epoch
- [กราฟ 3 รอบ](uav-readiness-3-curves.png), [กราฟ 30 รอบ](uav-readiness-30-curves.png): กราฟจากผลจริง (แกน AP 0–1)

เริ่มจาก [คู่มือเตรียมข้อมูลและ dependencies เดิม](uav-training-guide-th.md) ซึ่งลิงก์ไปยังสคริปต์เตรียมข้อมูลและแหล่งภาพต้นทาง ก่อนใช้คำสั่งด้านล่าง

![ผลฝึก 30 epochs](uav-readiness-30-curves.png)

## ทำซ้ำบน Linux หรือ WSL ที่เตรียมไว้แล้ว

ต้องมี dataset ที่เตรียมจาก manifest เดิม, pretrained `yolo11n.pt`, virtual environment ที่มี dependencies และเครื่องมือ namespace/timeout/taskset/prlimit/setpriv อยู่แล้ว สคริปต์นี้ไม่ติดตั้งและไม่ดาวน์โหลดสิ่งใด ไม่รวม weights หรือภาพต้นฉบับในชุดผลทดลองนี้

เวอร์ชันที่ใช้จริง: Python 3.12.3, torch 2.14.0+cpu, ultralytics 8.4.144, numpy 2.5.2, OpenCV 5.0.0

```bash
bash uav-readiness-launch.sh /absolute/dataset /absolute/yolo11n.pt /absolute/venv 3 > run-3.log 2>&1
bash uav-readiness-launch.sh /absolute/dataset /absolute/yolo11n.pt /absolute/venv 30 > run-30.log 2>&1
```

รันทีละคำสั่งและดู exit code ต้องเป็น 0 หลักฐานอยู่ระหว่าง `EVIDENCE_JSON_BEGIN`/`EVIDENCE_JSON_END` และ CSV อยู่ระหว่าง `EPOCH_CSV_BEGIN`/`EPOCH_CSV_END` หากโปรแกรมหยุดจาก hash หรือ sandbox ไม่ผ่าน อย่าข้ามการตรวจนั้นไปฝึกต่อ

แต่ละรันจำกัด 600 วินาที, 2 CPU, address space ต่อ process 6 GiB, scratch tmpfs 2 GiB, ขนาดไฟล์สูงสุด 128 MiB และปิดเครือข่ายภายนอก ใช้ input/toolchain แบบอ่านอย่างเดียวและ environment ใหม่ที่ไม่มี credential ของผู้ใช้

## วิธีใช้เป็นแบบฝึกหัด

1. เทียบค่า loss กับจำนวนกล่องที่ confidence 0.25 อธิบายว่าทำไม loss ลดแต่ยังตรวจไม่พบ
2. เปิด JSON ดู `raw_max_class_score` และ `raw_best_iou_per_gt` ค่านี้ใช้วิเคราะห์กล่องดิบทั้งหมด ไม่ใช่ recall หรือผลตรวจจับจริง
3. ดู `pixels320_wh` แล้วนับวัตถุที่เล็กกว่า 4 พิกเซล อภิปรายผลของการย่อภาพ
4. เสนอการทดลองถัดไปโดยเปลี่ยนทีละปัจจัย เช่น ความละเอียดหรือการ crop ระบุสมมติฐาน/เกณฑ์/งบก่อนรัน ชุดนี้หยุดหลังสองรันที่กำหนดไว้ ไม่ค้นหา hyperparameter เพิ่ม

ภาพ validation ถูกใช้ดูผลและเลือกประเด็นวิเคราะห์แล้ว จึงเป็น **development validation ไม่ใช่ test set ที่ไม่เคยเห็น** การอ้างความแม่นยำใช้งานต้องมีข้อมูลที่หลากหลายและ test set ใหม่ซึ่งแยกฉากชัดเจน การทดลองนี้ไม่ยืนยันประสิทธิภาพบนอุปกรณ์ขอบเครือข่ายหรือความพร้อมบิน

แหล่งข้อมูล: [UAVVaste — Zenodo](https://zenodo.org/records/8214061), CC BY 4.0 โดย Marek Kraft, Mateusz Piechocki, Bartosz Ptak, Krzysztof Walas; [รูปแบบ label](https://docs.ultralytics.com/datasets/detect), [การฝึก Ultralytics](https://docs.ultralytics.com/modes/train) เอกสารออนไลน์อาจกล่าวถึงรุ่นใหม่กว่า การทดลองนี้ใช้เวอร์ชันที่บันทึกด้านบน
