YOLO คืออะไร ?? ในงาน object detection

Grassroot Engineer
3 min readDec 20, 2020

--

https://pjreddie.com/darknet/yolo/

YOLO หรือ You Only Look Once คือ Realtime Object Detection Model ที่มีความโดดเด่นเรื่องความเร็วและความถูกต้อง

หลักการของมันคือ ถ้ามีรูปหมาน้อย, จักรยาน และรถบรรทุกอยู่ด้านหลังแบบนี้ มันก็จะพยายาม rectangle object เหล่านั้นไว้ (โดยหาจุดกึ่งกลางของแต่ละ object แล้วค่อยครอบ box เอาไว้) และบอกออกมาว่าสิ่งนั้นคืออะไร โดยมี model พื้นฐานอยู่แล้วประมาณ 80 classes ที่ถูกเทรนเอาไว้ และสามารถบอกได้ด้วยว่าความน่าจะเป็นมีเท่าไหร่ จาก model ที่มี

ความโดดเด่นของ YOLO คือ สามารถ detect แม้กระทั่งวัตถุที่มันซ้อนกันได้ด้วย โดยมีโครงสร้างที่ค่อนข้างซับซ้อนของ grid ในแต่ละชั้นที่เล็กลงเรื่อยๆในแต่ละ Layers

โครงสร้างของ YOLO ที่เป็นชั้นๆ แบบ neural network (แต่ละชั้นจะมีการทำงานหลายกระบวนการ) grid จะถี่ขึ้นเรื่อยๆ 3 > 32 > 64 > 128 > 256 … ไปเรื่อยๆ จนได้ผลลัพธ์ที่ดี

ปัจจุบัน YOLO มาถึง version ที่ 5 แล้วโดยมีหลายแบบจำลองให้เลือกใช้ (และมีโครงสร้างที่ไม่เหมือนกัน) => github

AP = ความถูกต้อง ยิ่งเยอะยิ่งดี
ตารางเปรียบเทียบ ความถูกต้อง (AP) และ ความเร็ว (FPS ที่รันด้วย GPU), YOLOv3-SPP คือตัวปัจจุบันที่ยังใช้งานกันเยอะ แต่ตอนนี้พัฒนากันเร็วมากจนถึง version 5 แล้ว ซึ่ง performance ดีกว่าแล้ว

YOLOv5s คือ ชั้นที่น้อยที่สุด (อันบน) จะสังเกตุว่าความเร็วค่อนข้างดีมาก 416 และใช้ parameters ที่ใช้ทำแบบจำลองทั้งหมด 7.5 ล้าน

แต่ถ้าอยากให้แบบจำลองดีขึ้น อาจเลือกใช้ YOLOv5m ก็จะถูกต้องขึ้น แต่ความเร็วก้อจะตกลง

ณ ตอนนี้จะมีให้ใช้งานที่สามารถโหลด model เหล่านี้มาใช้ได้เลยคือ
YOLOv5s, m, l ,x ซึ่งเขาได้เทรนไว้หมดแล้ว

เริ่มใช้กันเลยนะคับ (Activate เข้าไปใน Python env ที่เราจะใช้งานก่อนนะคับ)

  1. เข้าไปโหลดที่ github เข้ามาเลย
git clone https://github.com/ultralytics/yolov5

2. ให้ติดตั้ง lib ที่ต้องใช้ทั้งหมด (กรณีที่ไม่มี pip ก้อให้ติดตั้งแยกตามไฟล์ใน requirements.txt นะคับ)

pip install -r requirements.txt

# package ที่สำคัญในการทำ machine learning ใน project นี้คือ pytorch นะคับ (ทั่วไปตอนนี้จะใช้ tensorflow กับ torch)
ถ้าลงสำเร็จแล้ว ลองเข้าไปใน python3 ทดสอบ

import torch # ต้องไม่มี error เกิดขึ้นนะ ถ้า import สำเร็จ

3. เข้าไปใน folder “yolov5” ที่ download มา และลองรันคำสั่ง (เรียกกล้องใช้งาน)

python detect.py --source 0
options แบบต่างๆ ในการ run detect.py

เมื่อเรียกใช้ source 0 จะเป็นการเรียก webcam ของ Laptop

ปิดหน้าปิดตาไว้ แต่ก้อ detect ได้ว่ามีความเป็นคนอยุ่ 55%

ps: ในกรณีที่ไม่สามารถ run ได้และมี error “Error #15: Initializing libiomp5.dylib, but found libiomp5.dylib already initialized” ประมาณนี้ให้เข้าไปเพิ่ม code ใน detect.py นะคับ อ้างอิงจาก github

import os

os.environ['KMP_DUPLICATE_LIB_OK']='True'
เพิ่มบริเวณที่ highlight เข้าไปนะคับ

4. จากด้านบนเป็นการ run ผ่าน VDO โดยเราสามารถเลือก import รูปเข้าไปทดสอบได้เช่นกัน โดย ให้นำรูปที่ต้องการ detect เก็บลงใน

yolov5/data/images

จากนั้นจึง run ด้วย

python detect.py
detect image
Example ในการ detect images Link

เพิ่มเติมนะคับ ในกรณีที่เราต้องการเปลี่ยน weight เพื่อให้มีความแม่นยำขึ้น เราสามารถเข้าไปเลือก download models ต่างๆตามที่เราต้องการได้ที่นี่นะคับ

https://github.com/ultralytics/yolov5/releases

เรียงตามลำดับจาก accuracy ต่ำ ถึง สูง (5l to 5x) จากนั้นนำ file.pt ที่โหลดได้มาเก็บไว้ที่ folder yolov5 (ตำแหน่งที่อยู่ของ yolo หลัก) ของเรานะคับ

จากในรูป จะมี model yolo อยู่ 2 ตัวนะคับ คือ 5s และ 5x

ที่นี้ค่า options ต่างๆจริงๆแล้วก็มาจาก detect.py นะคับ

จากรูปเป็นการลองเปลี่ยน model แล้วเรียกใช้งานด้วย model yolov5x.pt แทน

จะเห็นว่ามี options ต่างๆให้เรียกใช้มากมายนะคับ ขอยกตัวอย่างแบบนี้

python detect.py --weight yolov5x.pt 
# เป็นการเปลี่ยน model มาใช้ yolov5x.pt
python detect.py --source
# ถ้าเราไม่ใส่จะเป็น 'data/images' นะ
python detect.py --conf 0.25
# conf-thres คือ ค่าที่น้อยที่สุดที่จะโชว์ หรือ ค่าความแม่นยำ (ถ้าต่ำกว่า 0.25 จะไม่โชว์)ถ้าต้องการความแม่นยำมากๆก้อให้ตั้งให้สูงขึ้นได้ แต่ก้อจะโชว์น้อยลง
python detect.py --iou 0.45
# iou-thres คือ ค่าที่ในกรณีที่รูป intersect กัน (ซ้อนกันเยอะๆ) จะนำค่าที่มากกว่า 0.45 เท่านั้นถึงจะโชว์
python detect.py --class 0 67
# เป็นการระบุเฉพาะบาง class เท่านั้นที่ต้องการ detect เช่น เรารู้อยู่แล้วว่า class0=คน และ class67=cell phone นั่นคือจะมีการ filter เฉพาะแค่คนกับโทรศัพท์เท่านั้น

ในการเรียกใช้งาน เราสามารถเพิ่ม param เข้าไปได้เรื่อยๆเลยเช่น

python detect.py --weight yolov5x.pt --class 0 67 --conf 0.25

สำหรับ 80 classes ที่ YOLO ได้เทรนไว้ให้แล้ว มีดังนี้นะคับ

80 classes in YOLO

--

--