# ฝึก YOLO กับภาพ UAV จริง: การทดสอบกระบวนการขนาดเล็ก

ตรวจเมื่อ 28 กันยายน 2026: ฝึกจริง 3 epochs, บันทึกและโหลด checkpoint ใหม่, ตรวจ validation และส่งออก ONNX สำเร็จ แต่ precision, recall, mAP50 และ mAP50–95 เท่ากับ **0** ทั้งหมด จึงยังไม่ใช่โมเดลตรวจขยะที่ใช้งานได้ ไม่ใช่ accuracy benchmark และยังไม่ผ่านการทดสอบบนโดรนหรืออุปกรณ์ Edge

## สิ่งที่รันจริง

- UAVVaste: train 8 ภาพจาก BATCH_d07 (21 boxes), validation 4 ภาพจาก BATCH_d06 (33 boxes) แยก batch ก่อนฝึก ไม่มีภาพซ้ำข้าม split แต่ยังไม่พิสูจน์ว่าเป็นคนละพื้นที่บิน
- YOLO11n pretrained COCO 80 classes เปลี่ยนหัวตรวจจับเป็น `rubbish` 1 class ไม่ได้ฝึกจากศูนย์
- CPU, image size 320, batch 4, workers 0, seed 42, deterministic=True, cache=False, amp=False, AdamW, lr0=0.001, 3 epochs
- เปลี่ยนค่าจริง 250 จาก 255 trainable tensors; first convolution เปลี่ยนสูงสุด 0.0039159656 จึงไม่ได้ตรวจเพียงขนาดไฟล์ checkpoint
- เวลา epochs รวม 13.2651 วินาที; สคริปต์รวม validation/export/parity 19.219 วินาที ในเครื่องทดสอบนี้ ไม่ใช่การรับรองความเร็วเครื่องอื่น
- Validation ทั้ง 4 ภาพมี detections ที่ confidence 0.25 จำนวน 0 จึงเปรียบเทียบ **raw outputs** shape `[1,5,2100]` ระหว่าง PyTorch และ ONNX แทนการนับ empty detections ว่าเท่ากัน: coordinate ต่างสูงสุด 0.00366211 pixels และ score ต่างสูงสุด 9.43e-8 ผ่านเกณฑ์ 0.01 pixels / 1e-5

## ดาวน์โหลดประกอบ

- `uav-training-result-2026-09-28.json`: เวอร์ชัน, settings, SHA-256, metrics และ parity รายภาพ
- `uav-training-epochs.csv`: train/validation losses จริงครบ 3 epochs; loss ไม่ใช่ validation accuracy
- `uav-training-manifest.json`: รายชื่อภาพ, split, hashes, attribution และ labels ที่แปลงเป็น YOLO แล้ว
- `uav-training-prepare.py`, `uav-training-run.py`, `uav-training-launch.sh`: เตรียม subset และฝึกแบบ offline

## แหล่งข้อมูลและสิทธิ์

UAVVaste โดย Marek Kraft, Mateusz Piechocki, Bartosz Ptak และ Krzysztof Walas ใช้ [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/). แหล่งผู้สร้างคือ [Zenodo record 8214061](https://zenodo.org/records/8214061). เลือก 12 ภาพต้นฉบับ ไม่แก้ภาพ; แปลง COCO XYWH เป็น normalized YOLO center XYWH. Annotations มาจาก [revision 6bd491d5945687550f9a2814a5e3418146fa3dc0](https://github.com/PUTvision/UAVVaste/blob/6bd491d5945687550f9a2814a5e3418146fa3dc0/annotations/annotations.json), SHA-256 `2779d40ea98db05d9fb0ea6b0cdbf181a441ce663cf7b81653c81f2f0ef8b403`.

การรันจริงใช้ HTTP Range อ่านเฉพาะสมาชิกใน author ZIP ประมาณ 64.6 MB หลัง Flickr ตอบ 429; ไม่ retry Flickr และไม่ได้ใช้ภาพสังเคราะห์ ไม่มีการแจกภาพหรือ weights ในชุดดาวน์โหลดนี้

## ทำซ้ำใน Linux / WSL Ubuntu

ต้องมี Python environment และ official YOLO11n pretrained weights ที่ดาวน์โหลดและตรวจที่มาก่อนเริ่ม สคริปต์ไม่ติดตั้ง dependencies และไม่ดาวน์โหลดอัตโนมัติ ตรวจ SHA-256 ของ weights กับ `pretrained_sha256` ในผล JSON. ใช้เฉพาะ checkpoint จากแหล่งที่เชื่อถือได้

เวอร์ชันที่ทดสอบ: Python 3.12.3, Ultralytics 8.4.144, PyTorch 2.14.0+cpu, ONNX 1.22.0, ONNX Runtime 1.29.0, OpenCV 5.0.0, NumPy 2.5.2. คู่มืออาร์กิวเมนต์จาก [Ultralytics train](https://docs.ultralytics.com/modes/train/) และ [export](https://docs.ultralytics.com/modes/export/); หน้า docs ปัจจุบันอาจต่างจากเวอร์ชันนี้

1. รับ `UAVVasteDataset.zip` จาก Zenodo ผู้สร้างด้วยตนเอง (archive เต็ม 3,010,727,259 bytes; ไม่ใช่ไฟล์เล็ก) หรือใช้ subset เดิมที่มี hashes ตรง manifest. ขั้นตอนนี้แยกจากการฝึก offline
2. วางไฟล์สคริปต์และ manifest ไว้ด้วยกัน แล้วรัน:

```bash
python3 uav-training-prepare.py /path/UAVVasteDataset.zip /path/new-dataset
bash uav-training-launch.sh /path/new-dataset /path/yolo11n.pt /path/venv > run.log 2>&1
```

Wrapper รองรับ Ubuntu layout ที่มี `/usr`, util-linux, GNU coreutils และ DejaVu Sans พร้อม unprivileged user/mount/network namespaces. จะหยุดหาก sandbox ใช้งานไม่ได้; อย่าแก้ด้วยการรัน root หรือข้าม sandbox. Public wrapper ปรับ paths ให้รับอาร์กิวเมนต์และผ่าน syntax check; การฝึกที่เป็นหลักฐานใช้ private wrapper ภายใต้ controls เดียวกัน ไม่ได้อ้างว่าทดสอบ wrapper นี้บนทุกเครื่อง

ทรัพยากรที่บังคับ: CPU affinity 0,1; address-space ต่อ process 6 GiB (ไม่ใช่ aggregate RAM cgroup); CPU time 840 s; wall timeout 900 s และ grace kill 10 s; scratch tmpfs 2 GiB; file size 128 MiB; nproc 512 (นับตาม UID รวม threads จึงไม่ใช่ quota เฉพาะงาน); open files 256. แยก network/PID/user namespaces, drop capabilities, environment allowlist, อ่าน dataset/toolchain แบบ read-only และไม่เปิด GPU/กล้อง/อุปกรณ์โดรน

อ่านผลระหว่าง `EVIDENCE_JSON_BEGIN` / `EVIDENCE_JSON_END` และ CSV ระหว่าง `EPOCH_CSV_BEGIN` / `EPOCH_CSV_END` ใน log. Checkpoint กับ ONNX ถูกสร้างและโหลดตรวจใน scratch แล้วหายเมื่อจบงานโดยตั้งใจ; ผลนี้จึงเป็นหลักฐาน workflow ไม่ใช่การแจกโมเดลพร้อมใช้งาน. ในการรันซ้ำ runtime/checkpoint hashes อาจเปลี่ยนได้ แม้ fix seed

หลังการรันที่บันทึกผล ได้เพิ่ม guard ให้ตรวจ label SHA-256 กับ manifest ก่อนฝึก โดยตรวจผ่านกับ labels ทั้ง 12 ไฟล์และตรวจว่า fixture ที่แก้ข้อมูลถูกปฏิเสธ ไม่ได้ฝึกใหม่หลังเพิ่ม guard นี้; ผลการฝึกเดิมตรวจ image hashes และ before/after hashes ของภาพกับ labels แล้ว

## ขอบเขตที่ยังไม่ผ่าน

12 ภาพและ 3 epochs น้อยเกินประเมินความแม่นยำ; วัตถุเล็กหลังย่อภาพเป็น 320 อาจตรวจยาก. ต้องมีข้อมูลและ test split ที่เหมาะสม, ตรวจ false positives/negatives, latency/thermal/memory บนอุปกรณ์จริง และทดสอบการใช้งานอย่างปลอดภัยก่อนนำไปบิน. ไม่ได้เปลี่ยนข้อมูลหรือเพิ่มรอบฝึกเพื่อเลือกตัวเลขที่ดูดี
