Object Detection : YOLOv5 จาก Bronze สู่ Platinum

Original article was published on Artificial Intelligence on Medium


3. Training YOLOv5 🦾

สำหรับขั้นตอนของการเทรนโมเดลนี้บอกเลยว่าค่อนข้างง่าย แต่จุกจิก (ถ้าต้อง Tune Hyperparameter) และโครตนาน

คนไหนเทรนบน CPU แนะนำให้เทรนทิ้งไว้ตอนออกไปทริปต่างจังหวัด //ฮา

โดยขั้นแรกให้เราเลือกโครงสร้างโมเดลที่เราต้องการจะเทรนจากหนึ่งในไฟล์สกุล .yaml ที่เก็บใน /yolov5/models/
ถ้าสังเกตดีๆจะเห็นว่าอักษรตัวสุดท้ายก่อนจะถึงนามสกุล .yaml จะเป็น s/m/l/x ซึ่งบ่งบอกถึงโครงสร้างที่แตกต่างกันออกไปโดยส่วนที่แตกต่างคือ Model depth และและจำนวน Layer channel พูดง่ายๆก็คือไซส์โมเดลนั่นแหล่ะแน่นอนว่าไซส์ใหญ่อย่าง l หรือ x ย่อมได้ผลการ Detect ที่มีความแม่นยำสูง แต่ก็ต้องแลกมาด้วยจำนวน Parameters มหาศาลถึง 89 ล้านตัว ซึ่งจะส่งผลต่อความเร็วในการเทรนและความเร็วในการ Detect ด้วย (โดยที่อย่าได้ลืมว่าจำนวน Parameters ไม่ควรน้อยกว่า Dataset)

ถ้า S เทรนเสร็จใน 2 วัน, X จะเทรนเสร็จใน 8 วัน 😥

เพื่อความรวดเร็ว ผมเลือกที่จะเทรนบนไซส์ s โดยหลังจากตัดสินใจได้แล้วก็มีเรื่องให้ต้องทำนิดหน่อยก็คือการแก้ไขจำนวนของ Class ผลลัพท์ทั้งหมดในไฟล์โครงสร้าง (กรณีนี้ไฟล์ของผมจะเป็น yolov5s.yaml) ซึ่งอย่างที่เคยกล่าวไปว่าผมจะทำ Detector ตรวจจับหัวหอมกับอควาดังนั้น nc หรือ number of class ของผมจึงเท่ากับ 2

ณ ตอนนี้เรามีโครงสร้างโมเดลที่เตรียมพร้อมสำหรับการนำไปสร้างเป็นโมเดลจริงๆแล้ว จะเหลือก็แค่ไฟล์ Data config สำหรับกำหนดตำแหน่งเก็บ images และ labels ที่จะใช้เทรนโมเดล รวมไปถึงการระบุป้ายชื่อกำกับด้วยเพราะผลลัพท์จากการ Detect จะออกมาเป็นตัวเลข ไม่ใช่ชื่อ Class แบบเดียวกับที่เรากำหนดตอนนั่ง Label อันเนื่องมาจากด้วย Format ของ label ที่เป็น YOLO Format ที่ซึ่งระบุความแตกต่างของ Class เป็นตัวเลขเท่านั้น ดังนั้นนี่จึงเป็นสาเหตุที่ว่าทำไมผมถึงบอกให้จดลำดับของ Class เอาไว้ เพราะต้องนำมาใช้กรอกตรงนี้นี่เอง

โดยสำหรับไฟล์ data config ที่ว่าก็ให้ทุกคนก็อปด้านล่างนี้แล้วนำไปแก้ไขให้เหมาะกับของตัวเองได้เลย หลังจากนั้นก็บันทึกเป็นไฟล์ .yaml ไว้ใน /yolov5/data/

# train test and val datasets (image directory or *.txt file with image paths)
train: ./data/akukin/images/train/
test: ./data/akukin/images/test/
val: ./data/akukin/images/val/
# number of classes
nc: 2
# class names
names: [‘minato aqua’, ‘onion’]

เมื่อมาถึงจุดนี้ จริงๆแล้วก็สามารถเริ่มต้นเทรนโมเดลของเราได้เลย เพียงแต่เนื่องด้วยจำนวน Dataset ของผมที่จำกัด(ขก ทำเลยมีแค่ 40 ภาพ) ดังนั้นการฝึกสอนคงจะเป็นไปอย่างยากลำเข็ญ ดังนั้นก่อนที่จะเริ่มเทรนโมเดล ผมจะแนะนำให้รู้จักการเทคนิคหนึ่งที่นิยมใช้กันในงานด้าน Machine Learning
โดยเทคนิคที่ว่าคือการทำ Transfer Learning อธิบายอย่างรวบรัดตัดความคือการนำโมเดลของคนอื่นที่มีการเทรนมาแล้วในระดับนึง โดยที่โมเดลนั้นมีโครงสร้างเดียวกันกับเราหรือเป็นส่วนหนึ่งในโครงสร้างของเรามาทำการเทรนต่อด้วย Dataset ของเราเอง ทั้งนี้ก็เพราะว่า Parameters ส่วนหนึ่งของโมเดลได้ทำการปรับจูนมาในระดับนึงแล้วไม่ได้เริ่มจาก 0 ใหม่หมด ดังนั้นการเทรนโมเดลให้ถูกต้องของเราก็จะทำได้อย่างรวดเร็วมากยิ่งขึ้น

ซึ่ง YOLOv5 นี้ก็รองรับการทำ Transfer learning และยังสามารถทำได้อย่างง่ายดายอีกด้วย แต่ก่อนอื่นทุกท่านจำเป็นต้องมีตัว Pretrained model ของโมเดลที่ท่านจะทำการ Transfer learning เสียก่อนซึ่งสามารถ Download ได้ที่ลิ้งค์นี้

ซึ่งสำหรับผมที่เทรนด้วยโครงสร้าง s แล้ว ผมก็จะโหลดไฟล์ yolov5s.pt มา แล้วนำไปเก็บที่ Folder /yolov5/weights/

เมื่อเรามี Pretrained model เรียบร้อยแล้ว เท่านี้เราก็พร้อมสำหรับการเริ่มต้นฝึกสอนโมเดลของเราแล้วครับ ที่เหลือก็แค่รันคำสั่งดังต่อไปนี้

สำหรับใครที่มีปัญหาเรื่อง GPU Memory เต็มแล้วไม่สามารถเทรนโมเดลได้ ผมแนะนำให้ปรับลด img (input image size) หรือ batch (batch size) ลง

python train.py --img 640 --batch 16 --epochs 300 --data ./data/onion-detector.yaml --cfg ./models/yolov5s.yaml --weights ./weights/yolov5s.pt --cache-images

โดยที่มีรายละเอียดของแต่ละ Arguments ดังนี้

--img <> : ขนาดของ Image ขาเข้า(มีการปรับ Resolution ของ Image)
--batch <> : จำนวน Batch size
--epochs <> : จำนวน Epochs
--data <> : Path ที่ชี้ไปยังไฟล์ Data config
--cfg <> : Path ที่ชี้ไปยังไฟล์โครงสร้างโมเดลที่เลือกใช้
--weights <> : Path ที่ชี้ไปยังไฟล์ Pretrained model สำหรับทำ Transfer learning
--cache-images : กำหนดให้เก็บ Cache image ด้วยเพื่อเร่งความเร็วในการเทรนโมเดล

โดยนอกเหนือจากนี้สามารถดูเพิ่มเติมได้ในไฟล์ train.py

ถ้ารันคำสั่งแล้วขึ้นประมาณนี้เราก็พร้อมสำหรับการออกทริปต่างจังหวัดแล้วครับ 😍

Starting training

สำหรับการ Monitor พัฒนาการของโมเดลสามารถทำได้โดยรันคำสั่งนี้


tensorboard --logdir=./

หลังจากนั้นก็เข้า Browser แล้วเข้าลิ้งค์ localhost:6006 ได้เลยครับโดยเราจะเห็นกราฟพัฒนาการอัพเดทเรื่อยๆแบบนี้

Tensorbord สำหรับ Monitor พัฒนาการของ Model ในแต่ละ Batch