Image detection โดยใช้ YOLOv5 จากต้นจนจบ (ตอน 1)
สวัสดีทุกท่านครับ พอดีช่วงนี้ผมได้ศึกษาและลองเล่นเทคโนโลยีเกี่ยวกับการตรวจจับวัตถุโดยใช้รูปภาพ เลยอยากจะมาแชร์ถึงขั้นตอน วิธีการ และอธิบายเท่าที่จะทำได้ เผื่อคนที่อยากไปใช้ต่อสามารถนำไปประยุกต์ใช้ได้ครับ
โดยในบทความซีรีย์นี้จะมีทั้งหมด 5 ขั้นตอนด้วยกัน (จะทยอยเขียนเพิ่มขึ้นมาเรื่อยๆครับ) ได้แก่
- Image Detection คืออะไร แล้ว YOLOv5 คืออะไร? (บทความนี้)
- การดึงชุดข้อมูลและจัดเตรียม (Data Gathering and Collecting) (Link)
- การกำหนดผลลัพธ์ (Data Labeling) และการทำ Image Augmentation (Link)
- การสร้างโมเดลและวัดผล (Modelling) (Link)
- การนำโมเดลไปประยุกต์ใช้ (Deployment) (Link)
สำหรับบทความนี้จะเป็นเรื่อง Introduction ของการทำงานเกี่ยวกับ Image Detection และ YOLO ถ้าใครอยากไปถึงขั้นตอนอื่นๆ สามารถคลิกลิงค์ในแต่ละขั้นด้านบนได้เลยครับ
ก่อนอื่นเลย คนที่เข้ามาใหม่หรือยังไม่คุ้นชินกับเรื่องรูปเท่าไหร่ อาจจะมีคำถามว่าเราทำ Image Detection ไปทำไม แล้วชีวิตจริงมันมี Use case อะไรบ้าง
ปกติแล้วงานสำหรับรูปภาพนั้นจะมีอยู่หลายประเภท ขึ้นอยู่กับเป้าหมายว่าเราต้องการอะไร เช่น ถ้า use case คลาสสิกเลยคือ Image Classification โดยงานนี้เราต้องการให้ AI มันบอกเราว่ารูปที่มีมันคือรูปของอะไร เช่น รูปตัวอย่างดังต่อไปนี้
แน่นอนว่าทุกคนรู้ว่ามันคือ แมว แต่สำหรับ AI นั้น เราต้องส่งรูปเข้าไปพร้อมกับผลลัพธ์ว่า นี่คือรูปแมวนะ เพื่อให้มันเรียนรู้เรื่อยๆ และนี่คืองานหลักของสิ่งที่เรียกว่า Image Classification
ต่อมาถ้าเราต้องการรู้เพิ่มเติมว่า แล้วแมวมันอยู่ตรงไหนของรูปหล่ะ? ถ้าได้โจทย์มาเป็นแบบนี้ จะเป็นโจทย์อีกแนวที่เรียกว่า Image Detection โดยมันจะบอกถึงตำแหน่งของรูปด้วย เช่น
จากรูป เราจะทราบเลยว่าน้องหมาอยู่ตรงไหนของรูป รวมถึงน้องแมว และน้องเป็ด ทำให้เราได้ insight เพิ่มเติมจากผลลัพธ์ (ซึ่งจะเป็นงานหลักของเราในบทความซีรีย์นี้) จากงานแนวนี้นั้นจะเพิ่มเติมจาก Image Classification นิดหน่อยตรงที่เราต้องบอก AI ไปด้วยว่า แมวอยู่พิกัดตรงนี้ในรูปนะ (ซึ่งก็คือ bounding box โดยในบทความที่ 3 จะอธิบายตรงนี้เพิ่มเติมครับ)
และอีกโจทย์คือ ในบางครั้งเราอยากจะแค่เอาเฉพาะส่วนของรูปที่สำคัญ ในโจทย์นี้จะเป็น Image Segmentation ดังรูปด้านล่างครับ
และภาพรวมความแตกต่างของโจทย์หลักๆคือ
สำหรับบทความนี้เราจะโฟกัสไปที่ Image Detection (ภาพกลาง) เพื่อที่จะดูว่าตำแหน่งของรูปนั้นอยู่ตรงไหนครับ
ต่อมาหลายท่านอาจจะมีคำถาม แล้ว use case จริงๆหล่ะ เขาไปทำอะไรกัน
จริงๆการใช้งานจะขึ้นอยู่กับโจทย์ (Scope) เลยครับ ตัวอย่างเช่น
- Medical Sector
บางครั้งเวลาที่มีรูป X-ray ออกมา ในการตรวจเช็ครูปนั้นจะต้องใช้หมอเฉพาะทางที่มีจำกัด ถ้าเรามี AI คอยช่วย Focus หรือตีกรอบส่วนที่มีปัญหา จะลดเวลาในส่วนนี้มาก รวมถึงอาจจะใช้งานร่วมกับ Image Segmentation ได้ จากรูปด้านล่าง เขาวิเคราะห์เรื่องตำแหน่งของเนื้องอกในสมองครับ
2. Traffic Sector
อีกตัวอย่าง เวลาที่เราขับรถบนท้องถนน ก็จะมีกล้องที่คอยเช็คความเร็วหรืออาจจะตรวจสอบว่ารถติดไหม เราสามารถนำ AI นี้ไปช่วยได้ว่ามีรถบนถนนเยอะหรือไม่แล้วไปเชื่อมกับระบบอื่นครับ (รวมไปถึงรถกำลังจะเข้าเส้นทึบไหม)
แล้ว YOLOv5 คืออะไรหล่ะ?
หลังจากที่เกริ่นมาเนิ่นนาน เราจะมาเข้าหัวข้อหลักของเราคือ YOLOv5 และแน่นอนว่า YOLO ในที่นี้ไม่ได้แปลว่า ‘You only live once’ แต่มันคือ ‘You only look once’ ซึ่งจะเป็นหลักการทำงานของมัน และในปัจจุบันมีถึง Version 5 แล้ว โดยตัว YOLO นี้มันคือสถาปัตยกรรมที่ทาง ultralytics ได้ออกแบบไว้เพื่อทำ Image Detection ได้อย่างรวดเร็วและมีประสิทธิภาพ
แน่นอนว่าการทำ Image Detection นั้นมีหลายวิธี ไม่น่าจะเป็น R-CNN, Faster R-CNN, EfficientDet แต่ข้อดีของ YOLO คือจะมีจุดเด่นที่ความไวในการวิเคราะห์ข้อมูล ทำให้เราเลือกใช้ตัว YOLO นี้และมี Document ที่พร้อม รวมถึง Customized ให้เข้าได้ข้อมูลและเป้าหมายของเราได้
โดยซีรีย์นี้ผมจะยกตัวอย่างการทำ Logo Detection จากในรูปครับ เช่นเวลาเราเดินห้าง ถ้าในอนาคต(อีกหลายๆปีเลย) มีแว่น AR แล้วใส่เดินห้าง แล้วเดินผ่านร้านค้า หรือร้านอาหาร มันบอกได้เลยว่าร้านนี้มีโปรโมชั่นอะไรบ้าง รูดผ่านบัตรเครดิตนี้ส่วนลดเยอะสุด น่าจะเป็นที่สนใจ แต่แน่นอนต้องใช้เรื่องของ Image Detection มาดูว่าโลโก้นี้คือร้านอะไร เราจึงมาใช้ YOLO ช่วยครับ
(หลายคนอาจจะสงสัยว่า Logo Detection ก็มีวิธีคลาสสิก เช่น Keypoint Detector ได้ แต่พวกวิธี SIFT มันจะมีประเด็นเรื่องของความเร็วครับ)
สำหรับรายละเอียดการเตรียมข้อมูลสำหรับ YOLO จะอยู่ในบทความถัดไปครับ รอติดตามได้เลย ถ้ามีส่วนไหนผมเขียนหรืออธิบายผิด สามารถ Comment มาบอกกันได้ครับ ขอบคุณครับ
(ต่อไปจะค่อนข้าง Detail ครับ ถ้าเพิ่งเริ่มและอยากลองใช้งานก่อน ข้ามส่วนนี้ไปได้เลยครับ แล้วค่อยกลับมาอ่านเพิ่มเติมได้)
สำหรับ YOLO นี้ข้อดีคือมันเร็วอย่างที่บอกไป เนื่องจากมันจะวิเคราะห์จากรูปครั้งเดียว แล้วทำ Label ให้ครอบคลุมทั้งรูป
หลักการทำงานของมันคือจากรูป 1 รูปเต็มๆ มันจะทำการแบ่ง Grid cell ออกมาเป็น n x n grid (จากรูปน้องหมา แบ่งไป 13 grid ยิ่งแบ่งมากก็จะละเอียด trade off กับการคำนวณ)
แล้วในแต่ละ grid (เช่นบนซ้ายสุด) เราก็ต้องใส่ Label ให้มัน(ถ้ามี) เช่น
[Pc, bx, by, bh, bw, c1, c2 ,… , cn]
โดยที่ Pc คือ Probability ที่มีวัตถุอยู่ใน Grid นั้นๆ ถ้าไม่มีคือ 0 ถ้ามีคือ 1
bx, by คือตำแหน่งตรงกลางของ Object ว่าอยู่พิกัดไหน
bh, bw คือขนาดความสูงและกว้างของ Object ว่าสูง, กว้างขนาดไหน
และ c1,c2,..,cn คือ ผลลัพธ์ว่าเป็น class อะไร ถ้าโจทย์เรามีแค่ detect น้องหมา ก็จะมี class เดียว และ grid นั้นมีค่าเป็น 1 แต่ถ้ามีหลาย Object ก็จะมีเลขต่อๆไป
(เช่น Grid ตรงกลางของน้องหมา จะมี C1 = 1 โดย Grid อื่น C1 = 0)
แต่ถ้าในกรณี 1 grid มีหลาย Object ละ? ทำยังไง
จาก Label ด้านบน มันจะรับได้เฉพาะ 1 grid คือ 1 Object แต่กรณีถ้ามีหลาย Object เราจะใช้หลักการที่เรียกว่า Anchor Box โดยเราสามารถกำหนดจำนวน Box นี้ได้ (เช่น 2) ก็จะมี Label แบบด้านบน 2 อันใน 1 Gridได้ (เราสามารถกำหนดเลขนี้ได้) และตัว YOLO ก็จะคำนวณให้ว่ารูปนั้นมันใกล้ Anchor ไหนสุดจากค่า IOU ก็จะถูกกำหนดไปที่ Anchor นั้น
แต่สำหรับคนที่เริ่ม YOLO นั้น อาจจะไม่ต้องสนใจส่วนนี้ก็ได้ ตัว YOLO มันจะคำนวณมาให้เลย เราสามารถทำแค่บอกว่ามีตำแหน่ง Object อะไรในรูปพอครับ
อีก Keyword ที่สำคัญคือ Intersection over Union (IOU) และ Non-max suppression (NMS)ที่ควรรู้ครับ
IOU จะมามีส่วนหลักๆหลายส่วนใน YOLO เช่นเวลาโมเดลทำนายออกมา มันอาจจะทำนายรูปรถเดียวกันแต่หลายกล่องได้ เช่น
เราจึงต้องใช้ metric IOU ในเลือกกล่องเดียวเป็นตัวแทนของ Object นั้นๆครับ จากวิธีการ NMS โดยหลักการคำนวณคือ หาส่วนที่ Intersect หารส่วนที่ Union กัน ถ้ากล่องใดมีค่านี้สูง (เกิน Threshold ที่กำหนด) แสดงว่ามันคือ Object เดียวกันครับ
และสุดท้ายแล้ว ผลลัพธ์ของ YOLO มันก็จะบอกได้ว่า Object ในรูปมีอะไรบ้างเพื่อนำไปใช้งานต่อไปครับ
สำหรับ detail หรือคำอธิบายที่ละเอียดกว่านี้ สามารถดูได้ผ่านลิงค์นี้ ได้เลยครับ ขอบคุณครับ