การใช้ YOLO อัลกอริทึ่มในการตรวจจับวัตถุ (Object detection)
Tags: python, deeplearning, yolo, tutorial
Published: 2023-04-11 14:23:51


**ก่อนอื่นเรามาทำความรู้จัก YOLO กันก่อน**
**YOLO คืออะไร?**

YOLO ย่อมากจาก "You Only Look Once" เป็นโมเดลอัลกอริทั่มในการตรวจจับวัตถุ
ที่ถูกสร้างขึ้นโดยนายJoseph Redmon 

**หลักการทำงานคร่าวๆของ YOLO** คือการแบ่งภาพออกเป็นช่องๆขนาด N*N หละจะใช้อัลกอริทั่มคำนวนค่าความเป็นไปได้ของข่องนั้นๆ ว่าจะเป็นวัตถุที่อยู่ใน dataset หรือไม่


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mcbh9enanta5bsvnan1k.png)

**หัวข้อถัดไป การตรวจจับวัตถุ**
**การตรวจจับวัตถุคืออะไร?**

การตรวจจับวัตถุ หรือ _Object Detection_ คือความสามารถในการตรวจจับวัตถุและบ่งบอกว่าวัตถุนั้นคืออะไรได้อย่างถูกต้อง 
โดยเป็นหนึ่งในหน้าที่การทำงานของเทคโนโลยี Computer vision ที่จะทำการฝึกฝนระบบ AI คอมพิวเตอร์
ให้สามารถมองเห็นและเข้าใจในสิ่งที่มนุษย์สามารถทำได้ผ่านการรับค่ารูปภาพ วิดิโอต่างๆ โดยเป็น Object detection 
นั้นเป็น Machine learning แบบ **Deep learning** เนื่องจากเป็นการสอนและฝึกฝนAI ให้ทำหน้าที่ได้เหมือนมนุษย์ 

โดย ณ ปัจจุบัน YOLO มีถึง Version 8 ในบทความนี้เราจะใช้ YOLOV5 โดยจะต่างกันตรง Feature ที่เพิ่มเข้ามาในเวอร์ชั่นหลังๆนั้นเอง

เอาหละ เมื่อเกริ่นคร่าวๆเสร็จแล้วเรามาเริ่มกันเลยดีกว่า!

**ขั้นตอนแรก**

เปิด Google Colab ใช่แล้วเราจะใช้ Google Colab ในบทความนี้ เนื่องจากว่าเป็นภาษา Python และจำเป็นติดตั้ง Library ค่อนข้างเยอะ
เราเลยตัดปัญหาใช้ Google colabเลยง่ายดี ลิ้งไป [Google Colab](https://colab.research.google.com/)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k5qp3vlgwggc2imkjope.png)

ให้ทำการสร้าง notebook อันใหม่ขึ้นมาโล่ด!
**อย่าลืมเปลี่ยนชื่อ notebook ด้วยนะจะได้ไม่สับสนทีหลัง**


**ขั้นตอนที่ 2**
โคลนลิ้ง Git hub ของ YoloV5 มาลงโฟลเดอร์ภายใน Colab โดยใช้ชุดโค้ดคำสั่งดังนี้

```
!git clone https://github.com/ultralytics/yolov5  
%cd yolov5
%pip install -qr requirements.txt  
```

และจากนั้นจะมีโฟลเดอร์ชื่อ yolov5 มาแบบนี้ 


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jju8wqi66eb40vagdewp.png)


**ข้อควรระวัง!!! ถ้ากดรัน Code นี้หลายๆรอบ จะทำให้โฟลเดอร์ซ้อนกันเรื่อยๆแบบนี้ จะมีปัญหาในการดึงค่า path ภายหลัง**


**ขั้นตอนที่ 3** 


รันโค้ดชุดนี้ เพื่อ import library เพิ่มเติม

```
import torch
from yolov5 import utils
display = utils.notebook_init() 
```

ถ้าใครมีปัญหาแนะนำให้ดูเรื่อง Path ของโฟลเดอร์ yolov5 ดีๆ
รันเสร็จจะได้แบบนี้ 

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/06nqtj5iiyxt6u9t11v7.png)


**ขั้นตอนที่ 4**


จัดเตรียม dataset ในการเทรน model ของเรา
โดยในบทความครั้งนี้จะใช้ไฟล์ชื่อ coco128.yaml เนื่องจากเป็นไฟล์ที่ YOLOV5 มีในตัว ถือว่าค่อนข้างสะดวก
หรือถ้าอยากจะเทรน dataset แบบ custom สามารถไปแก้ไขภายในไฟล์ได้
ใช้โค้ดชุดนี้ในการรันคำสั่ง 

```
!python train.py --img 640 --batch 8 --epochs 10 --data coco128.yaml --weights yolov5s.pt --cache
```
**โดยค่าข้างในเราสามารถปรับแต่งเองได้ ดังนี้**

1. image จะกำหนดค่าขนาดของภาพที่ใช้ในการเทรน
2. batch จะเป็นการแบ่ง datasetให้เล็กลง ว่าจะหารเท่าไร (ในที่นี้คือ 128/8 จะได้เท่ากับ 16)
3. epochs ให้เทรนทั้งหมดกี่ครั้งหลังจากรัน batch ทั้งหมด จะเพิ่มค่าความแม่นยำ
4. data ไฟล์ที่จะใช้เทรนในที่นี้คือ coco128.yaml
5. weights output ไฟล์ที่เทรนเสร็จแล้ว

**ทริค!! ในส่วนของ cache ใช้คำสั่ง --cache ram หรือ --cache disk ในการทำให้เทรนเร็วขึ้นแต่กินสเปคคอมนะจ๊ะ**


**ขั้นตอนที่ 5**

รอเทรน ใช่แล้วรอเทรนให้เสร็จยังไงหละ รออย่างเดียวจะค่อนข้างนาน
โดยจะรันทั้งหมดตามค่า epochs ว่ากี่รอบโดยเริ่มจาก 0 
ในที่นี้ก็คือ 0-9 รอบ รอไป!

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sxlfv6u9rgyalklh0ydq.png)

ใช้เวลาค่อนข้างนานยิ่งถ้าไม่ได้ใช้ ram หรือ disk หละก็อย่างต่ำครึ่งชม.ต้องมา

เทรนเสร็จแล้ว! จะได้ภาพคร่าวๆดังนี้

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/on6wkrvpklhtiehscmfu.png)

และดูว่าไฟล์จะไปเซฟที่ไหน ถ้าเกิดเราเทรนหลายๆครั้งและยกเลิกชื่อโฟลเดอร์จะเปลี่ยนไป
**ให้หาโฟลเดอร์ชื่อ weight/ และใช้ไฟล์ best.pt แบบนี้** 


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lj074cvt9efucjpgwnqq.png)


**ขั้นตอนที่ 6**

อัพภาพขึ้น Google colab สามารถข้ามตรงนี้ได้ถ้าอยากอัพไฟล์ขึ้นเอง

**โดยจะใช้โค้ดคำสั่งชุดนี้ **

```
from google.colab import files
uploaded = files.upload()
```


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/89p5orvjtnuyhyui91fe.png)

หละก็อัพโหลดภาพขึ้นโหลดหลังจากนั้นจะแก้ชื่อภาพหรือย้ายไปโฟลเดอร์ไหนตามใจได้เลยจ้า

พอได้มากดคลิ๊กขวา! แหละ Copy path มันมาซะ เราจะเอาไปใช้ในขั้นตอนต่อไป!


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zcv5neh0piu0nz5g5axj.png)


**ขั้นตอนที่ 7**

ได้เวลาแห่งความจริงในการตรวจจับภาพ


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xqz0jyu0uxa26e8ovrbx.jpg)


ใช้โค้ดคำสั่งชุดนี้ในการรัน

```
!python detect.py --source /content/yolov5/myfriend.jpg --weights /content/yolov5/runs/train/exp/weights/best.pt
```

โดยหาไฟล์ชื่อ detect.py ให้เจอนะ ถ้าใครไม่มี! กลับไปขั้นตอนที่ 2 ด่วน

ต่อมาคือการ**ใช้ path ไฟล์**

--source คือ ต่ำแหน่งของภาพที่ก็อปมาเมื่อกี้ มาวางตรงนี้โล่ด
--weight คือ model ที่เราเทรนเสร็จแล้ว copy path ไฟล์ best.pt มาแปะ


**แล้วก็รันโล่ด!!!**


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9yipcau5ood94pbk72qu.png)

จะได้ผลลัพธ์ออกมาประมาณนี้ 
**เนื่องจากกำหนดขนาดไฟล์ภาพเป็น 640 ภาพเลยจะมีขนาดแคบกว่าปกติ**


ตัวอย่างที่ 1 : 
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ebdpw024akkaufam38h7.jpg)



ตัวอย่างที่ 2 :

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p83uk6purd0uys8kdlnd.jpg)


ตัวอย่างที่ 3 :


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9hw5a6tyd6goxtzz0u23.jpg)




****เห็นว่าจะมี error อยู่ตรงหน้ากากปิดหน้าที่ AI ตรวจจับเป็นโทรศัพท์มือถือแทน แนะนำว่าควรเพิ่มจำนวนครั้งที่เทรน เพื่อเพิ่มค่าความแม่นยำขึ้น****


และนี้ก็เป็น Tutorial คร่าวๆสำหรับผู้เริ่มใช้ YoloV5 อัลกอริทึ่มในการทำ Object detectionแบบเริ่มต้นนะครับ ขอบคุณที่อ่านมาจนจบถึงตอนนี้ หวังว่าบทความนี้จะเป็นประโยชน์ไม่น้อยก็มากต่อผู้อ่านนะครับ **ขอบคุณครับผม**!

**Reference ทั้งหมดที่ใช้นะ**
เนื่องจากบล็อกนี้เขียนขึ้นมาใหม่เอง 
เป็นการรรวมกันของหลายๆเว็บจึงมีเรฟค่อนข้างเยอะ

- https://www.datacamp.com/blog/yolo-object-detection-explained
- https://www.analyticsvidhya.com/blog/2022/06/yolo-algorithm-for-custom-object-detection/
- https://github.com/ultralytics/yolov5/wiki#tutorials
- https://www.v7labs.com/blog/yolo-object-detection#:~:text=YOLO%20(You%20Only%20Look%20Once,for%20its%20speed%20and%20accuracy.
- https://docs.ultralytics.com/yolov5/train_custom_data/
- [https://medium.com/@model.predict/epoch](https://medium.com/@model.predict/epoch-%E0%B8%81%E0%B8%B1%E0%B8%9A-iterations-%E0%B9%81%E0%B8%A5%E0%B8%B0-batch-size-%E0%B9%81%E0%B8%95%E0%B8%81%E0%B8%95%E0%B9%88%E0%B8%B2%E0%B8%87%E0%B8%81%E0%B8%B1%E0%B8%99%E0%B8%AD%E0%B8%A2%E0%B9%88%E0%B8%B2%E0%B8%87%E0%B9%84%E0%B8%A3-c16f1c6a0c8e)