
การแก้ปัญหาภาพกระตุกในระบบ Video Analytics
ปัญหาที่พบในการทำ ระบบนับและติดตามยานพาหนะอัตโนมัติจากกล้อง CCTV
1. ปัญหาที่ Buffer เฟรมสะสม
ใช้ FFmpeg pipe แทน OpenCV VideoCapture สำหรับ HLS/RTSP
OpenCV มี internal buffer ที่สะสมเฟรมเก่าทำให้ได้ภาพที่ล่าช้า การใช้ FFmpeg pipe ส่ง raw frame มาตรงๆ และตั้งค่า -fflags nobuffer -flags low_delay ช่วยลด latency ได้มาก
ffmpeg -fflags nobuffer -flags low_delay \ -probesize 32 -analyzeduration 0 \ -i <rtsp_url> -pix_fmt bgr24 -f rawvideo pipe:1
เก็บแค่เฟรมล่าสุด ไม่ใช้ Queue แบบ FIFO
แทนที่จะใส่เฟรมลง Queue ให้ overwrite ตัวแปรเฟรมล่าสุดทุกครั้ง ใช้ Lock ป้องกัน race condition YOLO worker จะดึงเฟรมใหม่สุดเสมอ ไม่ต้องรอระบาย Queue
with latest_locks[cam_id]: latest_frames[cam_id] = frame.copy() frame_events[cam_id].set()
2. ปัญหาที่ YOLO ประมวลผลช้า
ลด imgsz และจำกัด classes
ลดขนาดภาพ input ของ YOLO เช่นจาก 1280 เหลือ 640 หรือ 480 ทำให้ inference เร็วขึ้นอย่างเห็นได้ชัด พร้อมกันนั้นระบุ classes ที่ต้องการเท่านั้น เช่น [0,2,3,5,7] ไม่ต้อง detect ทุก class
model.track(frame, imgsz=640, classes=[0,2,3,5,7])
แยก YOLO worker ต่อกล้อง ไม่ใช้ batch เดียวกัน
การ track หลายกล้องใน model เดียวทำให้ ByteTrack สับสน ID ข้ามกล้อง การแยก thread ต่อกล้องทำให้ track แม่นยำขึ้น แต่ใช้ VRAM มากขึ้นเล็กน้อย
ใช้ model ขนาดเล็กลง เช่น YOLOv8n หรือ YOLOv8s
YOLOv8n (nano) เร็วกว่า YOLOv8m หลายเท่า accuracy ต่างกันเล็กน้อย แต่เพียงพอสำหรับงาน traffic counting ที่ไม่ต้องการ classify วัตถุชิ้นเล็ก
3. ปัญหาที่ Display / OpenCV
จำกัด FPS การแสดงผล
ไม่จำเป็นต้อง render ทุกเฟรมที่ YOLO ประมวลผล การจำกัด display ที่ 25 FPS และ resize ภาพก่อน concat ช่วยลด CPU ที่ใช้ render ได้มาก
frame = cv2.resize(f, (640, 360)) time.sleep(max(0, 1/25 - elapsed))
ปิด debug window ใน production
การเปิด cv2.imshow() สำหรับกล้องหลายตัวพร้อมกันกินทรัพยากร CPU และ GPU ของ display อย่างมาก ใน production ควรตั้ง debug.window: false แล้วดูผ่าน web dashboard แทน
4. ปัญหาที่ Network / กล้อง
ตรวจสอบ bandwidth และ codec ของกล้อง
กล้อง H.265 (HEVC) ใช้ bandwidth น้อยกว่า H.264 แต่ใช้ CPU decode มากกว่า ถ้า CPU ไม่รองรับ hardware decode ให้เปลี่ยนกล้องเป็น H.264 หรือเพิ่ม decode card
ลด FPS และ resolution ที่ตัวกล้อง
สำหรับงาน traffic counting ไม่จำเป็นต้องใช้ 4K หรือ 30fps กล้องที่ตั้งเป็น 1080p/15fps เพียงพอสำหรับการนับ ลดภาระ network และ decode ลงได้ครึ่งหนึ่ง
สรุปแนวทางแก้ไข
| เป้าหมาย | วิธีแนะนำ |
|---|---|
| ผลกระทบสูงสุด | FFmpeg pipe + latest frame only |
| ทำได้เร็วที่สุด | ลด imgsz + ปิด debug window |
| ระยะยาว | YOLO nano + ลด FPS กล้อง |