จำแนกสายพันธ์ุหมากับแมวง่ายๆด้วยYoLoV5
Published: 2024-04-15 22:26:00


ถ้าเกิดเราอยากจะแยกสายพันธุ์ของน้องหมากับน้องแมวในรูปภาพหรือวัตถุอื่นๆ เราสามารถทำง่ายๆโดยการใช้ Object Detection ในการบอกว่าวัตถุในภาพคืออะไร

ในบทความนี้เราจะใช้ YoLoV5(You only look once)เป็นโมเดลอัลกอริทึ่มที่สามารถจับตรวจวัตถุหรือสิ่งต่างๆ ในรูปภาพหรือวีดีโอได้โดยที่เราไม่ต้องมานั่งบอกเองแต่เป็นการฝึก ตัวModel Ai ให้รู้จักสิ่งที่เราต้องการ

และในบทความจะทำการบอกวิธีการทำLabel วัตถุของDataset คร่าวๆเพื่อระบุว่าObject ในรูปคืออะไรและใช้ภาษา Python โดยเขียนผ่านทางPlatform "Google Colab" เพื่อแยกสายพันธุ์ของน้องหมาและน้องแมวเหมียวกัน 

## Prepare Dataset

**ขั้นตอนที่ 1**
เตรียม Dataset โดยเป็นรูปของหมาและแมวสายพันธฺุต่างๆ โดยเราสามารถหารูปมาเองได้ หรือจะใช้Datasetของ
https://www.kaggle.com/datasets/devdgohil/the-oxfordiiit-pet-dataset/data
โดยDataชุดนี้จะค่อนข้างมีข้อมูลมากพอสมควร ผมจึงขอหยิบเอาน้องหมาและน้องแมวมาอย่างละ 2 สายพันธุ์ คือ Samoyed,Shiba Inu,Abyssinian,Siamese มาอย่างละ 10 รูป

**ขั้นตอนที่ 2**
เข้าไป https://roboflow.com/ นำFiles Data ไปทำการLabel วัตถุในภาพ

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d25nz7845m7y780u22hn.png)
ตัวอย่างการ Annotate เพื่อระบุว่าเป็นสายพันธุ์อะไร

**ขั้นตอนที่ 3**
ทำการเพิ่มจำนวนของ Dataset อย่างเช่นการกลับรูปหรือการครอปรูปภาพเป็นต้น เป็นการสร้างรูปภาพให้มากขึ้น
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e3qqk5k4o21kshi5sjwj.png)

**ขั้นตอนที่ 4**
หลังGenerate ให้Export เป็น YOLO v5 PyTorch
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lilbb6t1rbldk23rgav4.png)

**ขั้นตอนที่ 5**
นำFile ที่ชื่อ "train" Upload ลง Google Drive
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4m99k1av7fy1p749zlib.png)


## Google Colab 

**ขั้นตอนที่ 6**
เราต้องทำการClone Repo ของตัวYoLoV5 และ Import Libraryต่างๆมาไว้ในGoogle Colab 
```
!git clone https://github.com/ultralytics/yolov5  # clone
%cd yolov5
%pip install -qr requirements.txt comet_ml  # install

import torch
import utils
display = utils.notebook_init()  # checks
```
หลังกด Run แล้วจะมีFolder ที่ชื่อ Yolov5 ที่ถูกCloneมา

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


***อย่าลืมเปลี่ยน Runtime ให้เป็น Gpu เพื่อความรวดเร็วในการTrain

**ขั้นตอนที่ 7**
เชื่อมGoogle Colab เข้ากับตัว Google Drive
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tohta4430ix3lxk2343a.png)

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


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

```
#@title Select YOLOv5 🚀 logger {run: 'auto'}
logger = 'Comet' #@param ['Comet', 'ClearML', 'TensorBoard']

if logger == 'Comet':
  %pip install -q comet_ml
  import comet_ml; comet_ml.init()
elif logger == 'ClearML':
  %pip install -q clearml
  import clearml; clearml.browser_login()
elif logger == 'TensorBoard':
  %load_ext tensorboard
  %tensorboard --logdir runs/train
```
เป็นการ Login เข้าComet เพื่อเอาไว้ใช้สำหรับดู Dashboard การTrain

**ขั้นตอนที่ 9**
Upload File ที่ชื่อ data.yaml ที่อยู่ในFolderที่เราได้จาก ขั้นตอนที่ 4(ในที่นี้ผมเปลี่ยนชื่อเป็นDataDogCat.yaml) ลงไปในFolder yolov5\data
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/it4wauj14m3yiqtdo405.png)
ต่อมาก็กดเข้าไปที่ไฟล์ DataDogCat.yaml และก็ให้ไป Copy PathของตัวFolder train ที่เราUploadเข้าGoogle Drive ตอนขั้นตอนที่5 มาวางตามที่ลูกศรชี้ไว้

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/veq379fgyzmjydderu1j.png)
**ขั้นตอนที่ 10**
ให้ทำการไปที่Folder yolov5\models\yolov5s.yaml แล้วทำการเปลี่ยนตรง nc: 80 เป็น 4 เพราะเราDataset ของเรามี4 classes เนื่องจากมี 4 สายพันธุ์(มาจากตอนเราทำการlabelแล้วจะมีให้กำหนด classของแต่ละObject)
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/73ufj3kc6rhatf384bvs.png)
**ขั้นตอนที่ 11**
```
!python train.py --img 640 --batch 16 --epochs 100 --data DataDogCat.yaml --weights yolov5s.pt --cache
```
ทำการ Train ตัวโมเดลโดยให้เปลี่ยนหลัง --data ให้เป็นชื่อไฟล์ "DataDogCat.yaml" --epochs 100 คือตัวกำหนดรอบในการTrain ยิ่งเยอะยิ่งทำให้แม่นยำมากยิ่งขึ้น ในครั้งนี้กำหนดไว้ 100 

**ขั้นตอนที่ 12**
หลัง Train เสร็จแล้วจะได้ url สำหรับดู Dashboard ต่อมาให้สร้างFolderใหม่ในyolov5 ชื่อ testdata และทำการUpload ไฟล์รูปภาพใหม่ที่ไม่ได้ถูกtrainของ หมาและแมวสายพันธุ์ที่เราเอามาtrain เพื่อเป็นการทดสอบ Model ที่เราTrain ว่าแม่นยำไหม

```
!python detect.py --weights /content/yolov5/runs/train/exp/weights/best.pt --img 640 --conf 0.25 --source testdata/
```
ให้ทำการใส่Pathของตัว File weight best.pt ของตัวที่เราTrainมาFolderที่สร้างใหม่ best.pt คือตัวที่ดีที่สุดที่เราได้จากการ train
**ขั้นตอนที่ 13**
เมื่อRun เสร็จแล้ว จะอยู่ใน runs/detect/exp 

## Result

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

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

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


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


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



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

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

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

## Conclusion
จากผลลัพธ์เห็นได้ว่า Yolov5 สามารถแยกระหว่างหมาและแมวแล้วก็สายพันธุ์ออกมาได้แต่เราจะเห็นได้ว่าบางรูปก็ไม่ถูกต้อง เนื่องจากเราทำการใช้รูปของแต่ละสายพันธุ์อย่างละ 10รูปแล้วเรามีถึง 4 สายพันธุ์ถึงแม้จะทำการเพิ่มปริมาณของ Dataแล้วแต่ก็เป็นแค่การนำรูปเดิมไปกลับรูป หรือแค่เพิ่ม noiseอื่นๆ ไม่เพียงพอสำหรับที่จะทำให้แม่นยำได้มากถ้าเพิ่มจำนวนของDataให้มากขึ้นและหาหลายๆมุมและทำการ Train มากขึ้นความแม่นยำก็จะสูงตาม

## 
Ref
https://www.youtube.com/watch?v=0GwnxFNfZhM
https://github.com/ultralytics/yolov5
https://dev.to/gfstealer666/kaaraich-yolo-alkrithuemainkaartrwcchcchabwatthu-object-detection-3lef
https://www.kaggle.com/datasets/devdgohil/the-oxfordiiit-pet-dataset/data