Object Classification, Detection
จริงๆตั้งใจจะเขียนเรื่องนี้มานานมากแล้ว แต่ด้วยปัญหาหลายๆอย่างเลยดองไว้นานมาก
ลองมาดูถึง 2 คำนี้กันก่อน Classification, Detection
- Object Classification คือมีรูปๆนึงมา บอกว่ารูปนี้คือรูปอะไร โดยรูปนั้นมีสิ่งที่เราสนใจแค่อันเดียว ตามตัวอย่างรูปด้านล่าง รูปนี้มีแมวอยู่นะ
- Object Detection คือมีรูปๆนึงมา บอกว่ารูปนี้มีสิ่งที่เราสนใจอะไรบ้าง และอยู่ตรงไหน ตามตัวอย่างด้านล่างคือเราบอกว่ามีหน้าคนอยู่ตรงไหนในรูปบ้าง
จริงๆแล้ว 2 ปัญหานี้เชื่อมถึงกัน งานยุคแรกจะเริ่มจาก Object Classification มาก่อนแล้วค่อยมาทำ Detection ดังนั้นตอนนี้เราจะพูดถึงเรื่อง Classification กันก่อน
ปกติแล้วมนุษย์จะบอกได้ว่า สิ่งของอันนึงคืออะไร เราต้องมีการอธิบายลักษณะของมัน ไม่ว่าจะด้วยสี รูปร่างรูปทรง ผิวสัมผัส กลิ่น หรืออื่นๆแล้วแต่ประสาทสัมผัสของมนุษย์จะรับได้ เช่น มีรูปโต๊ะมารูปนึง
A อธิบายสิ่งที่เรียกว่าโต๊ะตามรูปนี้คือ วัตถุสี่เหลี่ยม ที่มีสี่ขา
B ให้คำนิยามของสิ่งที่เรียกว่าโต๊ะตามรูปนี้คือ วัตถุที่มีสีน้ำตาล มีผิวสัมผัสเรียบ
C อาจจะบอกว่าโต๊ะคือ แผ่นไม้ที่มีสี่ขา
จะเห็นได้ว่าแต่ละคนอธิบายไม่เหมือนกันสักคน คำอธิบาย คำนิยามเหล่านี้ เรามีชื่อเรียกทาง Computer Vision ว่า Feature หรือคุณลักษณะสำคัญ ซึ่งเป็นสิ่งสำคัญมาก สำหรับงาน Object Classification
เราลองมองกลับมาที่ภาพในคอมพิวเตอร์ดูก่อน ในคอมพิวเตอร์นั้น ภาพเก็บอยู่ในรูปแบบของ pixel ซึ่งเป็นตัวเลขชุดหนึ่งแทนลำดับของสี ที่สามารถสร้างภาพออกมาให้เราเห็นบนจอได้ ซึ่งในยุคแรกๆ งานด้าน Object Classification ก็ใช้ pixel นี่ละเป็น Feature อธิบายภาพแต่ละภาพ ซึ่งก็ใช้ได้ดีด้วยบน dataset ชื่อดังที่ทุกคนรู้จักคือ MNIST Dataset (ใช้ pixel เป็น feature ทำ k-nearest neightbour ก็ได้ accuracy~95% แล้ว)
แล้วมันมีปัญหาตรงไหนละ ทำไมงานยุคปัจจุบันถึงไม่ใช้ pixel ลองคิดดูว่ามันมีปัญหายังไงบ้าง (แบบที่มองเห็นง่ายๆ)
- ไม่ทนทานต่อการเลื่อน,การหมุนและขนาด (Translation, Rotation and Scaling Variant) — สมมุติรูปโต๊ะทั้งสาม ด้านล่าง
โต๊ะทั้งสามตัวนี้ดูด้วยตา ก็เป็นโต๊ะตัวเดียวกัน แต่อยู่คนละตำแหน่ง มีการเลื่อน หมุน หด/ขยายขนาด ซึ่งถ้าเรามองในมุม pixel จะกลายเป็นว่าภาพแรก pixel ของโต๊ะกระจายๆไปทั้งรูป แต่ 2 รูปถัดมาไปกองอยู่ด้านขวาล่าง ขวาบน นอกนั้นเป็นสีขาวหมด ซึ่งทำให้ pixel เป็น feature ที่ไม่ค่อยดี รูปเดียวกันแต่คำอธิบายไม่เหมือนกัน
- ไม่ทนทานต่อสัญญาณรบกวน สีแสง — เป็นโต๊ะตัวเดียวกัน แต่คนละสีหรือภาพเบลอ ค่า pixel ก็เปลี่ยนไปแล้ว
- ไม่มีความเป็น locality — ปกติแล้ว ในบริเวณใกล้ๆกันภายในภาพ จะมีค่า pixel เหมือนๆกันหรือต่างกันไม่มาก การเอา pixel มาใช้เป็น feature เลยตรงๆ ไม่ได้ใช้คุณสมบัตินี้เลย
เพราะว่า pixel เป็น feature ที่ไม่ค่อยดีนัก ยุคต่อมาจึงเป็นยุคของ feature engineering ด้วยความรู้ของคน เพื่อสร้างคำอธิบายจากรูปภาพให้อยู่ในรูปแบบตัวเลขชุดหนึ่ง โดยพยายามที่จะก้าวข้าม,หลีกเลี่ยงปัญหาด้านบน ในยุคนี็้จึงมี feature extractor เกิดขึ้นมาจำนวนมาก จากการสังเกตใน PASCAL VOC Challenge ซึ่งเป็น dataset งาน object classification ที่เก่าแก่อันนึง งานช่วงแรกจะเป็น hand feature engineering ก็จะเจอ feature extractor ่ชื่อดัง เช่น
- Harr-Like Feature — Face Detection (ตรวจจับใบหน้า)
- Histogram of Oriented Gradient (HOG) — Human Detection (ตรวจจับคน)
- Scale-Invariant Feature Transform (SIFT)
- Speeded Up Robust Features (SURF)
เวลาเอาไปใช้งานก็คือ เอาภาพใส่เข้าไปใน feature extractor ตัวที่เลือกมา ได้ตัวเลขออกมาชุดนึง (feature) ที่เราเชื่อว่าตัวเลขชุดนี้ น่าสามารถจะแทน/อธิบายรูปนั้นได้ดี เอาไปสอน classifier ตัวที่เลือกว่า แบบนี้คือโต๊ะเป็นต้น
จะเห็นได้ว่าแต่ละ feature extractor ก็ถูกสร้างเพื่องานที่แตกต่างกันออกไป HOG จุดประสงค์ตอนแรก ถูกสร้างมาเพื่อตรวจจับคน แต่ก็สามารถเอามาใช้กับงานอื่นๆได้เหมือนกัน แต่ก็อาจจะให้ผลที่ไม่ดีเท่าไหร่นัก จึงเป็นปัญหาตามมาว่า ถ้าเราต้องการ feature ที่ดีของวัตถุ A ที่ยังไม่เคยมีใครทำมาก่อน จะต้องทำยังไง? ต้องสร้าง feature extractor ใหม่ขึ้นมาอีกไหม
จนถึงช่วงปีประมาณปี 2012 ซึ่งเป็นปีสุดท้ายของ PASCAL VOC และเป็นปีที่ 1000 Classes Object Classification Competition ของ Imagenet เกิดขึ้นมา ซึ่งจะบอกว่า Dataset นี้ทำให้ Convolutional Neural Network (CNN) บูมขึ้นมาในสาย Computer Vision ก็ได้หลังจากที่เป็นยุคมืดมาหลายปี
จากคำถามข้างบนที่ว่า
“ถ้าเราต้องการ feature ที่ดีของวัตถุ A ที่ยังไม่เคยมีใครทำมาก่อน จะต้องทำยังไง? ต้องสร้าง feature extractor ใหม่ขึ้นมาอีกไหม”
ถ้าเราลองดู dataset imagenet แล้วอาจจะเกิดคำถามใหม่ว่า
“จะสร้าง feature ยังไงให้มันอธิบายรูปตั้ง 1000 classได้เนี่ย แถมรูปแต่ละclassเยอะโคตรๆ (เป็นล้าน) อีกต่างหาก”
จาก impact ของ dataset นี้ ที่มี training data แบบมหาศาล เลยทำให้โลกเปลี่ยนจากแนว feature engineering โดยใช้ความรู้ของคน ไปเป็นการเรียน feature extractor จาก training dataset แทน(ถ้าเคยได้ยิน AlexNet, VGG-16, GoogleLenet, Resnet, Inception, NASNet ก็มาจาก Competition นี้ละ)
ตอนนี้อาจจะเกิดคำถามว่า แล้วมันจะเรียน feature extractor ยังไงละ? ซึ่งคำตอบก็คือ Convolutional Neural Network หรือ CNN นั่นเอง ตรงที่มีการเรียนก็คือ weight ของการทำ convolution นั่นละที่จะมีการปรับไปเรื่อยๆ เพื่อดึง feature ดีๆจากรูปภาพออกมาผ่านการทำ convolution
ซึ่ง operator convolute กับ CNN ก็มีคุณสมบัติพอดีกับที่ปัญหาที่เราเจอด้านบน จากการใช้ pixel เป็น feature
- ทนทานต่อการเลื่อน,การหมุน,ขนาด การเปลี่ยนแปลงของสี สัญญาณรบกวน (Translation, Rotation and Scaling Invariant) — ด้วยความที่ว่า dataset ใหญ่มากร่วมกับการทำ data augmentation ทำให้สามารถเรียนรู้ที่จะดึง feature ดีๆออกมาได้
- มีความเป็น locality — operator convolute มีความเป็น locality อยู่แล้ว มีการใช้ pixel รอบๆในการสร้าง feature ออกมา
- operator convolute parallel ได้ — เพราะข้อนี้ VGA จึงถูกนำมาใช้ในงาน Computer Vision เยอะมาก
ถัดไปน่าจะเขียนถึงเรื่อง Object Detection ว่ามีประวัติมายังไง รวมถึงใช้วิธีอะไรกันในปัจจุบัน กับ in-depth กับการ implementation ของ
- R-CNN / Fast-RCNN / Faster-RCNN / Mask-RCNN
- SSD
- YOLO v2/v3