บทความนี้นำเสนอวิธีในการสร้าง AI สำหรับการตรวจจับวัตถุด้วย YOLOv5 โดยเริ่มต้นตั้งแต่ขั้นตอนการสร้างชุดข้อมูลใหม่ของเราเอง ตลอดจนถึงขั้นตอนการสร้างแบบจำลอง YOLO บน Colab
การเตรียมข้อมูลสำหรับสร้างแบบจำลอง YOLO จะประกอบไปด้วย 3 ขั้นตอนดังนี้
1. รวบรวมรูป
2. ระบุชื่อและตำแหน่งของวัตถุ
3. จัดเรียงไฟล์
ให้รวบรวมรูปภาพที่มีวัตถุที่ต้องการตรวจจับอยู่ในรูปให้ได้จำนวนมากที่สุดเท่าที่จะทำได้ โดยในบทความนี้ใช้ตัวอย่างเป็นรูปภาพของไม้มงคล 3 ชนิด ได้แก่
1. โพธิ์อินโด (Aglaonema)
2. ยางอินเดีย (Rubber)
3. ว่านงาช้าง (Spear)
ขั้นตอนต่อมา คือ การระบุตำแหน่งของวัตถุที่อยู่ภายในภาพ ซึ่ง YOLO จะมีรูปแบบดังรูปต่อไปนี้
จากรูปข้างต้นเราต้องการระบุตำแหน่งของต้นว่านงาช้าง โดยทำการระบุตำแหน่งกรอบ (สีแดง หรือ bounding box) ออกมาในรูปแบบดังนี้
<class id> <X0/X> <Y0/Y> <W/X> <H/Y>
โดยที่
class id : index ของวัตถุที่เราต้องการโดยให้เริ่ม index แรกที่ 0
X0 : ค่าแกน x ของจุดกึ่งกลางของ bounding box
Y0 : ค่าแกน y ของจุดกึ่งกลางของ bounding box
W : ความกว้างของ bounding box
H : ความสูงของ bounding box
X : ความกว้างของรูป
Y: ความสูงของรูป
ดังนั้นจากรูปจะต้องระบุแบบนี้ครับ
0 0.492 0.302 0.365 0.341
ซึ่งถ้าผมต้องทำแบบนี้เองกับทุกรูป!!! คงไม่ไหว…
แต่ผมมีทางออกให้ครับ ^^
ปัจจุบันมีเครื่องมือช่วยเยอะมากๆ
โดยในบทความนี้ผมขอแนะนำ 2 เครื่องมือ ได้แก่ LabelImg และ Roboflow ตั้งแต่ขั้นตอนการติดตั้งและการใช้งานเบื้องต้น
LabelImg เป็นเครื่องมือช่วยในการเตรียมชุดข้อมูลที่พัฒนาด้วยภาษา Pyhton และ ใช้ Qt ในการสร้างหน้าจอแสดงผลที่รองรับ YOLO มาติดตั้งกันเลยดีกว่า…
$ git clone https://github.com/tzutalin/labelImg
จาก link นี้
$ cd labelImg
$ virtualenv label-venv
● Windows:
$ label-venv\Scripts\activate.bat
● Mac และ Linux:
$ source label-venv/bin/activate
● macOS
$ pip install pyqt5==5.12.1 lxml
$ make qt5py3
● Windows
ติดตั้ง PyQt และ lxml จากนั้นไปที่ folder labelImg
$ cd labelImg
$ pyrcc4 -o libs/resources.py resources.qrc
*** สำหรับ pyqt5
$ pyrcc5 -o libs/resources.py resources.qrc
$ python labelImg.py
จากนั้นจะปรากฎหน้าจอ ดังต่อไปนี้
กำหนดชนิดของข้อมูลที่ต้องการตรวจจับ
ในตัวอย่างนี้มีต้นไม้ 3 ชนิด คือ
0 : Aglaonema
1 : Rubber
2 : Spear
โดยเข้าไปแก้ไขที่ labelImg/data/predefined_classes.txt ดังนี้
โดยไปที่แถบเมนูด้านซ้ายเปลี่ยนจาก PascalVOC เป็น YOLO จากนั้นกด Save ด้านบน ดังรูปต่อไปนี้
1. เลือก Open Dir > เลือก folder ที่บรรจุรูปทั้งหมดที่จะระบุตำแหน่งของวัตถุต่างๆ
2. เลือก Create RectBox
3. ลากกรอบครอบไปที่วัตถุที่ต้องการ (สร้างได้มากกว่า 1 วัตถุ)
4. เลือก class ที่ต้องการ
5. กด OK
6. กด Save
7. กด Next Image
จากนั้นทำขั้นตอน 2. ถึง 7. ไปเรื่อยๆจนครบทุกรูป
จากนั้นจะได้ผลลัพธ์การระบุวัตถุพร้อมค่าตำแหน่งต่างๆอยู่ไฟล์ .txt ที่มีชื่อเดียวกับรูปที่ save ไว้ดังนี้
ผมแนะนำว่าในกรณีที่มีรูปมากพอเราสามารถใช้ LabelImg ได้ แต่ในกรณีที่มีรูปน้อยผมแนะนำอีกเครื่องมือคือ Roboflow
Roboflow เป็น computer vision developer framework สำหรับใช้จัดเก็บ เตรียมชุดข้อมูล และสร้างแบบจำลองต่างๆ ที่สามารถใช้งานผ่าน web browser ได้
ในบทความนี้ผมจะใช้ Roboflow ในการจัดเตรียมชุดข้อมูล และเพิ่มจำนวนชุดข้อมูลด้วยเทคนิค Image Augmentation โดยมีขั้นตอนดังต่อไปนี้
ที่ roboflow.com ดังนี้
จากนั้น Sigin
กด Create Dataset ด้านขวาบน
Dataset Name: ชื่อฐานข้อมูล
Dataset Type: Object Detection (Bounding Box)
Annotation Group: ชื่อกลุ่ม
เลือก Select Folder เพื่อ Upload รูป
เมื่อ Upload เสร็จกดที่ Finish Upload ขวาบน
จากนั้น กำหนดการแบ่งสัดส่วนชุดข้อมูลว่าเป็น ชุดฝึกฝน (Training Set) ชุดทดสอบ (Testing Set) ชุดตรวจสอบ (Validation Set)
ผมเลือกเป็น Training Set อย่างเดียวให้เลือก Add All Images to Training Set > กด Continue ดังนี้
จากนั้นกดที่รูปเพื่อระบุตำแหน่งวัตถุ และชื่อของวัตถุ คล้ายกับ LabelImg ดังนี้
โดยทำการระบุให้ครบทุกรูป จากนั้นกดที่ปุ่ม Back ซ้ายบน
จากนั้นเราจะ Download รูปที่ระบุตำแหน่งทั้งหมดกลับมา
โดยให้กดที่ Generate > เลือกรูปแบบเป็น YOLO v5 PyTorch
จัดได้รูปทั้งหมดออกมาในรูปแบบดังนี้
บ่อยครั้งรูปที่รวบรวมมาอาจมีจำนวนไม่มากพอ ซึ่งเราสามารถขยายรูปที่มีอยู่ได้ด้วยเทคนิค Image Augmentation ซึ่งเป็นวิธีการ ย่อ ขยาย หมุน เอียง บิด รูป ซึ่ง สามารถทำได้บน Roboflow เลย ดังนี้
ไปที่ Modify Dataset > + Add Augmentation Step
จากนั้นเลือกรูปแบบที่ต้องการ
ขั้นตอนนี้ Roboflow จะสร้างรูปออกมาให้ 30 รูป
ผมลองเพิ่ม Flip และ Rotate > จากนั้นกด Generate > Save ชื่อ > Format เป็น YOLO v5 PyTorch > กด Continue
เท่านี้เราก็สามารถเพิ่มจำนวนรูปได้อีกเรื่อยๆจนกว่าเราจะต้องการครับ ^^
สุดท้ายผมได้ทำการรวบรวม และระบุตำแหน่งของวัตถุในภาพเรียบร้อยแล้ว ซึ่งได้ทั้งหมด 280 รูป จากนั้นผมนำมาจัดเรียง โดยให้รูปทั้งหมดอยู่ใน folder images และค่าตำแหน่งต่างๆอยู่ใน folder labels ดังรูปต่อไปนี้
เท่านี้ก็เสร็จสิ้นขั้นตอนการเตรียมชุดข้อมูลแล้วครับSpoil ผลลัพธ์สุดท้ายให้ดูก่อนครับขั้นตอนนี้ Roboflow จะสร้างรูปออกมาให้ 30 รูป
● สร้าง AI ง่ายๆ สำหรับตรวจจับวัตถุด้วย YOLOv5 (ตอนที่ 2 : สร้างแบบจำลองบน Colab)
บทความโดย อ.ผศ.ดร.ธรรณพ อารีพรรค
วิทยาลัยนวัตกรรมดิจิทัลเทคโนโลยี มหาวิทยาลัยรังสิต