สร้าง AI ง่ายๆ สำหรับตรวจจับวัตถุด้วย YOLOv5 (ตอนที่ 1 : เตรียมชุดข้อมูลใหม่)

บทความนี้นำเสนอวิธีในการสร้าง 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

LabelImg เป็นเครื่องมือช่วยในการเตรียมชุดข้อมูลที่พัฒนาด้วยภาษา Pyhton และ ใช้ Qt ในการสร้างหน้าจอแสดงผลที่รองรับ YOLO มาติดตั้งกันเลยดีกว่า…

เริ่มจากให้ไป clone โปรเจค

$ git clone https://github.com/tzutalin/labelImg

ติดตั้ง Python

จาก link นี้

$ cd labelImg
$ virtualenv label-venv

เปิดใช้ virtual environment

● Windows:

$ label-venv\Scripts\activate.bat

● Mac และ Linux:

$ source label-venv/bin/activate

ติดตั้ง packages ที่จำเป็น

● 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

รัน LabelImg

$ python labelImg.py

จากนั้นจะปรากฎหน้าจอ ดังต่อไปนี้

กำหนดชนิดข้อมูลที่ต้องการ

กำหนดชนิดของข้อมูลที่ต้องการตรวจจับ

ในตัวอย่างนี้มีต้นไม้ 3 ชนิด คือ

0 : Aglaonema

1 : Rubber

2 : Spear

โดยเข้าไปแก้ไขที่ labelImg/data/predefined_classes.txt ดังนี้

เลือกรูปแบบการจัดเก็บข้อมูลเป็น YOLO

โดยไปที่แถบเมนูด้านซ้ายเปลี่ยนจาก 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

Roboflow เป็น computer vision developer framework สำหรับใช้จัดเก็บ เตรียมชุดข้อมูล และสร้างแบบจำลองต่างๆ ที่สามารถใช้งานผ่าน web browser ได้

ในบทความนี้ผมจะใช้ Roboflow ในการจัดเตรียมชุดข้อมูล และเพิ่มจำนวนชุดข้อมูลด้วยเทคนิค Image Augmentation โดยมีขั้นตอนดังต่อไปนี้

เข้า Roboflow

ที่ 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

บ่อยครั้งรูปที่รวบรวมมาอาจมีจำนวนไม่มากพอ ซึ่งเราสามารถขยายรูปที่มีอยู่ได้ด้วยเทคนิค 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)

บทความโดย อ.ผศ.ดร.ธรรณพ อารีพรรค

วิทยาลัยนวัตกรรมดิจิทัลเทคโนโลยี มหาวิทยาลัยรังสิต