
demo: https://huggingface.co/spaces/xvjiarui/GroupViT
colab notebook: https://colab.research.google.com/github/xvjiarui/GroupViT/blob/master/demo/GroupViT_hf_inference_notebook.ipynb
ครบเครื่องเรื่อง Segmentation ด้วย Universal Segmentation ที่ Huggingface
=========
หยิบรูปภาพที่เราสนใจมาหนึ่งรูป สมมติมีขนาดกว้างและยาว HxW pixels, โมเดล segmentation จะทำหน้าที่ระบุว่า pixels ไหนบ้างที่มี objects ที่เราสนใจอยู่ (รูปที่ 1)
โดยมาตรฐานการทำ segmentation นั้นมีอยู่ 3 แบบคือ
- Instance Segmentation (รูป 1.c) ซึ่งเป็นงานที่พัฒนาต่อยอดจาก "Object Detection" ซึ่งคืองานที่จะสร้าง Box สี่เหลี่ยมล้อมรอบ object ต่างๆ ที่เราสนใจ เช่น คน สัตว์ สิ่งของที่สำคัญต่างๆ โดย Instance Segmentation จะพยายามระบุ pixels ทั้งหมดของ object นั้นๆ มาเลย แทนที่จะระบุ box สี่เหลี่ยมง่ายๆ แบบ object detection
งาน Instance Segmentation และ Object Detection จะมีจุดเด่น ดังนี้
1.i) detect แต่ละ objects แยกกัน แม้จะเป็นชนิดเดียวกัน เช่นในรูป 1.c มีคนอยู่ 3 คน เจ้าโมเดล Instance Segmentation ก็จะ return output มา 3 objects คือ "คน 1", "คน 2" และ "คน 3" แทนที่จะ detect ทั้ง 3 คนรวมเป็นก้อนเดียวกันและเรียกว่า "กลุ่มคน"
1.ii) แต่ละ object จะ overlap กันได้ เช่น มีคน 2 คนยืนซ้อนกันอยู่ เจ้า object detection ก็จะพยายาม return box ที่ครอบคลุมส่วนที่ถูกทับมาให้ด้วย ส่วน Instance Segmentation ก็เช่นเดียวกัน จะพยายาม return pixels ที่ถูกทับซ้อนมาให้ด้วย (แต่จะแม่นยำหรือเปล่า เป็นอีกเรื่อง)
1.iii) มักไม่สนใจ background เช่น พื้นดิน ท้องฟ้า ทะเล เป็นต้น ดังนั้น pixels ของ background ทั้งหลายจะไม่ถูก detect
.
2) Semantic Segmentation (รูป 1.b) มีเป้าหมายที่แตกต่างจาก Instance segmentation นั่นคือต้องการระบุ class ให้ทุกๆ pixel ในรูปว่าเป็น pixel ของอะไร ดังนั้น
2.i) งาน semantic segmentation จึงไม่แยก background หรือ object จึงมี class ของ ท้องฟ้า ทะเล พื้นดิน ด้วย
2.ii) ในทางตรงข้ามกับ 1.i) เจ้า semantic segmentation จะ detect "กลุ่มคน" หรือ "กลุ่ม objects" ที่เป็นชนิดเดียวกันมัดรวมกันมาเลย จะไม่แยก object เหมือน instance detection
สังเกตรูป 1.b) ที่ semantic segmentation ให้สีคนทั้ง 3 เป็นสีเดียวกัน นั่นคือมอง pixels ทั้ง 3 กลุ่มนี้เป็นชนิดเดียวกัน
.
3) Panoptic segmentation ถูกเสนอในปี 2018 โดยทีมของ Facebook AI โดยต้องการเอาจุดเด่นของ Instance และ Semantic segmentation มารวมกัน นั่นคือใน Panoptic segmentation นั้นจะระบุ class ให้ทุก pixel เช่นเดียวกับโมเดล semantic แต่ขณะเดียวกันก็จะระบุ object ต่างๆ แยกกัน เช่นเดียวกันกับ 1.i) โดยรูป 1.d แสดงตัวอย่าง Output ของ panoptic
อย่างไรก็ดีเนื่องจากแต่ละ pixel จะมี 1 class, ถ้ามีคน 2 คนยืนซ้อนกันอยู่ Panoptic model จะไม่สามารถระบุได้
.
ไม่ว่าเพื่อนๆ จะสนใจงาน segmentation แบบไหนใน 3 แบบมาตรฐานด้านบน ในวันนี้เราสามารถโหลดโมเดลที่ถูกสอนมาแล้วได้จาก Huggingface model hub ครับ
อย่างไรก็ดี ในปัจจุบันมีโมเดล 3-in-1 ที่เรียกว่า Universal Segmentation ออกมาทำให้เราไม่ต้องโหลดหลายโมเดลในการทำทั้ง 3 งาน
อนึ่ง วันนี้ Huggingface Model Hub ไม่ได้เป็นเบอร์หนึ่งแค่เรื่อง Text/Language models เท่านั้นอีกต่อไปแล้ว โดย Huggingface นั้นส่งสัญญาณจะเป็นศูนย์รวมของโมเดลชั้นนำทุกหมวดหมู่ เช่น Image/Vision, Audio และ Generative models โดยเฉพาะหลังจากดึงตัว Ross Wrightman เจ้าของ github repo "pytorch image model" เข้าร่วมทีม
.
3-in-1 และ Universal Image Segmentation
--------------
ปัจจุบันมีโมเดล Mask2Former และ OneFormer ที่เป็นโมเดลแบบ 3-in-1นั่นคือ architecture เดียวสามารถ segment ได้ทั้ง 3 แบบ
อย่างไรก็ดี ในการใช้งานแต่ละแบบนั้นโมเดล Mask2Former จำเป็นต้องเทรนข้อมูลในแต่ละแบบก่อนที่จะใช้งาน ในขณะที่โมเดล OneFormer ถูกออกแบบมาให้เป็น one-architecture, all-dataset นั่นคือสามารถเทรน datasets ของงาน segmentation ทั้ง 3 แบบได้พร้อมกัน (รูปที่ 2)
จึงเป็นที่มาของชื่อ Universal Image Segmentation ของ Oneformer นั่นเองครับ
ซึ่งเพื่อนๆ สามารถดูวิธีใช้งานง่ายๆ จาก Huggingface Model Hub ได้อย่างละเอียดที่นี่ครับ
Mask2Former:
ส่วนการ FineTune โมเดลกับข้อมูลสอนของเพื่อนๆ เองสามารถดูตัวอย่างได้ที่นี่ครับ https://github.com/NielsRogge/Transformers-Tutorials/tree/master/MaskFormer/Fine-tuning
Credit : โครงหลักและดูลิงก์อ้างอิงเพิ่มเติมได้ที่ blog นี้ครับ : https://huggingface.co/blog/mask2former
.
รายละเอียดศึกษาเพิ่มเติม A --------
เดิม Semantic Segmentation ถูก formulate ให้เป็นปัญหา pixel classification ซึ่งทำให้เรากำหนด labels และ loss function ได้ง่ายๆ (นั่้นคือใช้ category crossentropy)
ในขณะที่ Instance Segmentation เนื่องจากวัตถุสามารถซ้อนกันได้ นั่นคือแต่ละ pixel สามารถเป็นส่วนนึงของ object ต่างกันที่ซ้อนกันอยู่ได้, Instance Segmentation (และโมเดลหลังๆ เช่น DETR, Mask2Former, OneFormer) จะ return output ต่างออกไป เรียกว่า "Binary Mask" output
รูปที่ 3
ดูรูปที่ 3, โมเดลที่ใช้ Binary Mask output จะ return N (masks, class) prediction มา โดย N จะเป็น constant ของโมเดลเช่นถ้า N=100 (ค่ามาตรฐาน) นั่นหมายความว่าโมเดลจะ assume ว่าในรูปจะมีวัตถุไม่เกิน 100 objects
และเนื่องจากบางรูปมีวัตถุ M < N วัตถุ, ในกรณีนี้ "Binary Mask output" ของโมเดลที่แม่นยำก็จะทำนาย Null-class (ไม่มีวัตถุ) ใน N-M masks นั่นเอง
ความยากทางเทคนิคอย่างหนึ่งของ BinaryMask output ก็คือการออกแบบ loss function เนื่องจาก set ของ Binary Masks ที่ทำนายไม่มี natural order หรือตำแหน่งที่ชัดเหมือนกับ pixels นั่นทำให้ในการคำนวณ loss function เราจะไม่ทราบว่า ควรจะเอา Binary Mask ไหนไปเทียบกับ label ไหน
เช่นในรูปที่ 3 โมเดล return output mask-ท้องฟ้า mask-พื้นดิน mask-อาคาร และอีก 97 Null-mask ตามลำดับ ทว่าใน labels ของรูปนี้อาจเป็น "mask-อาคาร" "mask-ท้องฟ้า" และ "mask-พื้นดิน" ซึ่งสังเกตว่า "ลำดับ" ของ prediction กับ label นั้นไม่ตรงกัน
ถ้าเทียบตามลำดับตรงๆ จะทำให้เราเอา predicted-mask-ท้องฟ้า เทียบกับ label-mask-อาคาร เป็นต้น
การคำนวณ loss function ของ Binary Mask Output (ซึ่งในงานวิจัยเรียกว่า Bipartite-Matching Loss) จึงมีขั้นตอนหา Best Matching อีกขั้นตอนหนึ่งก่อนที่จะคำนวณ loss ในแต่ละ mask
โดย Bipartite Matching Loss นั้นใช้ Hugarian Matching Algorithm เพื่อ preprocess สลับลำดับของ labels ก่อนที่จะ match กับแต่ละ predicted Binary mask output
จุดกำเนิดของ Bipartite-Matching Loss นั้นเริ่มมาจากงาน DETR ซึ่งโมเดลหลังๆ ก็นำมาใช้ สามารถศึกษารายละเอียดได้จากแหล่งนี้ครับ
- DETR: End-to-End Object Detection with Transformers | Paper Explained :
https://www.youtube.com/watch?v=BNx-wno-0-g
https://www.youtube.com/watch?v=xkuoZ50gK4Q
.
รายละเอียดศึกษาเพิ่มเติม B --------
ถ้าเพื่อนๆ ต้องการเรียนรู้เพิ่มเติมเกี่ยวกับโมเดล Panoptic Segmentation สามารถดูได้จาก
https://pyimagesearch.com/2022/06/29/semantic-vs-instance-vs-panoptic-segmentation/
https://kharshit.github.io/blog/2019/10/18/introduction-to-panoptic-segmentation-tutorial
เปเปอร์ MaskFormer : https://ar5iv.labs.arxiv.org/html/2107.06278
เปเปอร์ Mask2Former : https://ar5iv.labs.arxiv.org/html/2112.01527
เปเปอร์ OneFormer : https://ar5iv.labs.arxiv.org/html/2211.06220