ของเล่นช่วง COVID-19 MaskTheFace สร้าง Dataset คนใส่หน้ากากได้เอง

Original article was published by Sasiwut Chaiyadecha on Deep Learning on Medium


ที่ต้องมาเขียน Blog ตอนนี้เพราะปัญหาเรื่อง Data limitation จากตอนที่ Develop model ครั้งก่อน เนื่องจาก Dataset ที่ต้องใช้งานมีค่อนข้างจำกัด ใบหน้าต่าง ๆ ของผู้คนที่ใส่ Face mask หลาย ๆ แบบ มีอยู่น้อย ดังนั้นการ Training model อาจถูกจำกัดอยู่เพียงแค่ Dataset ใด Dataset หนึ่งเท่านั้น ดังนั้นเพื่อการ Training model ที่มีประสิทธิภาพ จึงควรที่มีใบหน้าหลากหลาย รวมไปถึงหน้ากากที่หลากหลายด้วย สุดท้ายแล้ว ยังไงก็คงหนีไม่พ้น Concept ที่ว่า Garbage in garbage out

Dataset ที่ Public ทั่วไปอาจตอบโจทย์ของการพัฒนาเพียงแค่ในระดับนึงเท่านั้น คงดีกว่ามากถ้าสามารถสร้าง Dataset เกี่ยวกับ Face mask ได้ด้วยตัวเอง

MaskTheFace

ไปค้นเจอใน GitHub ชื่อว่า MaskTheFace เป็น Python script ที่เอาไว้ “แปะ” หน้ากากลงบนภาพใบหน้าที่ไม่มีหน้ากาก สามารถรองรับรูปที่มีหลายใบหน้า และมีหน้ากากหลากหลายแบบให้เลือกใช้งานด้วย ฟังดูแล้วมันสามารถเข้ามาแก้ปัญหา Data limitation ได้ด้วยการสร้างมันขึ้นมาใหม่เลย

Install

Download script จากลิงค์ใน GitHub และจากคำแนะนำที่ว่า ควรสร้าง Environment ใหม่ขึ้นมา และควรใช้เป็น Python 3.6 เพื่อเลี่ยงโอกาสการเกิด Error ขึ้น ควรทำตามขั้นตอนที่แนะนำไว้

conda create -n masktheface python=3.6

ทำการ Activate environment ที่เพิ่งสร้างขึ้นมาใหม่ conda activate masktheface จากนั้น cd ไปที่ Directory ที่เก็บไฟล์ MaskTheFace ไว้ ต่อไปต้องติดตั้ง Requirement ที่จำเป็นสำหรับการรัน Script กันก่อน

pip install –r requirements.txt

เนื่องจาก Script มีการ Require libraries ค่อนข้างเยอะพอสมควร หนึ่งในนั้นคือ dlib ที่หลายคนอาจมีปัญหาในการติดตั้ง ซึ่งสามารถทำตามขั้นตอนการติดตั้ง dlib ที่เคยเขียนไว้เมื่อนานมาแล้วได้ตาม Links ด้านล่าง โดยมีทั้งภาษาไทยและภาษาอังกฤษ

Use

วิธีการใช้งานนั้นง่ายแสนง่าย สามารถพิมพ์ Code ตามตัวอย่างที่บอกไว้ใน GitHub ได้เลย

# Generic
python mask_the_face.py --path <path-to-file-or-dir> --mask_type <type-of-mask> --verbose --write_original_image

# Example
python mask_the_face.py --path 'data/office.jpg' --mask_type 'N95' --verbose --write_original_image

ข้อควรระวัง เนื่องจากตัวอย่างใน GitHub มีการใส่ ‘’ เข้ามาสำหรับ Arguments ต่าง ๆ แต่การใช้งานจริง ไม่ต้องใส่ ‘’ เพื่อประกาศ Arguments สามารถพิมพ์ตามตัวอย่างด้านล่างได้เลย

python mask_the_face.py --path data/1.jpg --mask_type N95  --verbose --write_original_image

นอกจากนี้ตัว Script ยังสามารถเพิ่ม Arguments ต่าง ๆ ได้ ไม่ว่าจะเป็นการเลือกประเภทของหน้ากาก (อยู่ในโค้ดตัวอย่าง) รวมไปถึงการใส่ Pattern ให้หน้ากาก การใส่สีสันต่าง ๆ ซึ่งสามารถปรับแต่งได้พอสมควร สามารถดูรายละเอียดได้ตามตารางด้านล่าง

Result

ลองนำภาพใบหน้ามาทดลองใช้งาน Script ผลปรากฎว่าสามารถทำงานออกมาได้อย่างดีเยี่ยม ซึ่งสามารถดูผลได้จากรูปภาพประกอบด้านล่าง

ภาพก่อนใส่หน้ากาก
ภาพหลังใส่หน้ากาก โดยเลือกเป็นหน้ากาก n95
ทดลองกับรูปภาพที่ใบหน้าคนมีขนาดเล็ก และวัตถุอยู่ไกลออกไป
script สามารถตรวจจับใบหน้า และใส่หน้ากากได้อย่างแนบเนียน
ทดสอบกับภาพที่มีวัตถุอื่นใกล้ใบหน้า โดยในรูปนี้คือมือ
หน้ากากแปะเข้าไปผิดที่นิดเดียว แต่ถือว่าดีมากแล้ว

Conclusion

Script นี้เป็นสิ่งที่ดีมาก สำหรับการสร้าง Dataset เอาไว้ทำโมเดลต่อยอดต่อไปได้อย่างหลากหลาย ประกอบกับการใช้งานที่ง่ายแสนง่าย (ย้ำรอบที่ 2) ถือว่าแนะนำให้ใช้งานอย่างจริงจัง