DEV Community

Cover image for จำแนกสายพันธ์ุหมากับแมวง่ายๆด้วยYoLoV5
Prapie96
Prapie96

Posted on

จำแนกสายพันธ์ุหมากับแมวง่ายๆด้วยYoLoV5

ถ้าเกิดเราอยากจะแยกสายพันธุ์ของน้องหมากับน้องแมวในรูปภาพหรือวัตถุอื่นๆ เราสามารถทำง่ายๆโดยการใช้ 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
ตัวอย่างการ Annotate เพื่อระบุว่าเป็นสายพันธุ์อะไร

ขั้นตอนที่ 3
ทำการเพิ่มจำนวนของ Dataset อย่างเช่นการกลับรูปหรือการครอปรูปภาพเป็นต้น เป็นการสร้างรูปภาพให้มากขึ้น
Image description

ขั้นตอนที่ 4
หลังGenerate ให้Export เป็น YOLO v5 PyTorch
Image description

ขั้นตอนที่ 5
นำFile ที่ชื่อ "train" Upload ลง Google Drive
Image description

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
Enter fullscreen mode Exit fullscreen mode

หลังกด Run แล้วจะมีFolder ที่ชื่อ Yolov5 ที่ถูกCloneมา

Image description

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

ขั้นตอนที่ 7
เชื่อมGoogle Colab เข้ากับตัว Google Drive
Image description

Image description

ขั้นตอนที่ 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
Enter fullscreen mode Exit fullscreen mode

เป็นการ Login เข้าComet เพื่อเอาไว้ใช้สำหรับดู Dashboard การTrain

ขั้นตอนที่ 9
Upload File ที่ชื่อ data.yaml ที่อยู่ในFolderที่เราได้จาก ขั้นตอนที่ 4(ในที่นี้ผมเปลี่ยนชื่อเป็นDataDogCat.yaml) ลงไปในFolder yolov5\data
Image description
ต่อมาก็กดเข้าไปที่ไฟล์ DataDogCat.yaml และก็ให้ไป Copy PathของตัวFolder train ที่เราUploadเข้าGoogle Drive ตอนขั้นตอนที่5 มาวางตามที่ลูกศรชี้ไว้

Image description
ขั้นตอนที่ 10
ให้ทำการไปที่Folder yolov5\models\yolov5s.yaml แล้วทำการเปลี่ยนตรง nc: 80 เป็น 4 เพราะเราDataset ของเรามี4 classes เนื่องจากมี 4 สายพันธุ์(มาจากตอนเราทำการlabelแล้วจะมีให้กำหนด classของแต่ละObject)
Image description
ขั้นตอนที่ 11

!python train.py --img 640 --batch 16 --epochs 100 --data DataDogCat.yaml --weights yolov5s.pt --cache
Enter fullscreen mode Exit fullscreen mode

ทำการ 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/
Enter fullscreen mode Exit fullscreen mode

ให้ทำการใส่Pathของตัว File weight best.pt ของตัวที่เราTrainมาFolderที่สร้างใหม่ best.pt คือตัวที่ดีที่สุดที่เราได้จากการ train
ขั้นตอนที่ 13
เมื่อRun เสร็จแล้ว จะอยู่ใน runs/detect/exp

Result

Image description

Image description

Image description

Image description

Image description

Image description

Image description

Image description

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

Top comments (0)