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): เป็นการสร้าง Object VideoCapture จาก 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 Detection
    • model(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)

ก่อนรันโค้ดนี้ คุณต้องติดตั้งไลบรารีที่จำเป็นก่อน:

  1. เปิด Terminal หรือ Command Prompt (สำหรับ Windows) / Terminal (สำหรับ macOS/Linux)
  2. ติดตั้ง ultralytics:Bashpip install ultralytics
  3. ติดตั้ง opencv-python:Bashpip install opencv-python
  4. บันทึกโค้ด: คัดลอกโค้ดที่คุณให้มา แล้วบันทึกเป็นไฟล์ .py เช่น yolo_webcam.py
  5. รันโค้ด: ไปยังไดเรกทอรีที่คุณบันทึกไฟล์ไว้ใน Terminal แล้วรันคำสั่ง:Bashpython yolo_webcam.py

หลังจากรันโค้ดแล้ว:

  • จะมีหน้าต่างแสดงผลจากกล้องเว็บแคมของคุณปรากฏขึ้น
  • YOLOv8 จะทำการตรวจจับวัตถุต่าง ๆ ที่อยู่ในเฟรมแบบ Real-time และวาดกรอบพร้อมป้ายชื่อลงบนวัตถุที่ตรวจพบ
  • หากต้องการหยุดโปรแกรม ให้กดปุ่ม ‘q’ บนคีย์บอร์ด

ข้อแนะนำเพิ่มเติม

  • ประสิทธิภาพ: หากคุณพบว่าการประมวลผลช้า ลองเปลี่ยนโมเดลเป็น 'yolov8n.pt' หรือเปิดใช้งานบรรทัด frame = cv2.resize(frame, (640, 480))
  • การเลือกกล้อง: หากกล้องไม่เปิด ให้ลองเปลี่ยนค่าใน cv2.VideoCapture() จาก 1 เป็น 0 หรือค่าอื่น ๆ (ขึ้นอยู่กับจำนวนและลำดับของกล้องที่เชื่อมต่อกับคอมพิวเตอร์ของคุณ)
  • ความแม่นยำ: การปรับค่า conf (confidence threshold) สามารถส่งผลต่อความแม่นยำในการแสดงผลได้ ค่าที่ต่ำลงจะทำให้ตรวจจับวัตถุได้มากขึ้น (แต่ก็อาจมี False Positives เพิ่มขึ้น) ค่าที่สูงขึ้นจะทำให้ผลลัพธ์แม่นยำขึ้น (แต่อาจพลาดวัตถุบางอย่างที่คะแนนต่ำ)

หวังว่าคำอธิบายนี้จะช่วยให้คุณเข้าใจโค้ดได้ดียิ่งขึ้นนะครับ! มีคำถามเพิ่มเติมไหมครับ?

เราใช้คุกกี้เพื่อพัฒนาประสิทธิภาพ และประสบการณ์ที่ดีในการใช้เว็บไซต์ของคุณ คุณสามารถศึกษารายละเอียดได้ที่ นโยบายความเป็นส่วนตัว และสามารถจัดการความเป็นส่วนตัวเองได้ของคุณได้เองโดยคลิกที่ ตั้งค่า

ตั้งค่าความเป็นส่วนตัว

คุณสามารถเลือกการตั้งค่าคุกกี้โดยเปิด/ปิด คุกกี้ในแต่ละประเภทได้ตามความต้องการ ยกเว้น คุกกี้ที่จำเป็น

ยอมรับทั้งหมด
จัดการความเป็นส่วนตัว
  • เปิดใช้งานตลอด

บันทึกการตั้งค่า