โลกหมุนไป งานวิจัยก็หมุนตาม

ผมเองก็ตามจนหัวหมุน 555

Sanparith Marukatat
5 min readMay 8, 2018

กาลครั้งหนึ่งนานมาแล้วงานหลักของ Machine Learning คือการจำแนกประเภทสิ่งของ (classification) เราเรียนรู้ที่จะสร้าง ตัวจำแนกประเภท (classifier) เช่น Neural Network หรือ SVM ที่สามารถบอกได้ว่าภาพที่เห็น -ทั้งภาพ- นั้นคือตัวอักษรใด หรือสัตว์ชนิดใด (หมา แมว นก ฯลฯ) หรือสถานที่แบบใด (ป่า ทะเล ภูเขา ฯลฯ) เป็นต้น

งานในยุคนี้ focus ไปที่การสร้างตัวจำแนกประเภท (classifier) ตั้งแต่ linear classifier ง่าย ๆ ที่เอาคุณลักษณะ (features) มาผสมกันแบบ linear combination (คูณค่าคงที่แล้วบวกกัน) ไปถึง SVM ที่ใช้ kernel function เพื่อแปลงคุณลักษณะเหล่านี้ไปอยู่ใน kernel space ที่ลึกลับและสวยงาม (ในเชิงคณิตศาสตร์)
ในยุคนั้น CNN ที่อิง convolutional layer เพื่อสกัดคุณลักษณะที่เหมาะสมจากข้อมูลดิบแบบอัตโนมัติ ยังไม่เป็นที่นิยม ทั้งจากความยากในการเขียนโค้ดและเพราะประสิทธิภาพของเครื่องที่ยังไม่ดีพอทำให้ CNN ทำงานได้ช้า

ในยุคนั้นงานวิจัยด้าน AI ถูก dominate ด้วย SVM และ kernel methods ต่าง ๆ คนที่เคยเรียน AI ในยุคก่อนที่สอนพวก A* search กับ prolog ก็จะงง ๆ กับ keywords ใหม่อย่าง SVM, kernel, RBF kernel, polynomial kernel, Mercer conditions, KKT conditions, etc.

เมื่องานวิจัยด้านการจำแนกประเภทสิ่งของเริ่มอิ่มตัว นักวิจัยก็เริ่มขยับไปทำโจทย์ที่ยากขึ้นนั่นคือการ “ตรวจจับ (detect)” ของที่เราสนใจ เช่น “แมว” จากภาพที่นำเข้า
หนึ่งในวิธีง่าย ๆ ก็คือการตัดเอาบริเวณที่เราคิดว่าเป็นแมวส่งให้ classifier ที่เราเตรียมไว้ตรวจว่าใช่แมวหรือไม่
สำหรับงานบางงานเช่นการรู้จำเอกสาร เรามีความรู้เบื้องต้น (prior knowledge) ว่าอักษรควรมีลักษณะเช่นใด เราสามารถใช้ความรู้เหล่านี้ในการกำหนดขอบเขตภายในภาพที่น่าจะเป็นตัวอักษรได้ หรือในการตรวจสอบใบหน้าบุคคลที่จะเข้าห้องหากเรากำหนดว่าคนที่จะเข้าต้องยืนที่ตำแหน่งหนึ่ง ๆ เราก็จะสามารถกำหนดบริเวณที่น่าจะเป็นใบหน้าในภาพถ่ายได้
แล้วในกรณีทั่วไปล่ะ เราควรทำอย่างไรดี?

วิธีหนึ่งที่เป็นไปได้คือการ scan ภาพนำเข้านั้นที่ทุก ๆ ตำแหน่งที่เป็นไปได้โดยสำหรับแต่ละตำแหน่งเราดึงเอาเนื้อภาพใน window รอบ ๆ มัน ส่งให้ classifier ที่เราเตรียมไว้เป็นคนตัดสินใจว่ามันคือ “แมว” หรือไม่ จากนั้นเราก็ต้องปรับขนาดของ window นี้ให้ใหญ่ขึ้น (หรือเล็กลง) และทำการ scan ใหม่ นั่นเพราะเราไม่รู้ว่า “แมว” ในภาพนั้นอยู่ที่ใด และมีขนาดเท่าใด วิธีนี้ทำให้เราสามารถตรวจจับวัตถุในภาพได้
ปัญหาคือมันช้ามากกกก

งานที่นับเป็น breakthrough ของคอมพิวเตอร์วิทัศน์ (computer vision) คือระบบตรวจจับใบหน้า (face detector) ของ Viola กับ Jones แนวความคิดหลักคือแทนที่จะใช้ classifier เก่ง ๆ ตัวเดียว เขาสร้าง classifier ที่มีหลาย “stages” โดยแต่ละ stage จะกรองเอาของที่ไม่ใช่ออกไปเรื่อย ๆ จนสุดท้ายเหลือแต่ของใช่
ทั้งนี้แต่ละ stage นั้นถูกสร้างโดย feature ที่ง่ายมาก ๆ แต่เขานำมันมาผสมกันผ่านระบบ Boosting
ในเชิงวิจัยแล้วนี่นับเป็นงานชิ้นเอกที่แสดงให้เห็นถึงประสิทธิภาพของระบบ Boosting ในทางปฏิบัตินี่นับเป็นเทคนิคการตรวจจับใบหน้ารุ่นแรกที่สามารถทำงานได้แบบ realtime บนเครื่องคอมพิวเตอร์ทั่วไป
ในยุคนั้น Viola-Jones detector ถือว่าเป็น state-of-the-art ในการทำ object detection เลย

ตัวอย่าง feature ที่ใช้ในงานของ Viola & Jones เพื่อตรวจจับใบหน้า [1]

10 ปีผ่านไป กระแส Deep Learning ทำให้คนหันมาสนใจ CNN มากขึ้นจนแซงพวก SVM
หนึ่งในคำถามที่พบบ่อยคือเราควรจะออกแบบโครงสร้าง Neural Networks นี้อย่างไรดี ในทางปฏิบัติเรามักจะเอาโครงสร้างที่เคยมีคนใช้งานมาแล้วให้ผลดีมาใช้บ้าง โครงสร้างที่เป็นที่รู้จักกันก็เช่น

  • LeNet โครงสร้างแรก ๆ ของ CNN
  • AlexNet เป็น CNN แรก ๆ ที่ใช้ GPU และชนะงานแข่ง Imagenet (เป็นตัวแรกที่ผมลองเล่นบน Caffe)
  • GoogLeNet ที่ประกอบด้วยชั้น Inception
  • VGG ที่เป็น CNN แรก ๆ ที่เน้น kernel 3x3 เป็นหลัก
  • ResNet ที่เสนอ idea ของ skip connection ที่ตอนนี้กลายมาเป็นวิธีมาตรฐานในหลาย ๆ โครงสร้าง
  • DenseNet ที่นำเอา skip connection นี้มาใช้เป็นหลักเพื่อโยน gradient กลับไป layer ชั้นล่าง ๆ ให้ดีขึ้น
  • SqueezeNet ที่เอา AlexNet มาลดขนาดลง
  • MobileNet ที่ก็เป็นความพยายามอีกอย่างที่จะสร้าง CNN ขนาดเล็ก

ชื่อพวกนี้กลายมาเป็น keywords ที่อาจทำให้คนที่เรียน AI มาในยุค kernel methods งงได้

การนำเอาโครงสร้าง CNN ข้างบนนี้มาใช้ตรวจจับวัตถุก็ยังต้องอิงการ scan + classify + scale ขนาด window แบบเดียวกับ SVM ซึ่งก็ยังช้ามากกกกกอยู่ดี ในช่วง 2–3 ปีมานี้มีการพัฒนาเทคนิคสำหรับตรวจจับวัตถุด้วย CNN ขึ้นมาใหม่ซึ่งหลาย ๆ อย่างนั้นน่าสนใจมาก งานข้างล่างนี้ถูกพัฒนาโดยนักวิจัยหลายกลุ่ม แต่ดูแล้วมีความต่อเนื่องกันอยู่ผมเลยจับมาใส่ต่อกันเลย

งานแรกที่สำคัญคือ Selective Search ซึ่งแนวความคิดหลักคือพยายามเลือกบริเวณที่น่าจะเป็นวัตถุขึ้นมาแทนที่จะทำการตรวจทุก ๆ ตำแหน่ง
จริง ๆ แล้วในงานนี้ยังเสนอระบบจำแนกประเภทวัตถุด้วย โดยใช้ feature พวก SIFT ที่คำนวณจากหลาย colorspace ร่วมกับการนำเสนอ (representation) ในรูปแบบปิระมิดเพื่อคงข้อมูล spatial ไว้ด้วย บางทีเราก็เรียก features พวกนี้รวม ๆ ว่า handcrafted features โดยในงานนี้คณะผู้วิจัยได้นำเอา handcrafted features นี้ไปใช้กับ SVM เพื่อจำแนกวัตถุที่ถูกเลือกมา

Selective Search จาก [2]

ถัดมา R-CNN นำเอา Selective Search มาใช้ แต่เปลี่ยนมาใช้ deep features ที่สกัดจาก CNN ที่ถูก train ล่วงหน้าแทน handcrafted features

ต่อมา SPPnet เสนอว่าในการคำนวณ CNN สำหรับ region ต่าง ๆ ที่ถูกเสนอโดย Selective Search นั้น น่าจะมีการคำนวณที่ซ้ำกันอยู่บ้าง เราสามารถทำให้การคำนวณไปเร็วขึ้นได้โดยการคำนวณ “บางส่วน” ของ CNN นี้ล่วงหน้าจากภาพนำเข้าทั้งภาพ จากนั้นจึงทำการเลือกเอาเฉพาะส่วนที่เราสนใจ (ที่ได้มาจาก Selective Search) เพื่อส่งต่อไปจำแนกประเภทต่อไป เราเรียกแนวความคิดนี้ว่า RoI pooling
แนวความคิดนี้ถือว่าดีมากเพราะสามารถทำให้ประมวลผลได้เร็วขึ้น
SPPnet นั้นใช้ SVM เป็นตัวจำแนกประเภท ซึ่งการสร้างแบบจำลอง 2 steps เช่นนี้ทำให้เราไม่สามารถนำเอา feedback จากชั้น SVM มาปรับ CNN ที่ทำหน้าที่สกัด features ได้ ในงานต่อมาคือ Fast R-CNN จึงเปลี่ยนจาก SVM ไปเป็นการต่อ Neural Networks (NN) ขึ้นไปแทน ซึ่งทำให้เราสามารถปรับทั้งส่วน feature extraction และ recognition ได้พร้อม ๆ กัน

ถัดจาก Fast R-CNN ก็มี Faster R-CNN
แนวความคิดหลักของ Faster R-CNN นั้นคือการนำเอา Selective Search มารวมไว้ใน NN ก้อนเดียวกัน
NN นี้มีส่วนประกอบหลัก 3 ส่วนคือ 1) ส่วนฐานที่ทำหน้าที่สกัด feature 2) ส่วน Region Proposal Network (RPN) ที่ทำหน้าที่สกัดเอาบริเวณที่ “น่าจะ” เป็นวัตถุจาก feature map และ 3) ส่วนจำแนกประเภท ที่นำเอา feature map และ region ที่ได้จาก RPN มาประมวลผลโดยทำ RoI pooling เพื่อตอบว่าบริเวณใดของภาพมีวัตถุใดอยู่
โดยส่วนตัวแล้วผมมักมอง Faster R-CNN นี้ว่าประกอบด้วย “ส่วนลำตัว” ข้างล่างที่ process รูปและส่งออก feature maps และ “ส่วนหัว” ที่ประกอบด้วย RPN และ classifier ที่ทำ RoI pooling จาก feature maps ที่ได้

Faster R-CNN จาก [5] “ส่วนลำตัว” ข้างล่างที่ process รูปและส่งออก feature maps และ “ส่วนหัว” ที่ประกอบด้วย RPN และ classifier ที่ทำ RoI pooling

ส่วน RPN นั้นน่าสนใจมาก หากเราทำ Selective Search เป็น process แยกเราสามารถเลือกจำนวน region เพื่อทำการตรวจสอบจำนวนเท่าใดก็ได้ แต่เมื่อเราต้องการใช้ NN เพื่อทาย region เหล่านี้ เราจำเป็นต้องกำหนดจำนวน region สูงสุดที่เราจะทายไว้ก่อน
ดังนั้น Faster R-CNN จึงสร้าง anchor box ไว้จำนวนหนึ่ง และสิ่งที่ RPN ทายคือตำแหน่งและขนาดของ box เหล่านี้ และความน่าจะเป็นที่มันจะเป็นกรอบล้อมวัตถุ

แนวความคิดของการทายตำแหน่ง+ขนาดของ box และความน่าจะเป็นที่มันจะเป็น กรอบล้อมวัตถุ นี้ถูกใช้ในอีกงานหนึ่งชื่อว่า YOLO (You Only Look Once)
แต่ทั้งนี้ YOLO นั้นมีแนวความคิดที่ต่างไปจาก Faster R-CNN นั่นคือ 1) แทนที่จะทาย box แล้วจึงส่งไป classify ต่อ YOLO นั้นทายทั้ง box และความน่าจะเป็นของคลาสต่าง ๆ ออกมาพร้อมกันเลย และ 2) แทนที่เราทายค่าต่าง ๆ จากทั้งภาพ เราจะแบ่งภาพออกเป็นส่วน ๆ สำหรับแต่ละส่วนเราจะทายทั้ง box และคลาส ซึ่งเราสามารถนำมารวมกันเพื่อเลือกคู่คลาส/box ที่คะแนนสูงสุดเป็นคำตอบ

ส่วนหัวของ YOLO จาก [6]

อีกโครงสร้างหนึ่งที่มองได้ว่าเป็นการต่อยอดจาก YOLO คือ SSD (Single Shot multi-Box Detector) ที่เสนอให้ทาย box ต่าง ๆ จากหลาย scale แทนที่จะทาย ณ scale เดียวแบบ YOLO วิธีนี้ช่วยให้รับมือกับภาพที่มีวัตถุ scale ต่างกันมากได้

YOLO และ SSD จาก [7]

โครงสร้างสุดท้ายที่ดูน่าสนใจคือ Feature Pyramid Network (FPN) ที่นอกจะทาย box จากหลาย scale แล้วยังมีการส่งข้อมูลจาก scale ใหญ่ไปเล็ก (ขาลง) และจากเล็กกลับมาใหญ่ (ขาขึ้น) นอกจากนี้ยังมีการส่งข้อมูลข้ามใน scale เดียวกันอีกด้วย อธิบายแล้วมึน 555 ดูรูปข้างล่างละกัน
โครงสร้างนี้ดูแล้วเหมือนกับ U-Net ที่ใช้ในงาน image segmentation โดย FPN นั้นอิงแนวความคิดว่าการนำเอาข้อมูลจากภาพใหญ่ แต่ได้จากการสร้างขาขึ้น นั้นทำให้ได้ข้อมูลที่มี high semantic content (เพราะจริง ๆ แล้วมันนับได้ว่าอยู่ใน layer ชั้นบน ๆ) ใน high resolution (เพราะเป็นภาพใหญ่) ใน CNN ปกติข้อมูล high semantic content มักอยู่ที่ low resolution นั่นคือ FPN สามารถดึงข้อมูลที่มี high semantic content จากทุก ๆ resolution ได้

FPN ตรงกับ (d), YOLO ตรงกับ (b) และ SSD ตรงกับ (c) จาก [8]

สิ่งที่ผมสังเกตคือโครงสร้างเหล่านี้สามารถแบ่งได้คร่าว ๆ เป็น 2 ส่วนคือ 1) ส่วนสกัด feature ผมเห็นบางคนก็เรียกส่วนนี้ว่าเป็น backend หรือ backbone ของ object detector และ 2) ส่วนที่นำเอา feature เหล่านี้ไปตรวจจับวัตถุในภาพ
ส่วน backend นี้มักต้องถูก pre-trained มาก่อน ส่วนมากก็ทำบน Imagenet จากนั้นจึงเอามาต่อยอดส่วนที่ 2 และ re-train ใหม่ หลาย ๆ ครั้งโครงสร้างของส่วนที่ 1 ก็เป็นพวกที่ใช้ซ้ำ ๆ กันเช่น VGG, ResNet, MobileNet เป็นต้น

ในปัจจุบันคนที่ทำงานคอมพิวเตอร์วิทัศน์คงต้องเริ่ม update พวก keywords ใหม่โดยเพิ่มชื่อพวก R-CNN, Fast R-CNN, Faster R-CNN, YOLO, SSD, FPN เข้าไปด้วยแล้ว

ปล. medium มันขอให้เลือกรูปเด่นซักรูป ผมไม่รู้จะเลือกอันไหนดีเลยเอาผลที่ได้จาก Mask R-CNN (เป็น extension ของ Faster R-CNN ที่นอกจากจะตีกรอบแล้วยังพยายามกำหนดรูปร่างของวัตถุด้วย) ของภาพที่ถ่ายเองละกัน 555

เอกสารอ้างอิงหลัก ๆ

  1. P. Viola , M. Jones, “Robust Real-time Object Detection.”, In International Journal of Computer Vision, 2001.
  2. J.R.R. Uijlings, K.E.A. van de Sande, T. Gevers, and A.W.M. Smeulders, “Selective Search for Object Recognition.”, In International Journal of Computer Vision, 2013.
  3. R. Girshick, J. Donahue, T. Darrell, and J. Malik, “Rich feature hierarchies for accurate object detection and semantic segmentation.”, In CVPR 2014
  4. K. He, X. Zhang, S. Ren, and J. Sun, “Spatial pyramid pooling in deep convolutional networks for visual recognition.” In ECCV,2014
  5. S. Ren, K. He, R. Girshick, and J. Sun, “Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks.” In IEEE Trans. Pattern Anal. Mach. Intell. 39(6): 1137–1149 (2017)
  6. J. Redmon, S. Divvala, R. Girshick, A. Farhadi. “You Only Look Once: Unified, Real-Time Object Detection.” In CVPR 2016
  7. W. Liu, D. Anguelov, D. Erhan, C. Szegedy, S.E. Reed, C.-Y. Fu and
    A.C. Berg. “SSD: Single Shot MultiBox Detector.” In ECCV 2016
  8. T.-Y. Lin, P. Dollar, R. Girshick, K. He, B. Hariharan, and S.J. Belongie “Feature Pyramid Networks for Object Detection.” In CVPR 2017

--

--

Responses (3)