Camera Detection แบบ Real-time ด้วย YOLOv8
โค้ด Python ตัวอย่างการทำ Object Detection แบบ Real-time ด้วย YOLOv8 บนกล้องเว็บแคม โดยใช้ไลบรารี ultralytics
สำหรับ YOLOv8 และ opencv-python
(cv2) สำหรับการจัดการวิดีโอและแสดงผล

Python
import cv2
from ultralytics import YOLO
# โหลดโมเดล YOLOv8
# สามารถใช้โมเดลที่ผ่านการเทรนมาแล้ว เช่น 'yolov8n.pt' (nano), 'yolov8s.pt' (small)
# หรือโมเดลที่คุณเทรนเอง
# 'yolov8n.pt' เป็นโมเดลขนาดเล็กสุดและเร็วที่สุด เหมาะสำหรับการทดสอบเบื้องต้น
model = YOLO('yolov8s.pt')
# กำหนดแหล่งที่มาของวิดีโอ (กล้องโน้ตบุ๊ก)
# 0 คือกล้องหลักของระบบ (มักจะเป็นกล้อง Built-in ของโน้ตบุ๊ก)
# ถ้ามีกล้องหลายตัว อาจลองเปลี่ยนเป็น 1, 2, ...
cap = cv2.VideoCapture(1)
# ตรวจสอบว่ากล้องเปิดได้หรือไม่
if not cap.isOpened():
print("Error: Could not open webcam.")
exit()
print("Webcam opened successfully. Press 'q' to quit.")
while True:
# อ่านเฟรมจากกล้อง
ret, frame = cap.read()
# ตรวจสอบว่าอ่านเฟรมได้หรือไม่
if not ret:
print("Failed to grab frame.")
break
# ปรับขนาดเฟรมให้เล็กลง (Optional) เพื่อเพิ่มความเร็วในการประมวลผล
# โดยเฉพาะถ้าคุณใช้โมเดลที่ใหญ่ขึ้นหรือ CPU/GPU ไม่แรงมาก
# frame = cv2.resize(frame, (640, 480)) # ปรับเป็น 640x480 ถ้าต้องการ
# ทำ Object Detection ด้วย YOLOv8
# results จะเป็นลิสต์ของวัตถุที่ตรวจพบในเฟรมปัจจุบัน
# conf=0.5 หมายถึง Confidence Score ขั้นต่ำ 50%
results = model(frame, conf=0.5, verbose=False) # verbose=False เพื่อไม่ให้แสดง log มากเกินไป
# วาด Bounding Box และ Label ลงบนเฟรม
# YOLOv8 มีฟังก์ชัน plot() ในตัวที่สะดวกมาก
# results[0].plot() จะคืนค่าเฟรมที่มีการวาดทับ
annotated_frame = results[0].plot()
# แสดงผลเฟรมที่มีการตรวจจับวัตถุ
cv2.imshow('YOLOv8 Object Detection - Press Q to quit', annotated_frame)
# กด 'q' เพื่อออก
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# ปล่อยทรัพยากรกล้องและปิดหน้าต่าง
cap.release()
cv2.destroyAllWindows()
print("Application closed.")
คำอธิบายโค้ด
โค้ดนี้แบ่งออกเป็นส่วนหลัก ๆ ดังนี้ครับ:
1. การนำเข้าไลบรารี (Import Libraries)
Python
import cv2
from ultralytics import YOLO
import cv2
: นำเข้าไลบรารี OpenCV (Open Source Computer Vision Library) ซึ่งใช้สำหรับประมวลผลรูปภาพและวิดีโอ เช่น การอ่านเฟรมจากกล้อง การแสดงผลรูปภาพ การปรับขนาดรูปภาพ เป็นต้นfrom ultralytics import YOLO
: นำเข้าคลาสYOLO
จากไลบรารี Ultralytics ซึ่งเป็นไลบรารีอย่างเป็นทางการสำหรับโมเดล YOLOv8 ใช้สำหรับโหลดโมเดล ทำการตรวจจับวัตถุ และจัดการผลลัพธ์
2. การโหลดโมเดล YOLOv8 (Load YOLOv8 Model)
Python
# โหลดโมเดล YOLOv8
# สามารถใช้โมเดลที่ผ่านการเทรนมาแล้ว เช่น 'yolov8n.pt' (nano), 'yolov8s.pt' (small)
# หรือโมเดลที่คุณเทรนเอง
# 'yolov8n.pt' เป็นโมเดลขนาดเล็กสุดและเร็วที่สุด เหมาะสำหรับการทดสอบเบื้องต้น
model = YOLO('yolov8s.pt')
model = YOLO('yolov8s.pt')
: เป็นการสร้าง Instance ของโมเดล YOLO โดยระบุชื่อไฟล์.pt
ซึ่งเป็นไฟล์น้ำหนัก (weights) ของโมเดลที่ผ่านการเทรนมาแล้ว- ในตัวอย่างนี้ใช้
'yolov8s.pt'
ซึ่งเป็นโมเดล YOLOv8 ขนาด “small” มีความแม่นยำและใช้ทรัพยากรปานกลาง - คุณสามารถเปลี่ยนเป็น
'yolov8n.pt'
(nano) เพื่อความเร็วสูงสุด หรือ'yolov8m.pt'
,'yolov8l.pt'
,'yolov8x.pt'
สำหรับโมเดลที่ใหญ่ขึ้นและแม่นยำกว่า แต่ก็จะใช้ทรัพยากรและเวลาประมวลผลมากขึ้น - หากคุณมีโมเดลที่เทรนเอง คุณสามารถระบุพาธไปยังไฟล์
.pt
ของคุณได้เลย เช่นmodel = YOLO('path/to/your/custom_model.pt')
- ในตัวอย่างนี้ใช้
3. กำหนดแหล่งที่มาของวิดีโอ (Set Video Source)
Python
# กำหนดแหล่งที่มาของวิดีโอ (กล้องโน้ตบุ๊ก)
# 0 คือกล้องหลักของระบบ (มักจะเป็นกล้อง Built-in ของโน้ตบุ๊ก)
# ถ้ามีกล้องหลายตัว อาจลองเปลี่ยนเป็น 1, 2, ...
cap = cv2.VideoCapture(1)
cap = cv2.VideoCapture(1)
: เป็นการสร้าง ObjectVideoCapture
จาก OpenCV เพื่อเชื่อมต่อกับกล้อง- พารามิเตอร์
1
หมายถึงการเลือกกล้องเว็บแคมตัวที่สองที่ระบบรู้จัก (โดยปกติ0
จะเป็นกล้องหลักหรือกล้อง Built-in ของโน้ตบุ๊ก) หากคุณมีกล้องตัวเดียวและโค้ดไม่ทำงาน ให้ลองเปลี่ยนเป็น0
- พารามิเตอร์
4. ตรวจสอบการเปิดกล้อง (Check Webcam Status)
Python
# ตรวจสอบว่ากล้องเปิดได้หรือไม่
if not cap.isOpened():
print("Error: Could not open webcam.")
exit()
print("Webcam opened successfully. Press 'q' to quit.")
if not cap.isOpened():
: ตรวจสอบว่าVideoCapture
สามารถเชื่อมต่อกับกล้องได้สำเร็จหรือไม่ หากไม่สำเร็จจะแสดงข้อความ Error และปิดโปรแกรม
5. ลูปหลักสำหรับการตรวจจับวัตถุ (Main Loop for Object Detection)
Python
while True:
# อ่านเฟรมจากกล้อง
ret, frame = cap.read()
# ตรวจสอบว่าอ่านเฟรมได้หรือไม่
if not ret:
print("Failed to grab frame.")
break
# ปรับขนาดเฟรมให้เล็กลง (Optional) เพื่อเพิ่มความเร็วในการประมวลผล
# โดยเฉพาะถ้าคุณใช้โมเดลที่ใหญ่ขึ้นหรือ CPU/GPU ไม่แรงมาก
# frame = cv2.resize(frame, (640, 480)) # ปรับเป็น 640x480 ถ้าต้องการ
# ทำ Object Detection ด้วย YOLOv8
# results จะเป็นลิสต์ของวัตถุที่ตรวจพบในเฟรมปัจจุบัน
# conf=0.5 หมายถึง Confidence Score ขั้นต่ำ 50%
results = model(frame, conf=0.5, verbose=False) # verbose=False เพื่อไม่ให้แสดง log มากเกินไป
# วาด Bounding Box และ Label ลงบนเฟรม
# YOLOv8 มีฟังก์ชัน plot() ในตัวที่สะดวกมาก
# results[0].plot() จะคืนค่าเฟรมที่มีการวาดทับ
annotated_frame = results[0].plot()
# แสดงผลเฟรมที่มีการตรวจจับวัตถุ
cv2.imshow('YOLOv8 Object Detection - Press Q to quit', annotated_frame)
# กด 'q' เพื่อออก
if cv2.waitKey(1) & 0xFF == ord('q'):
break
while True:
: สร้างลูปไม่รู้จบเพื่อให้โปรแกรมทำงานต่อเนื่องและประมวลผลเฟรมจากกล้องไปเรื่อย ๆret, frame = cap.read()
: อ่านเฟรมวิดีโอจากกล้องret
: ค่าบูลีน (True/False) บอกว่าอ่านเฟรมได้สำเร็จหรือไม่frame
: อาร์เรย์ NumPy ที่แทนรูปภาพของเฟรมที่อ่านได้
if not ret: break
: หากอ่านเฟรมไม่ได้ (เช่น กล้องหลุด หรือวิดีโอจบ) จะออกจากลูป(Optional) frame = cv2.resize(frame, (640, 480))
: บรรทัดนี้ถูก Comment ไว้ แต่ถ้าคุณต้องการลดขนาดเฟรมก่อนส่งให้โมเดลประมวลผล เพื่อเพิ่มความเร็ว โดยเฉพาะกับโมเดลที่ใหญ่ขึ้นหรือฮาร์ดแวร์ไม่แรง คุณสามารถเปิดใช้งานบรรทัดนี้ได้results = model(frame, conf=0.5, verbose=False)
: นี่คือส่วนสำคัญที่ใช้โมเดล YOLOv8 ในการทำ Object Detectionmodel(frame)
: ส่งเฟรมรูปภาพเข้าไปให้โมเดลประมวลผลconf=0.5
: กำหนด Confidence Threshold ที่ 0.5 (50%) หมายความว่า โมเดลจะแสดงผลการตรวจจับเฉพาะวัตถุที่มัน “มั่นใจ” ว่าเป็นวัตถุนั้น ๆ มากกว่าหรือเท่ากับ 50% เท่านั้นverbose=False
: ปิดการแสดง Log การประมวลผลบน Console เพื่อไม่ให้มีข้อความเยอะเกินไปในระหว่างรันresults
: จะเป็นลิสต์ของผลลัพธ์การตรวจจับ โดยแต่ละ Element ในลิสต์จะแทนผลลัพธ์ของแต่ละรูปภาพที่ส่งเข้าไป (ในกรณีนี้คือเฟรมเดียว)
annotated_frame = results[0].plot()
: เป็นฟังก์ชันที่สะดวกมากของ Ultralytics ที่จะ วาด Bounding Box (กรอบสี่เหลี่ยมรอบวัตถุ) และ Label (ชื่อคลาสและคะแนนความมั่นใจ) ลงบนเฟรม โดยอัตโนมัติ และคืนค่าเฟรมที่ถูกวาดทับแล้วcv2.imshow('YOLOv8 Object Detection - Press Q to quit', annotated_frame)
: แสดงผลเฟรมที่ถูกวาดทับแล้วในหน้าต่างชื่อ ‘YOLOv8 Object Detection – Press Q to quit’if cv2.waitKey(1) & 0xFF == ord('q'): break
: รอรับการกดแป้นพิมพ์ 1 มิลลิวินาทีcv2.waitKey(1)
: รอการกดปุ่มเป็นเวลา 1 มิลลิวินาทีord('q')
: ค่า ASCII ของตัวอักษร ‘q’& 0xFF
: เป็นการ Mask เพื่อให้ได้ค่า Key ที่ถูกต้อง- หากผู้ใช้กดปุ่ม ‘q’ โปรแกรมจะออกจากลูป
while True
6. การปล่อยทรัพยากรและปิดโปรแกรม (Release Resources and Close)
Python
# ปล่อยทรัพยากรกล้องและปิดหน้าต่าง
cap.release()
cv2.destroyAllWindows()
print("Application closed.")
cap.release()
: ปล่อยทรัพยากรของกล้องที่ถูกใช้งานอยู่cv2.destroyAllWindows()
: ปิดหน้าต่าง OpenCV ทั้งหมดที่ถูกสร้างขึ้นมาprint("Application closed.")
: แสดงข้อความว่าโปรแกรมปิดแล้ว
วิธีการใช้งาน (How to Use)
ก่อนรันโค้ดนี้ คุณต้องติดตั้งไลบรารีที่จำเป็นก่อน:
- เปิด Terminal หรือ Command Prompt (สำหรับ Windows) / Terminal (สำหรับ macOS/Linux)
- ติดตั้ง
ultralytics
:Bashpip install ultralytics
- ติดตั้ง
opencv-python
:Bashpip install opencv-python
- บันทึกโค้ด: คัดลอกโค้ดที่คุณให้มา แล้วบันทึกเป็นไฟล์
.py
เช่นyolo_webcam.py
- รันโค้ด: ไปยังไดเรกทอรีที่คุณบันทึกไฟล์ไว้ใน Terminal แล้วรันคำสั่ง:Bash
python yolo_webcam.py
หลังจากรันโค้ดแล้ว:
- จะมีหน้าต่างแสดงผลจากกล้องเว็บแคมของคุณปรากฏขึ้น
- YOLOv8 จะทำการตรวจจับวัตถุต่าง ๆ ที่อยู่ในเฟรมแบบ Real-time และวาดกรอบพร้อมป้ายชื่อลงบนวัตถุที่ตรวจพบ
- หากต้องการหยุดโปรแกรม ให้กดปุ่ม ‘q’ บนคีย์บอร์ด
ข้อแนะนำเพิ่มเติม
- ประสิทธิภาพ: หากคุณพบว่าการประมวลผลช้า ลองเปลี่ยนโมเดลเป็น
'yolov8n.pt'
หรือเปิดใช้งานบรรทัดframe = cv2.resize(frame, (640, 480))
- การเลือกกล้อง: หากกล้องไม่เปิด ให้ลองเปลี่ยนค่าใน
cv2.VideoCapture()
จาก1
เป็น0
หรือค่าอื่น ๆ (ขึ้นอยู่กับจำนวนและลำดับของกล้องที่เชื่อมต่อกับคอมพิวเตอร์ของคุณ) - ความแม่นยำ: การปรับค่า
conf
(confidence threshold) สามารถส่งผลต่อความแม่นยำในการแสดงผลได้ ค่าที่ต่ำลงจะทำให้ตรวจจับวัตถุได้มากขึ้น (แต่ก็อาจมี False Positives เพิ่มขึ้น) ค่าที่สูงขึ้นจะทำให้ผลลัพธ์แม่นยำขึ้น (แต่อาจพลาดวัตถุบางอย่างที่คะแนนต่ำ)
หวังว่าคำอธิบายนี้จะช่วยให้คุณเข้าใจโค้ดได้ดียิ่งขึ้นนะครับ! มีคำถามเพิ่มเติมไหมครับ?