Object Detection คืองานด้านคอมพิวเตอร์วิทัศน์ที่กำหนดคลาสของวัตถุ (แมว รถ คน) และตำแหน่งในภาพพร้อมกันในรูปแบบของกรอบสี่เหลี่ยมผืนผ้า (bounding box) ต่างจาก Image Labeling ตรงที่ Object Detection จะค้นหาวัตถุหลายชิ้นจากคลาสต่างๆ ในเฟรมเดียวและระบุพิกัดของวัตถุเหล่านั้น ในการพัฒนาแอปมือถือ Object Detection ถูกใช้ในระบบเฝ้าระวังวิดีโอ แอปพลิเคชัน AR โดรนอัตโนมัติ การถ่ายภาพทางการแพทย์ และการวิเคราะห์ค้าปลีก ตามข้อมูลจาก Google ML Kit, 2025 การตรวจจับวัตถุบนอุปกรณ์ทำได้ 30 FPS บนอุปกรณ์เรือธงด้วยความแม่นยำ 87% mAP
ประเด็นสำคัญ
Object Detection แก้ปัญหาสองงานพร้อมกัน: มีอะไรในภาพ (การจำแนก) และอยู่ที่ไหน (การถดถอยพิกัด) โมเดลจะแบ่งภาพเป็นตาราง ทำนาย bounding box (x, y, ความกว้าง, ความสูง) และความน่าจะเป็นของคลาสสำหรับแต่ละเซลล์ Non-Maximum Suppression (NMS) จะลบกรอบที่ซ้ำกันสำหรับวัตถุเดียว โดยคงการทำนายที่มีความมั่นใจสูงที่สุด สถาปัตยกรรมสมัยใหม่แบ่งเป็นสองขั้นตอน (Faster R-CNN — ขั้นแรกเสนอขอบเขต จากนั้นจำแนก) และขั้นตอนเดียว (YOLO, SSD — ทุกอย่างพร้อมกัน)
เมตริกการประเมิน: mAP (mean Average Precision) — เมตริกคุณภาพหลักสำหรับ Object Detection mAP@0.5 — ความแม่นยำที่เกณฑ์ IoU 0.5, mAP@0.5:0.95 — ค่าเฉลี่ยทั่วเกณฑ์ตั้งแต่ 0.5 ถึง 0.95 FPS — เฟรมต่อวินาที (ความเร็วในการอนุมาน) สำหรับแอปพลิเคชันมือถือ ความสมดุลระหว่าง mAP/FPS มีความสำคัญ: YOLOv8-Nano ให้ 42% mAP@0.5:0.95 ที่ 50+ FPS, SSD MobileNet — 22% mAP ที่ 60+ FPS สำหรับแบบเรียลไทม์ > 20 FPS สำหรับการใช้งานแบบโต้ตอบ 5–15 FPS
IoU (Intersection over Union) — เมตริกการทับซ้อนระหว่าง bounding box ที่ทำนายกับจริง IoU = พื้นที่ตัด / พื้นที่รวม เกณฑ์ IoU สำหรับ NMS โดยทั่วไปคือ 0.5–0.7 สำหรับการติดตามวัตถุระหว่างเฟรม (การระบุซ้ำ) ให้ใช้ Deep SORT หรือ ByteTrack ด้วยการจับคู่ IoU สำหรับการนับวัตถุในวิดีโอ BoT-SORT ให้ 85% MOTA (Multiple Object Tracking Accuracy)
| สถาปัตยกรรม | mAP@0.5:0.95 | ความหน่วง | พารามิเตอร์ | ขนาด |
|---|---|---|---|---|
| YOLOv8-Nano | 42% | 10–30 ms | 2.6M | 5.9 MB |
| YOLOv8-Small | 50% | 25–60 ms | 11.2M | 22 MB |
| SSD MobileNetV2 | 22% | 15–40 ms | 5.2M | 21 MB |
| EfficientDet-Lite0 | 35% | 20–50 ms | 3.9M | 15 MB |
Anchor Boxes — รูปร่าง bounding box ที่กำหนดไว้ล่วงหน้าที่โมเดลปรับแต่ง YOLOv8 ใช้การตรวจจับแบบไม่มีจุดยึด (anchor-free) ซึ่งทำให้การฝึกง่ายขึ้นและเร่งการอนุมาน SSD และ YOLO รุ่นเก่าต้องการการปรับจุดยึดสำหรับแต่ละชุดข้อมูล สำหรับการพัฒนามือถือ สถาปัตยกรรมแบบไม่มีจุดยึด (YOLOv8, FCOS) เหมาะกว่า — ไม่ขึ้นอยู่กับขนาดวัตถุและปรับแต่งได้ง่ายกว่า
ML Kit Object Detection and Tracking — ไลบรารีของ Google สำหรับการตรวจจับและติดตามวัตถุบนอุปกรณ์ รองรับสองโหมด: ตัวตรวจจับภาพเดี่ยว (สำหรับภาพถ่าย) และตัวตรวจจับแบบสตรีมมิ่ง (สำหรับวิดีโอ) โหมดสตรีมมิ่งจะติดตามวัตถุระหว่างเฟรมโดยอัตโนมัติโดยใช้การไหลของแสง (optical flow) ซึ่งลดความหน่วงระหว่างเฟรมหลังการตรวจจับเริ่มแรกเหลือ 5–10 ms หมวดหมู่: fashion, food, home, places — หมวดหมู่ละ 10–20 คลาส
ML Kit API: ObjectDetector (ตัวเลือก: detectorMode, enableClassification, enableMultipleObjects) → InputImage → DetectedObject (trackingId, boundingBox, classificationCategory, classificationConfidence) TrackingId ช่วยให้ติดตามวัตถุเดียวกันข้ามเฟรมได้ MultipleObjects = true — ตรวจจับได้สูงสุด 5 วัตถุต่อเฟรม Classification — เปิดใช้งานการรู้จำหมวดหมู่วัตถุ (ค่าเริ่มต้น false เพื่อความเร็ว) โหมดสตรีมมิ่งแนะนำสำหรับแบบเรียลไทม์: 20–30 FPS บน Pixel 6
val options = ObjectDetectorOptions.Builder()
.setDetectorMode(ObjectDetectorOptions.STREAM_MODE)
.enableClassification()
.enableMultipleObjects()
.build()
val detector = ObjectDetection.getClient(options)
detector.process(inputImage)
.addOnSuccessListener { objects ->
objects.forEach { obj ->
val box = obj.boundingBox
val trackingId = obj.trackingId
val category = obj.classificationCategory()
drawBoundingBox(box, trackingId, category)
}
}
Object Tracking: หลังจากตรวจจับวัตถุในเฟรมแรก ML Kit จะติดตามวัตถุผ่านสตรีมวิดีโอโดยไม่ต้องตรวจจับซ้ำ (基于 optical flow + การติดตามคุณลักษณะ) ซึ่งช่วยลดภาระ CPU/GPU: การตรวจจับเริ่มแรก 30–60 ms, เฟรมติดตามถัดไป 2–5 ms หากวัตถุออกจากเฟรมหรือหมุน > 30° ตัวติดตามจะรีเซ็ตและต้องตรวจจับใหม่ TrackingId จะคงอยู่ตราบเท่าที่วัตถุยังอยู่ในเฟรม ในการนับวัตถุที่ไม่ซ้ำกัน ให้ใช้ trackingId เป็นตัวระบุ
YOLOv8-Nano — เวอร์ชันเล็กที่สุดของ YOLOv8 (Ultralytics) สำหรับอุปกรณ์ขอบ (edge) 2.6M พารามิเตอร์, 5.9 MB (FP16), 42% mAP@0.5:0.95 บน COCO YOLOv8 ใช้การตรวจจับแบบไม่มีจุดยึด + แกนหลัก C2f + TaskAlignedAssigner สำหรับการจับคู่การทำนาย สำหรับการพัฒนามือถือ สามารถส่งออกไปยัง TFLite (INT8 — 2.0 MB, หน่วงเวลา 8–20 ms) และ Core ML (4.5 MB, หน่วงเวลา 5–15 ms บน iPhone 15 Pro) YOLOv8-Nano เป็นตัวเลือกที่ดีที่สุดสำหรับ Object Detection แบบเรียลไทม์บนอุปกรณ์
การส่งออก YOLOv8 ไปยัง TFLite: Ultralytics มี CLI: yolo export model=yolov8n.pt format=tflite int8 ผลลัพธ์คือโมเดล TFLite INT8 ที่ปรับให้เหมาะกับ GPU Delegate ผ่าน NNAPI สำหรับชุดข้อมูลที่กำหนดเอง (คลาสของคุณเอง ไม่ใช่ COCO) — การฝึกผ่าน Ultralytics HUB ด้วยภาพ 50–500 ภาพต่อคลาส RT-DETR (Real-Time Detection Transformer) — ทางเลือกที่ใช้สถาปัตยกรรม Transformer, 48% mAP ที่ 60 FPS บน NVIDIA Jetson แต่สำหรับอุปกรณ์มือถือยังช้ากว่า YOLOv8-Nano ในด้านความเร็ว
# YOLOv8 export to TFLite
from ultralytics import YOLO
model = YOLO("yolov8n.pt")
model.export(format="tflite", int8=True, imgsz=320)
# Inference with TFLite on Android
val interpreter = Interpreter(loadFile("yolov8n_int8.tflite"))
val output = Array(1) { Array(8400) { FloatArray(6) } }
interpreter.run(inputBuffer, output)
YOLO vs ML Kit บนอุปกรณ์มือถือ: ML Kit Object Detection รวมเข้ากับงานได้ง่ายกว่า (โค้ด 10 บรรทัด) ไม่ต้องใช้ความเชี่ยวชาญด้าน ML แต่จำกัดเฉพาะคลาสมาตรฐาน (fashion, food, home, places) YOLOv8-Nano ต้องการการส่งออกแบบกำหนดเอง แต่ให้การควบคุมที่สมบูรณ์: คลาสใดก็ได้ ขนาดอินพุต สถาปัตยกรรม สำหรับการสร้างต้นแบบอย่างรวดเร็ว — ML Kit สำหรับการผลิตที่มีวัตถุที่ไม่ได้มาตรฐาน — YOLOv8-Nano สำหรับ iOS: YOLOv8-Core ML ผ่านการส่งออกโมเดลจาก Ultralytics + VNCoreMLRequest
SSD (Single Shot Multibox Detector) — สถาปัตยกรรมแบบขั้นตอนเดียวคลาสสิกสำหรับอุปกรณ์มือถือ SSD MobileNetV2 — มาตรฐานโดยพฤตินัยในปี 2020–2023: 22% mAP@0.5:0.95 บน COCO, 15–40 ms บน Pixel 6 SSD ใช้พีระมิดคุณลักษณะ (เลเยอร์ MobileNet ต่างๆ สำหรับตรวจจับวัตถุขนาดต่างๆ) และกล่องเริ่มต้น (anchor boxes) สำหรับแต่ละเซลล์ของแผนที่คุณลักษณะ ข้อดี: ความเร็วสูงสุดสำหรับยุคนั้น ข้อเสีย: ความแม่นยำต่ำบนวัตถุขนาดเล็ก (10–30 px)
EfficientDet-Lite — ตระกูลจาก Google (2020+) ปรับให้เหมาะสมสำหรับ TFLite EfficientDet-Lite0: 3.9M พารามิเตอร์, 35% mAP, 20–50 ms EfficientDet-Lite2: 8.1M, 42% mAP, 40–80 ms EfficientDet ใช้ BiFPN (Bidirectional Feature Pyramid Network) สำหรับการหลอมรวมคุณลักษณะหลายสเกล — ซึ่งให้ mAP เพิ่มขึ้น 2–4% โดยไม่เพิ่มความหน่วง สำหรับการพัฒนามือถือ Google แนะนำ EfficientDet-Lite เป็นตัวตรวจจับหลักสำหรับ TFLite Task Vision
MediaPipe Object Detector — การใช้งานพร้อมใช้ที่สร้างบน EfficientDet-Lite ซึ่งเป็นส่วนหนึ่งของ MediaPipe Tasks Vision มี API แบบครบวงจรสำหรับ Android, iOS, Python, Web MediaPipe Object Detector รองรับคลาส COCO (80 คลาส), โมเดลที่กำหนดเอง, โหมดสตรีมมิ่ง และตัวแทน CPU/GPU สำหรับการรวม Object Detection อย่างรวดเร็วในโครงการข้ามแพลตฟอร์ม MediaPipe คือตัวเลือกที่เหมาะสมที่สุด: โค้ดเดียวสำหรับทุกแพลตฟอร์ม
// MediaPipe Object Detection
val options = ObjectDetectorOptions.Builder()
.setBaseOptions(BaseOptions.builder()
.setDelegate(BaseOptions.Delegate.GPU)
.build())
.setMaxResults(5)
.setScoreThreshold(0.5f)
.build()
val detector = ObjectDetector.createFromOptions(context, options)
val image = MPImage.fromBitmap(bitmap)
val result = detector.detect(image)
result.detections.forEach { detection ->
val box = detection.boundingBox
val category = detection.categories.first()
}
การเลือกสถาปัตยกรรมสำหรับแอปพลิเคชันมือถือ: สำหรับ > 30 FPS บนอุปกรณ์ระดับกลาง — YOLOv8-Nano (INT8) หรือ SSD MobileNetV2 สำหรับความแม่นยำ > 40% mAP — YOLOv8-Small (11.2M) หรือ EfficientDet-Lite2 (8.1M) สำหรับข้ามแพลตฟอร์ม — MediaPipe Object Detector สำหรับความเรียบง่าย — ML Kit สำหรับ iOS-first — Core ML + YOLOv8 .mlpackage สำหรับ Android-first — TFLite Task Vision (ObjectDetector API) การฝึก: Roboflow (ชุดข้อมูล) + Ultralytics YOLOv8 (การฝึก) + ส่งออกไปยัง TFLite/Core ML
TFLite Task Vision ObjectDetector — API แบบครบวงจรจาก Google สำหรับรันโมเดล Object Detection บน Android และ iOS Task API จัดการการประมวลผลภาพล่วงหน้า (การปรับขนาด การทำให้เป็นมาตรฐาน การแปลงพื้นที่สี) และการประมวลผลภายหลัง (NMS, การกำหนดเกณฑ์) โดยอัตโนมัติ นักพัฒนาเพียงส่งโมเดล .tflite และรับรายการ Detections พร้อม bounding box + หมวดหมู่ + คะแนน Task API รองรับโมเดลที่เข้ากันได้กับ COCO (80 คลาส)
การแปลงโมเดลที่กำหนดเองเป็น Task API: โมเดล TFLite ต้องมีอินพุต [1, height, width, 3] (float32/uint8) และเอาต์พุต: detection_boxes[1,N,4], detection_classes[1,N], detection_scores[1,N], num_detections[1] ส่งออกจาก TensorFlow Object Detection API โดยรวม ops การประมวลผลภายหลัง (SSD Postprocess) สำหรับ YOLOv8 — ส่งออก TFLite ด้วย NMS ผ่าน ops-compat Task API บน iOS ใช้ Core ML Delegate เพื่อเร่งความเร็วบน ANE
// TFLite Task Vision Object Detector
val options = ObjectDetectorOptions.Builder()
.setScoreThreshold(0.5f)
.setMaxResults(10)
.setDelegate(Delegate.GPU)
.build()
val detector = ObjectDetector.createFromFileAndOptions(
context, "custom_model.tflite", options
)
val image = TensorImage.fromBitmap(bitmap)
val results = detector.detect(image)
results.forEach { detection ->
onObjectDetected(
detection.boundingBox,
detection.categories.first().label,
detection.categories.first().score
)
}
ประสิทธิภาพของ Task API: GPU Delegate บน Android ให้ความเร่ง 3–5x เทียบกับ CPU (XNNPACK) NNAPI Delegate — เพิ่มอีก 1.5–2x บนอุปกรณ์ที่มี NPU (Pixel 8, Snapdragon 8 Gen 3, Dimensity 9300) Hexagon, DSP — สูงสุด 10x บนตัวเร่ง DSP สำหรับ iOS Core ML Delegate — 4–6x เทียบกับ CPU Task API เลือกตัวเร่งฮาร์ดแวร์ที่มีอยู่โดยอัตโนมัติ แต่สามารถบังคับระบุตัวแทนผ่าน DetectorOptions ได้
การนับคนและวัตถุ — การวิเคราะห์ค้าปลีก: การตรวจจับผู้มาเยือนในร้านค้า การนับคิว การกำหนดระดับสินค้าบนชั้นวาง ตัวนับจำนวนคน Object Detection ในเฟรมช่วยประเมินปริมาณผู้สัญจรและการแปลง ML Kit Object Detector ให้สูงสุด 30 FPS — เพียงพอสำหรับการนับแบบเรียลไทม์ สำหรับการข้ามโซน — การรวมกันของ Object Detection + การติดตาม ByteTrack ความแม่นยำในการนับ: 92–95% ในสภาพแสงที่ดี
การตรวจจับข้อบกพร่องในการผลิต — Object Detection ระบุข้อบกพร่องบนสายพานลำเลียง: รอยขีดข่วน รอยแตก รอยร้าว การประกอบผิดพลาด โมเดล YOLOv8-Nano (INT8) ที่กำหนดเองทำงานบนแท็บเล็ต Android ที่เชื่อมต่อกับกล้อง USB ความหน่วง: 20–40 ms ต่อเฟรม (25–50 FPS) สำหรับข้อบกพร่องที่ซับซ้อน (รอยร้าวขนาดเล็ก) — เพิ่มความละเอียดอินพุตเป็น 640x640 (ความหน่วง 40–80 ms) การฝึก: Roboflow — ชุดข้อมูลภาพข้อบกพร่อง 200–1000 ภาพ + Ultralytics YOLOv8
การทำเครื่องหมายวัตถุ AR แบบเรียลไทม์ — ARCore (Android) และ ARKit (iOS) ใช้ Object Detection เพื่อรู้จำพื้นผิวเรียบ ระนาบแนวตั้ง และวัตถุ 3D ML Kit Object Detection + ARCore Scene Semantics ให้การแบ่งส่วนวัตถุ: ผนัง พื้น เพดาน เฟอร์นิเจอร์ สำหรับการทำเครื่องหมาย AR แบบกำหนดเอง (เช่น การรู้จำโซฟารุ่นเฉพาะและการซ้อนทับข้อมูล AR) — YOLOv8-Nano + SceneKit/SceneForm ข้อกำหนดแบบเรียลไทม์: > 20 FPS
// ARKit + Object Detection
let request = VNCoreMLRequest(model: objectDetector) { req, _ in
guard let results = req.results as? [VNDetectedObjectObservation] else { return }
for result in results where result.confidence > 0.6 {
let rect = result.boundingBox
let worldPos = arView.hitTest(rect.center)
arView.addAnchor(ARAnchor(name: label, transform: worldPos))
}
}
การถ่ายภาพทางการแพทย์ — Object Detection สำหรับวิเคราะห์ภาพเอ็กซ์เรย์, MRI, CT scan การตรวจจับเนื้องอก กระดูกหัก พยาธิสภาพบนอุปกรณ์มือถือของแพทย์ YOLOv8-Nano บนแท็บเล็ต Android ตรวจจับก้อนเนื้อในปอดได้ใน 15–30 ms ด้วยความไว 89% และความจำเพาะ 93% (ข้อมูล NIH ChestX-ray14) ข้อกำหนด: การหาปริมาณ INT8 (ความเป็นส่วนตัวของข้อมูล), ค่า recall สูง (การพลาดพยาธิสภาพอันตรายกว่าการแจ้งเตือนเท็จ), เกณฑ์ความเชื่อมั่น < 0.4 การประมวลผลบนอุปกรณ์รับประกันความเป็นส่วนตัวของข้อมูลทางการแพทย์
คำถามที่พบบ่อย
Object Detection ส่งคืน bounding box สำหรับแต่ละวัตถุ — กรอบสี่เหลี่ยมที่ล้อมรอบวัตถุ Image Segmentation (เชิงความหมายหรือเชิง instance) ส่งคืนรูปร่างที่แม่นยำของวัตถุ — มาสก์ระดับพิกเซล การแบ่งส่วนแม่นยำกว่าแต่ช้ากว่า (50–300 ms เทียบกับ 10–30 ms สำหรับการตรวจจับ) สำหรับงานที่รูปร่างของวัตถุมีความสำคัญ (การแพทย์, AR) ให้ใช้การแบ่งส่วน สำหรับงานที่ตำแหน่งและการมีอยู่มีความสำคัญ (การนับ, การกลั่นกรอง) ให้ใช้การตรวจจับ MobileViT เป็นสถาปัตยกรรมที่แก้ปัญหาทั้งสองงาน
YOLOv8-Nano ฝึกบน COCO (80 คลาส) ML Kit Object Detection — 40+ คลาส (fashion, food, home, places) โมเดลที่กำหนดเองสามารถตรวจจับได้สูงสุด 100 คลาสบนอุปกรณ์มือถือโดยไม่สูญเสียประสิทธิภาพ เกิน 100 คลาส ความหน่วงจะเพิ่มขึ้นและ mAP จะลดลง สำหรับแอปพลิเคชันที่มี 1000+ คลาส ให้ใช้การจำแนกแบบลำดับชั้น: ขั้นแรกเป็นหมวดหมู่กว้าง (10 คลาส) จากนั้นเป็นหมวดหมู่ที่แม่นยำ (100 คลาสย่อย) EfficientNet + YOLO — แนวทางแบบลำดับชั้นสำหรับ 1000+ คลาสด้วยความหน่วง < 50 ms
ใช่ ML Kit Object Detection มีการติดตามในตัว: หลังจากตรวจจับในเฟรมแรก วัตถุจะถูกติดตามผ่านสตรีมวิดีโอโดยไม่ต้องตรวจจับซ้ำ สำหรับการติดตามที่ซับซ้อนมากขึ้น (วัตถุตัดกัน ออกจากเฟรม) ให้ใช้ ByteTrack หรือ BoT-SORT ByteTrack ทำงานบนพื้นฐานของ IoU (intersection over union) ระหว่าง bounding box ของเฟรมติดกัน — 85% MOTA บน MOT17 BoT-SORT ใช้การระบุซ้ำ (ReID) เพิ่มเติมเพื่อกู้คืนวัตถุที่สูญหาย — 90% MOTA
ส่งออก YOLOv8 ไปยัง Core ML: yolo export model=yolov8n.pt format=coreml int8 .mlpackage ที่ได้จะถูกรวมผ่าน VNCoreMLRequest (Vision Framework) ทางเลือก: YOLOv8 → TFLite → Core ML Delegate (iOS TFLite API) การส่งออก Ultralytics YOLOv8 Core ML รองรับ iOS 16+, การเร่ง ANE, การหาปริมาณ FP16 และ INT8 สำหรับการสตรีม ให้ใช้ AVFoundation + Vision พร้อมคำขอประสิทธิภาพ VNImageRequestHandler ซ้ำๆ แบบเรียลไทม์: 20–30 FPS บน iPhone 14 Pro
เพิ่มความหลากหลายของชุดข้อมูล (มุม แสง พื้นหลัง) — 500+ ภาพต่อคลาส ใช้การเสริมข้อมูล: mosaic, mixup, random perspective (การเสริมข้อมูลของ Ultralytics YOLOv8 — เพิ่ม mAP 2–5%) เพิ่มขนาดอินพุตเป็น 640x640 (แทน 320x320) — +4–8% mAP แต่ความหน่วง ×2 ใช้การหาปริมาณ FP16 หรือ INT8 หลังการฝึก — สูญเสีย mAP +0–1%, บีบอัด 4x สำหรับ iOS ให้ใช้ ANE (Neural Engine) ผ่าน Core ML Delegate — เร่งความเร็ว 3–5x เทียบกับ CPU
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ