ไปรษณีย์ไทย

แผนพัฒนาโมเดลสู่เป้าหมายระยะที่ 2

Phase 2 Model Roadmap

กำลังตรวจสอบโมเดล…

Phase 2 · Improvement Roadmap

แผนพัฒนาโมเดล: จาก 26.1% สู่เป้าหมายระยะที่ 2

โมเดลระยะที่ 1 เรียนรู้จากรถบรรทุกตู้ และไม่เคยเห็นภาพรถ EV เลย ตัวเลข 26.1% จึงเป็น จุดเริ่มต้นก่อนเทรนใหม่ ไม่ใช่ข้อบกพร่องของแนวทาง หน้านี้อธิบาย 10 ขั้น ที่จะพาโมเดลจากจุดนั้นไปสู่ตัวชี้วัดเชิงเทคนิคของระยะที่ 2 พร้อมทรัพยากรที่แต่ละขั้นต้องใช้ และผลที่คาดว่าจะได้ตามความเป็นจริง · Ten concrete steps from the measured baseline to the Phase-2 technical targets.

baseline: dinov3 · 1,811 ภาพ EVอุปกรณ์: CPUวัดเมื่อ: 2026-09-02T18:45:20

≤ 10

MAE ≤ 10 จุด

ค่าคลาดเคลื่อนเฉลี่ยของ % พื้นที่ว่าง

≥ 85%

≥ 85% ภายใน ±10 จุด

สัดส่วนภาพที่ตอบใกล้เฉลยไม่เกิน 10 จุด

300 / 3

ชุดอ้างอิง 300 ภาพ · ผู้เชี่ยวชาญ 3 คน

เฉลยเป็น % จริง ใช้ค่ามัธยฐาน

ไม่แน่ใจ

บอกว่าไม่แน่ใจแทนการเดา

ธง uncertain + ถอยไปตอบระดับ 1–6

ที่เรายืนอยู่วันนี้

Where we stand · current model on EV images, before retraining

ดูผลเต็มและชุดข้อมูล EV →

26.1%

ทายตรงระดับ (เทียบชื่อโฟลเดอร์)

62.4%

คลาดเคลื่อนไม่เกิน 1 ระดับ

24.9 จุด

MAE โดยประมาณ (เป้าหมาย ≤ 10)

วัดจากภาพ EV ทั้ง 1,811 ภาพ เทียบกับชื่อโฟลเดอร์ที่เจ้าหน้าที่จัดไว้ · MAE และ ±10 จุด เป็นค่าโดยประมาณจากค่ากลางของช่วง 20% เพราะยังไม่มีเฉลยเป็นตัวเลขจริง · คำตอบ 43.2% ของทั้งหมดยุบไปที่ระดับ 41-60%

0

ขั้นที่ 0 (ทำแล้ว) · ทำไมโมเดลปัจจุบันจึงพลาด

Step 0 (done) · Why the current model misses

ไม่ใช่เพราะโมเดลระยะที่ 1 ทำงานผิด — บนชุดทดสอบรถบรรทุกเดิมยังแม่นยำสูงเช่นเดิม แต่ภาพรถ EV เป็น โดเมนใหม่ที่โมเดลไม่เคยเห็นแม้แต่ภาพเดียว (domain shift):

  • รถ กล้อง และแสงคนละแบบ — ระยะที่ 1 คือรถบรรทุกตู้ กล้อง 2 ตัว ภาพอินฟราเรดขาวดำเป็นส่วนใหญ่ กล่อง/กระสอบสีน้ำตาล ส่วนรถ EV เป็นรถตู้ผนังขาว พื้นลายเพชรสีเข้ม กล้องมุมกว้างตัวเดียว ภาพสี กล่องเหลือง
  • ไม่มีภาพ EV ในชุดฝึกเลย — โมเดลจึงเทียบกับสิ่งที่ใกล้ที่สุดที่รู้จัก และเมื่อไม่แน่ใจก็ตอบ “กลาง ๆ” (41-60% · 782 จาก 1,811 ภาพ)
  • ป้ายกำกับเป็นช่วงกว้าง 20% — ชื่อโฟลเดอร์บอกได้เพียงว่า “อยู่ในช่วง 41–60%” จึงวัด MAE เป็นจุดได้เพียง โดยประมาณ และไม่พอสำหรับเทรนโมเดลให้ตอบเป็นตัวเลข
  • แสงและนาฬิกาบนภาพผูกกับระดับ — แต่ละระดับคือการจัดของหนึ่งรอบในช่วงเวลาเดียว (7 เซสชันจากกล้อง ใน 2 วัน) ความอิ่มตัวของสีเฉลี่ยลดจาก 151 เหลือ 75 จากเต็มไปว่าง โมเดลที่เทรนบนชุดนี้ตรง ๆ จะเรียน “ความเหลือง” และเวลาที่พิมพ์บนภาพ แทนการดูของในรถ
  • ค่าความมั่นใจไม่บอกอะไร — ภาพที่ทายถูกมีความมั่นใจเฉลี่ย 65.1% ทายผิด 63.4% · ตั้งเกณฑ์ ≥ 70% ได้ครอบคลุม 43.5% ของภาพ แต่แม่นยำเพียง 27.8% — ใช้คัดกรองอัตโนมัติไม่ได้จนกว่าจะปรับเทียบใหม่
สรุป: ทุกข้อข้างบนมีแนวทางแก้ที่ชัดเจนด้วยข้อมูลที่ถูกต้องและการเทรนใหม่ต่อจากน้ำหนักเดิม ซึ่งคือสิ่งที่ 10 ขั้นต่อไปนี้วางไว้

แผนงาน 4 เดือน · Phasing

เดือนที่ 1

ขั้น 1–5

protocol · ข้อมูลสะอาด · head-only · แก้สคริปต์เทรน · full fine-tune รอบแรก

เดือนที่ 2

ขั้น 6–7

ตอบเป็น % · ปรับเทียบความมั่นใจ · บอกว่าไม่แน่ใจ

เดือนที่ 3

ขั้น 8

กลางคืน / เลนส์สกปรก / 2 ยี่ห้อ 3 ตัวถัง · fusion หน้า+หลัง

เดือนที่ 4

ขั้น 9–10 + UAT

เวอร์ชัน/rollback/drift · ทดสอบรับมอบ 300 ภาพ

กรอบเวลาเป็นเป้าหมายเชิงเทคนิค ขึ้นกับการได้รับข้อมูลใหม่จากไปรษณีย์ไทยตามขั้นที่ 1

1

ขั้นที่ 1 · กำหนดเฉลย (Ground truth) และวิธีถ่ายภาพร่วมกับไปรษณีย์ไทย

Ground-truth & capture protocol

เดือนที่ 1ทำบน CPU ได้ (โน้ตบุ๊กธรรมดา)ต่อจาก: การตัดสินใจร่วมกับไปรษณีย์ไทย

งานเอกสารและประสานงาน ไม่ต้องใช้เครื่องประมวลผล

  • ออกแบบชุดอ้างอิง 300 ภาพ: ผู้เชี่ยวชาญ 3 คนให้ค่า % พื้นที่ว่างเป็นตัวเลขต่อเนื่อง (ไม่ใช่ช่วง 20%) ใช้ค่ามัธยฐานเป็นเฉลย และเผยแพร่ค่า inter-rater MAE เป็น “พื้นสัญญาณรบกวน” (noise floor) ที่โมเดลไม่มีทางทำได้ดีกว่า
  • กำหนดวิธีถ่ายรอบใหม่: ในหนึ่งวันสลับระดับการบรรทุกหลายระดับ (ไม่ใช่ 1 ระดับ = 1 ช่วงเวลา) ถ่ายทั้งกลางวันและกลางคืน หลายคัน ครอบคลุมกล้อง 2 ยี่ห้อ / ตัวถัง 3 แบบ
  • ระบุคู่ภาพกล้องหน้า+หลังของเหตุการณ์เดียวกันสำหรับรถที่มี 2 กล้อง เพื่อใช้กับการรวมผล (fusion) ในขั้นที่ 8
  • เขียนเป็นเอกสาร protocol ฉบับสั้นที่ทั้งสองฝ่ายลงนามรับทราบ

ทำไมต้องทำ: ตัวชี้วัดของระยะที่ 2 (MAE ≤ 10 จุด) เป็นตัวเลขต่อเนื่อง แต่ชุดข้อมูลที่ได้รับตอนนี้เป็นช่วงกว้าง 20% จึงวัด MAE ได้เพียง “โดยประมาณ” จากค่ากลางของช่วง หากไม่มีเฉลยจริงจากผู้เชี่ยวชาญ ก็ไม่มีทางตัดสินได้ว่าโมเดลถึงเป้าหมายหรือยัง และชุดภาพชุดแรกยังผูกแสง/เวลาเข้ากับระดับ ทำให้ประเมินความแม่นยำสูงเกินจริง

ผลที่คาดว่าจะได้: เอกสาร protocol ฉบับเขียน + กำหนดการถ่ายชุดแรกแบบสลับระดับ (mixed session) ที่นัดหมายแล้ว
ตอบเป้าหมาย:ชุดอ้างอิง 300 ภาพ · ผู้เชี่ยวชาญ 3 คนกล้อง 2 ยี่ห้อ / ตัวถัง 3 แบบกลางคืน / เลนส์สกปรก
2

ขั้นที่ 2 · ทำความสะอาดข้อมูล และแบ่งชุดฝึก/ทดสอบแบบไม่รั่ว

Data hygiene & leakage-safe split

เดือนที่ 1ทำบน CPU ได้ (โน้ตบุ๊กธรรมดา)ต่อจาก: ผล baseline และ CSV รายภาพจากขั้นที่ 0

ทำจากไฟล์ CSV รายภาพที่ evaluator สร้างไว้แล้ว

  • ตัดไฟล์ซ้ำ (md5 เท่ากัน) ออกจากชุดฝึก และติดป้าย (tag) ภาพจับหน้าจอแยกเป็นชุดย่อย ไม่ปะปนกับภาพจากกล้อง
  • แบ่งข้อมูลแบบ time-block: เฟรมที่ถ่ายห่างกันไม่ถึง 5 นาทีต้องอยู่ฝั่งเดียวกันเสมอ (ป้องกันเฟรมติดกันที่เกือบเหมือนกันรั่วข้ามชุด)
  • กันเซสชัน 41–60% ของวันที่ 05 ส.ค. (79 ภาพ) ไว้ทั้งก้อนเป็นชุดทดสอบข้ามเซสชัน (cross-session) ชุดเดียวที่ซื่อตรงจริง เพราะเป็นระดับเดียวที่มีภาพจากกล้องสองช่วงเวลา (ระดับ 81–100% มีช่วงที่สองเป็นภาพจับหน้าจอ ไม่ใช่ภาพกล้อง)
  • เขียน manifest loader แบบแบน (thaipost-dino/datasets/manifest.py) อ่านรายการภาพ+เฉลยจาก CSV แทนการอ่านชื่อโฟลเดอร์ เพื่อให้ Phase-1 และ EV ใช้ pipeline เดียวกัน
  • ออกเอกสาร “คำชี้แจงการรั่วของข้อมูล” (leakage statement) แนบทุกผลทดสอบ

ทำไมต้องทำ: ในชุดข้อมูล EV ชุดแรก แต่ละระดับคือการจัดของหนึ่งรอบในช่วงเวลาเดียว ถ้าสุ่มแบ่งภาพธรรมดา โมเดลจะจำแสงและนาฬิกาที่พิมพ์บนภาพแทนการดูของในรถ ตัวเลขที่ได้จะสวยแต่ใช้จริงไม่ได้

ผลที่คาดว่าจะได้: manifest ชุดฝึก/ตรวจสอบ/ทดสอบที่ทำซ้ำได้ (reproducible) + leakage statement
ตอบเป้าหมาย:ชุดอ้างอิง 300 ภาพ · ผู้เชี่ยวชาญ 3 คน
3

ขั้นที่ 3 · เทรนเฉพาะชั้นจำแนก (head-only) บนฟีเจอร์ DINOv3 ที่แช่แข็งไว้

Head-only fine-tune on frozen features

เดือนที่ 1ทำบน CPU ได้ (โน้ตบุ๊กธรรมดา)ต่อจาก: ขั้นที่ 2 (manifest)ทดลองแล้ว

สกัดฟีเจอร์ราว 0.1 วินาที/ภาพ → ทั้งชุด EV ประมาณ 2–4 นาที บนโน้ตบุ๊กธรรมดา (CPU) ส่วนการเทรนหัวจำแนกใช้เวลาไม่กี่วินาที

  • สกัดฟีเจอร์ (frozen backbone) ของภาพ Phase-1 และ EV ทั้งหมดครั้งเดียว แล้วเก็บเป็นเทนเซอร์
  • เทรนชั้น Linear 384→6 ต่อจากน้ำหนักเดิม (warm-start จาก model.pth) ด้วยข้อมูล Phase-1 + EV ร่วมกัน เพื่อไม่ให้ลืมรถบรรทุกระยะที่ 1
  • ส่งออกเป็นไฟล์น้ำหนักที่ใช้แทนของเดิมได้ทันที (drop-in) โดยไม่แก้โค้ด inference
  • วัดก่อน/หลังด้วย evaluator ตัวเดียวกันบนรายชื่อภาพเดียวกัน (benchmark.py --only-files … --weights weights/model_ev_head.pth) และรันชุด Phase-1 ซ้ำเพื่อยืนยันว่าไม่ถดถอย

ทำไมต้องทำ: เป็นขั้นที่ถูกที่สุดและเร็วที่สุดในการพิสูจน์ว่าฟีเจอร์ของ DINOv3 “มองเห็น” ระดับพื้นที่ว่างในรถ EV ได้หรือไม่ ถ้าผลข้ามเซสชันยังต่ำมากทั้งที่ผล time-block สูง แสดงว่าปัญหาอยู่ที่ข้อมูล (แสงผูกกับระดับ) ไม่ใช่ที่โมเดล และต้องเร่งขั้นที่ 1

# รันจริงแล้ว — ผลอยู่บนหน้า /phase2
uv run python scripts/headft.py run
uv run python scripts/benchmark.py --data "../../EV Image_Phase2/EV Image" --only-files reports/ev_split_test.txt \
  --dataset-id ev-test-headft --weights weights/model_ev_head.pth --model-version dinov3-ev-head-v0.1
ผลที่คาดว่าจะได้: คาดว่าทายตรงระดับ 55–80% บนชุด time-block (ตัวเลขนี้สูงเกินจริง) และต่ำกว่านั้นบนเซสชันที่กันไว้ — ช่องว่างระหว่างสองตัวเลขคือข้อค้นพบสำคัญ · ชุด Phase-1 ต้องคงอยู่ ≥ 95%
ทดลองแล้ว (2026-09-02): ชุดทดสอบ time-block ทายตรงระดับ 30.9% → 61.0% (MAE 22.2 → 9.5 จุด โดยประมาณ) · ข้ามเซสชัน 41–60% (n=79) 38.0% → 39.2% — ยังไม่เห็นการเปลี่ยนแปลงที่วัดได้ · ดูรายละเอียดและข้อควรระวัง
ตอบเป้าหมาย:เริ่มจากน้ำหนักระยะที่ 1 (warm-start)
4

ขั้นที่ 4 · ปรับสคริปต์เทรน thaipost-dino ให้รองรับ warm-start, CPU และการเสริมข้อมูลแบบใหม่

Training-pipeline fixes

เดือนที่ 1ทำบน CPU ได้ (โน้ตบุ๊กธรรมดา)ต่อจาก: ขั้นที่ 2 (manifest)

ทดสอบ smoke epoch บน CPU ได้ (~20 นาที/epoch รวม clean+aug)

  • เพิ่มแฟล็ก --init-weights ให้ dinov3_training.py เริ่มจาก model.pth ของระยะที่ 1 (ปัจจุบันเทรนจากศูนย์เท่านั้น)
  • โหลด backbone จากไฟล์ในเครื่อง และเลิกบังคับ device_map="cuda"; แก้ CDB loss ที่ hard-code .cuda() ให้เป็น .to(device) เพื่อรันบน CPU ได้
  • เพิ่ม --lr, --manifest (อ่านจากขั้นที่ 2), แยก validation ออกจาก test และเลือกโมเดลจาก val MAE ไม่ใช่ accuracy
  • ต่อสาย SimulateNightVision ที่มีอยู่แต่ยังไม่ถูกเรียกใช้ + hue/saturation jitter + RandomGrayscale เพื่อไม่ให้โมเดลพึ่ง “ความเหลือง” ของกล่อง
  • สุ่มลบ (random-erase) บริเวณนาฬิกาที่พิมพ์บนภาพ เพื่อตัดทางลัดจากเวลาที่ผูกกับระดับ

ทำไมต้องทำ: สคริปต์เทรนปัจจุบันถูกเขียนสำหรับรถบรรทุกระยะที่ 1 บน GPU เพียงอย่างเดียว การเทรนใหม่ทุกครั้งหลังจากนี้ (ขั้น 5, 6, 8) ต้องพึ่งแฟล็กและ augmentation ชุดนี้ จึงควรทำครั้งเดียวให้เรียบร้อยและมีการทดสอบ

ผลที่คาดว่าจะได้: smoke epoch รันจบบน CPU โดยไม่ error และให้ค่า loss/val MAE ออกมาเป็นตัวเลข
ตอบเป้าหมาย:เริ่มจากน้ำหนักระยะที่ 1 (warm-start)กลางคืน / เลนส์สกปรก
5

ขั้นที่ 5 · เทรนละเอียดทั้งโมเดล (full fine-tune) ด้วย Phase-1 + EV

Full fine-tune, warm-started

เดือนที่ 1ต้องใช้ GPUต่อจาก: ขั้นที่ 4 (สคริปต์เทรน) และ GPU

ทางเลือกสำรอง: โน้ตบุ๊กธรรมดา (CPU)รันข้ามคืนได้ (~340 ms/ภาพ forward+backward)

  • เทรนทั้ง backbone + head จากน้ำหนักระยะที่ 1 ด้วยภาพ Phase-1 + EV (+ เซสชันใหม่จากขั้นที่ 1 เมื่อมี) หยุดแบบ early-stop ตาม val MAE
  • รันบน DGX Spark (GB10) ที่เข้าถึงได้อยู่แล้ว ใช้เวลาไม่กี่นาทีต่อ epoch; หากไม่ว่างใช้โน้ตบุ๊กข้ามคืน
  • ประเมินด้วย benchmark.py --weights --dataset-id ev-ft ทั้งชุด time-block และเซสชันที่กันไว้ แล้วเผยแพร่ benchmark-ev-ft.json เป็นคอลัมน์ “หลังเทรน” ข้าง baseline
  • รันชุด Phase-1 ซ้ำเพื่อยืนยันว่ารถบรรทุกเดิมยังแม่นยำ

ทำไมต้องทำ: การเทรนเฉพาะ head (ขั้น 3) ปรับได้เฉพาะเส้นแบ่งบนฟีเจอร์เดิม ส่วน full fine-tune ให้ backbone เรียนรู้ลักษณะรถ EV ใหม่ทั้งหมด (ผนังขาว พื้นลายเพชร กล่องเหลือง มุมกว้าง) จึงเป็นขั้นที่คาดว่าจะยกความแม่นยำได้มากที่สุด

ผลที่คาดว่าจะได้: เป้าหมาย ≥ 80% ทายตรงระดับ / MAE ≤ 12 จุด (โดยประมาณ) บนชุด hold-out แบบจัดกลุ่ม; คาดว่า 60–75% บนเซสชันที่กันไว้จริง จนกว่าจะมีเซสชันใหม่จากขั้นที่ 1 เข้ามาเพิ่ม
ตอบเป้าหมาย:เริ่มจากน้ำหนักระยะที่ 1 (warm-start)MAE ≤ 10 จุด
6

ขั้นที่ 6 · ให้โมเดลตอบเป็น % ต่อเนื่อง ไม่ใช่แค่ 6 ระดับ

Continuous % output

เดือนที่ 2ต้องใช้ GPUต่อจาก: ขั้นที่ 1 (เฉลยตัวเลขจาก 300 ภาพ) และขั้นที่ 5
  • เพิ่มหัวถดถอย (regression head) หรือใช้ค่าคาดหวัง (expected value) จากหัว ordinal 6 ระดับ ให้ผลลัพธ์เป็นตัวเลข 0–100
  • ใช้ interval-censored L1 loss เพื่อเทรนจากป้ายกำกับแบบช่วง (โฟลเดอร์ 20%) และแบบตัวเลขตรง (ชุด 300 ภาพ) พร้อมกันได้
  • ให้ /predict คืนค่า empty_percent ที่มาจากโมเดลจริง แทนค่าสุ่มภายในช่วงที่ใช้อยู่ตอนนี้ (API shape เดิม ไม่กระทบหน้าเว็บ)
  • ประเมิน MAE เป็นจุดเปอร์เซ็นต์จริงบนชุดที่มีเฉลยตัวเลข

ทำไมต้องทำ: ตัวชี้วัดรับมอบของระยะที่ 2 กำหนดเป็น MAE ≤ 10 จุด และ ≥ 85% ภายใน ±10 จุด ซึ่งเป็นการวัดค่าต่อเนื่อง โมเดล 6 ระดับที่ตอบค่ากลางของช่วงจะมี error ในตัวสูงสุดถึง 10 จุดแม้ทายระดับถูก จึงต้องให้โมเดลตอบเป็นตัวเลขจริง

ผลที่คาดว่าจะได้: คาดว่า MAE 7–11 จุดในภาวะเดียวกับข้อมูลฝึก · จะถึง ≤ 10 ได้ก็ต่อเมื่อ inter-rater MAE ของผู้เชี่ยวชาญ ≤ ~7 มิฉะนั้นต้องทบทวนตัวชี้วัดร่วมกัน
ตอบเป้าหมาย:MAE ≤ 10 จุด≥ 85% ภายใน ±10 จุด
7

ขั้นที่ 7 · ปรับเทียบความมั่นใจ และให้โมเดล “บอกว่าไม่แน่ใจ”

Calibration & abstain

เดือนที่ 2ทำบน CPU ได้ (โน้ตบุ๊กธรรมดา)ต่อจาก: ขั้นที่ 5 หรือ 6 (โมเดลที่เทรนแล้ว)

ปรับจาก logits ที่บันทึกไว้ ไม่ต้องเทรนซ้ำ

  • Temperature scaling บนชุด validation ให้ค่าความมั่นใจสะท้อนโอกาสถูกจริง (ปัจจุบันถูก/ผิดมีค่าเฉลี่ยแทบเท่ากัน)
  • เพิ่มธง uncertain ใน /predict เมื่อความมั่นใจต่ำกว่าเกณฑ์ที่เลือกจาก coverage/accuracy curve และให้ระบบถอยไปตอบเป็นระดับ 1–6 แทนตัวเลข %
  • แสดงสถานะ “ไม่แน่ใจ” บนหน้าเว็บ พร้อมเหตุผลสั้น ๆ (เช่น แสงน้อย / เลนส์มัว)

ทำไมต้องทำ: โมเดลที่รู้ว่าตัวเองไม่รู้ ปลอดภัยกว่าโมเดลที่เดาอย่างมั่นใจ ผล baseline แสดงว่าค่าความมั่นใจของโมเดลปัจจุบันบนรถ EV แยกถูก/ผิดไม่ได้ ต้องแก้ก่อนนำไปใช้คัดกรองอัตโนมัติ

ผลที่คาดว่าจะได้: เป้าหมาย: ตอบ “ไม่แน่ใจ” 10–20% ของภาพ ขณะที่ภาพที่ตอบมีความถูกต้อง ≥ 90% ภายใน ±1 ระดับ
ตอบเป้าหมาย:บอกว่าไม่แน่ใจแทนการเดา
8

ขั้นที่ 8 · ความทนทานต่อสภาพจริง และการรวมผลกล้องหน้า+หลัง

Robustness & fusion

เดือนที่ 3ต้องใช้ GPUต่อจาก: ขั้นที่ 1 (เซสชันกลางคืน + คู่ภาพ 2 กล้อง) และขั้นที่ 7
  • เทรนซ้ำด้วยข้อมูลกลางคืน/IR จริงจากเซสชันใหม่ + augmentation เบลอ, เลนส์สกปรก (occlusion), แสงจ้า
  • รายงานผลแยกตามสภาพ (กลางวัน/กลางคืน/เลนส์สกปรก/ยี่ห้อกล้อง/ตัวถัง) บนแดชบอร์ดเดียวกัน
  • เมื่อมีคู่ภาพหน้า+หลังของรถ EV: เปลี่ยน late fusion จากเฉลี่ยธรรมดาเป็นถ่วงน้ำหนักด้วยความมั่นใจที่ปรับเทียบแล้ว (จากขั้นที่ 7)

ทำไมต้องทำ: รถ 322 คัน / กล้อง 644 ตัว จะเจอสภาพที่ต่างจากภาพชุดแรกที่ถ่ายในโรงจอด 2 วันมาก ตัวเลขรับมอบต้องยืนได้ในทุกสภาพ ไม่ใช่ค่าเฉลี่ยที่ซ่อนสภาพแย่ไว้

ผลที่คาดว่าจะได้: เป้าหมาย: ไม่มีสภาพใด (subset) ต่ำกว่าเกณฑ์รับมอบ
ตอบเป้าหมาย:กลางคืน / เลนส์สกปรกรวมผลกล้องหน้า+หลังกล้อง 2 ยี่ห้อ / ตัวถัง 3 แบบ
9

ขั้นที่ 9 · วงจรชีวิตโมเดล: เวอร์ชัน, rollback และแจ้งเตือน drift

Model lifecycle

เดือนที่ 4ทำบน CPU ได้ (โน้ตบุ๊กธรรมดา)ต่อจาก: ขั้นที่ 5 (มีมากกว่า 1 เวอร์ชันให้สลับ)

งานระบบและเอกสาร

  • เก็บน้ำหนักโมเดลแบบมีเวอร์ชัน; การ promote โมเดลใหม่ต้องผ่าน evaluator (benchmark.py) บนชุดอ้างอิงก่อน และ rollback กลับเวอร์ชันก่อนหน้าได้ในคำสั่งเดียว
  • ตัวตรวจ drift: แจ้งเตือนเมื่อการกระจายของคำตอบยุบเข้าระดับเดียว (เช่นที่ baseline วันนี้ตอบ 41–60% เกินสัดส่วน) หรือค่า PSI ของความมั่นใจเกินเกณฑ์
  • runbook สำหรับผู้ดูแลระบบ: อัปเดต ตรวจ ย้อนกลับ

ทำไมต้องทำ: โมเดลที่ใช้กับรถหลายร้อยคันจะเจอข้อมูลที่เปลี่ยนไปตลอด (รถใหม่ กล้องเปลี่ยน ฤดูกาล) ต้องมีทางตรวจจับและย้อนกลับได้ ไม่ใช่รอให้ผู้ใช้สังเกตเอง

ผลที่คาดว่าจะได้: runbook + ระบบแจ้งเตือนที่ทดสอบแล้วว่า “ดัง” เมื่อป้อนการกระจายคำตอบของ baseline วันนี้
ตอบเป้าหมาย:อัปเดตอัตโนมัติ + rollback + แจ้งเตือน drift
10

ขั้นที่ 10 · ทดสอบรับมอบบนชุดอ้างอิง 300 ภาพ

Acceptance run

เดือนที่ 4ทำบน CPU ได้ (โน้ตบุ๊กธรรมดา)ต่อจาก: ทุกขั้นก่อนหน้า

ประเมินอย่างเดียว (inference) บน CPU

  • เพิ่มโหมดเฉลยเป็นเปอร์เซ็นต์ (--labels <csv>) ให้ evaluator เดิม แล้วรันบนชุด 300 ภาพที่ผู้เชี่ยวชาญให้เฉลย โดยใช้แดชบอร์ดเดิม
  • รายงาน MAE, สัดส่วนภายใน ±10 จุด, สัดส่วนที่ตอบ “ไม่แน่ใจ” และผลแยกตามสภาพ พร้อม inter-rater MAE เป็นตัวเทียบ
  • UAT ร่วมกับผู้ใช้จริงของไปรษณีย์ไทย

ทำไมต้องทำ: เป็นการวัดเดียวที่ตรงกับตัวชี้วัดของระยะที่ 2 ทั้งด้านตัวเลข (ต่อเนื่อง) และด้านเฉลย (ผู้เชี่ยวชาญ) ตัวเลขทุกตัวก่อนหน้านี้เป็นค่าประมาณจากค่ากลางของช่วง

# ขั้นนี้เพิ่มตัวเลือก --labels (เฉลยเป็น %) ให้ evaluator ก่อน แล้วจึงรัน
uv run python scripts/benchmark.py --data <ชุดอ้างอิง 300 ภาพ> --labels reference_300.csv \
  --dataset-id acceptance --weights models/ev_v2.pth --model-version dinov3-ev-v2
ผลที่คาดว่าจะได้: เป้าหมาย: MAE ≤ 10 จุด และ ≥ 85% ภายใน ±10 จุด แสดงบนแดชบอร์ดเดียวกับ baseline วันนี้
ตอบเป้าหมาย:MAE ≤ 10 จุด≥ 85% ภายใน ±10 จุดชุดอ้างอิง 300 ภาพ · ผู้เชี่ยวชาญ 3 คน
11

สิ่งที่ต้องขอจากไปรษณีย์ไทย

What we need from ThaiPost

แผนนี้เดินได้เร็วเท่าที่ข้อมูลใหม่มาถึง ขั้นที่ 3–5 เริ่มได้ทันทีจากภาพชุดปัจจุบัน แต่การถึงเป้าหมายรับมอบ ต้องอาศัยสิ่งต่อไปนี้:

  1. รอบถ่ายภาพเพิ่ม: หลายวัน หลายคัน ทั้งกลางวันและกลางคืน โดย “สลับระดับการบรรทุก” ภายในวันเดียวกัน ไม่ใช่ 1 ระดับต่อ 1 ช่วงเวลา
  2. ชุดอ้างอิง 300 ภาพ ที่ผู้เชี่ยวชาญ 3 คนให้ค่า % พื้นที่ว่างเป็นตัวเลขจริง (ใช้ค่ามัธยฐาน) และยินยอมให้เผยแพร่ค่า inter-rater MAE เป็นตัวเทียบ
  3. ตัวอย่างภาพจากกล้องทั้ง 2 ยี่ห้อ และตัวถังรถทั้ง 3 แบบ ที่จะใช้จริง
  4. คู่ภาพกล้องหน้า+หลังของเหตุการณ์เดียวกัน สำหรับรถที่ติดกล้อง 2 ตัว
  5. ผู้ประสานงานฝ่ายปฏิบัติการ 1 คน สำหรับตอบคำถามเรื่องการจัดของ/การถ่ายภาพ และร่วม UAT ในเดือนที่ 4

เป้าหมายเชิงเทคนิคที่แผนนี้ตอบ · Technical targets

  • ✓ตอบเป็น % พื้นที่ว่าง โดย MAE ≤ 10 จุด และ ≥ 85% ของภาพอยู่ภายใน ±10 จุด บนชุดอ้างอิง 300 ภาพที่ผู้เชี่ยวชาญ 3 คนให้เฉลย · Percent output with MAE ≤ 10 pts and ≥ 85% within ±10 pts on a 300-image, 3-expert reference set
  • ✓เมื่อไม่มั่นใจ ระบบบอกว่า “ไม่แน่ใจ” แทนการเดา และถอยไปตอบเป็นระดับ 1–6 · Says “uncertain” instead of guessing, with fallback to level 1–6
  • ✓ทนทานต่อภาพกลางคืน/IR และเลนส์สกปรก · Night / dirty-lens robustness
  • ✓รวมผลกล้องหน้า+หลังสำหรับรถที่มี 2 กล้อง · Front + rear camera fusion
  • ✓เริ่มจากน้ำหนักโมเดลระยะที่ 1 (warm-start) ไม่ทิ้งสิ่งที่เรียนรู้มาแล้ว · Warm-start from Phase-1 weights
  • ✓อัปเดตโมเดลอัตโนมัติ พร้อม rollback และแจ้งเตือน drift · Auto-update with rollback + drift alert
  • ✓รองรับกล้อง 2 ยี่ห้อ / ตัวถังรถ 3 แบบ · 2 camera brands / 3 body models
12

ความคาดหวังตามความเป็นจริง

Realistic expectations

ตัวเลขด้านล่างเป็นช่วงที่คาดว่าจะได้จากประสบการณ์กับงานลักษณะเดียวกัน ไม่ใช่คำรับรอง ค่าที่วัดจริงจะปรากฏบนแดชบอร์ดเดียวกับ baseline หลังจบแต่ละขั้น

ขั้นทายตรงระดับภายใน ±1 ระดับMAEข้อควรระวัง
วันนี้ (baseline ก่อนเทรนใหม่)26.1%62.4%24.9 จุด (โดยประมาณ)โมเดลไม่เคยเห็นภาพรถ EV เลย
ขั้น 3 · head-only (ทดลองแล้ว — ดูกล่องผลในขั้นที่ 3)คาดไว้ 55–80% (time-block)คาดไว้ 85–97%คาดไว้ 6–12 จุด (โดยประมาณ)ตัวเลข time-block สูงเกินจริง; ชุดข้ามเซสชันมีระดับเดียวจึงบอกได้เพียงว่ายังไม่เห็นการเปลี่ยนแปลง
ขั้น 5 · full fine-tune70–85%คาดว่า > 95%คาดว่า 8–12 จุด (โดยประมาณ)บนเซสชันที่กันไว้จริงคาดว่า 60–75% จนกว่าจะมีเซสชันใหม่แบบสลับระดับ
ขั้น 6 · ตอบเป็น % (regression)——คาดว่า 7–11 จุด (วัดจริง)ถึง ≤ 10 ได้ต่อเมื่อ inter-rater MAE ของผู้เชี่ยวชาญ ≤ ~7 จุด
ขั้น 7 · abstainภาพที่ตอบ: ≥ 90% ภายใน ±1≥ 90% (เฉพาะที่ตอบ)—แลกกับการตอบ “ไม่แน่ใจ” 10–20% ของภาพ
ขั้น 10 · ทดสอบรับมอบ——เป้าหมาย ≤ 10 จุด / ≥ 85% ภายใน ±10วัดบนชุด 300 ภาพผู้เชี่ยวชาญเท่านั้น; ตัวเลขก่อนหน้านี้เป็นค่าประมาณ

MAE ของทุกขั้นก่อนขั้นที่ 6 เป็นค่าโดยประมาณจากค่ากลางของช่วง 20% · ตัวเลขที่ตัดสินการรับมอบมีเพียงชุดเดียวคือ ผลบนชุดอ้างอิง 300 ภาพในขั้นที่ 10

ขั้นถัดไปที่แนะนำ · Recommended next action

ขั้นที่ 3 ทดลองแล้ว — ขั้นถัดไปคือข้อมูล (ขั้นที่ 1–2) และสคริปต์เทรน (ขั้นที่ 4)

การเทรนเฉพาะส่วนหัวบนโน้ตบุ๊กธรรมดา (CPU) ยกผลชุด time-block จาก 30.9% เป็น 61.0% (ช่วงที่คาดไว้ก่อนทดลอง 55–80%) แต่ผลข้ามเซสชันยังไม่เปลี่ยนอย่างวัดได้ (38.0% → 39.2% จาก n=79) จุดคอขวดจึงอยู่ที่ข้อมูล: ต้องได้ภาพหลายวัน หลายคัน สลับระดับ (ขั้นที่ 1–2) ควบคู่กับการเตรียมสคริปต์เทรน backbone (ขั้นที่ 4) เพื่อให้ขั้นที่ 5 เริ่มได้ทันทีเมื่อข้อมูลมาถึง