Face mask detection #1: หาคนใส่หน้ากากป้องกัน COVID-19 ด้วยโมเดล
ถึงตอนนี้ COVID-19 ก็ยังไม่หายไปไหน สงสัยเราต้องอยู่กับมันไปอีกนานเลย ตอนแรกก็ว่าจะ Move on จากเรื่องนี้แล้วนะ แต่ก็ยังมีอะไรที่อยากทำ อยากลองใช้ Dataset เกี่ยวกับเรื่องนี้อยู่ เพราะว่า Data มันก็มีมากขึ้นเรื่อย ๆ ทุกวัน
วันนี้เราก็กลับมาเรื่อง Computer vision อีกรอบนึง เราเคยทำ Face detection ไปแล้ว เราเคยทำ Object detection ไปแล้ว เราลองเอาทั้งสองอย่างมารวมกันดูไหม? อยากรู้ว่ามันจะเป็นยังไง? ครั้งนี้ลองมาทำ Model ตรวจจับการใส่หน้ากาก หรือ Face mask detection กันดีกว่า
ความท้าทายของโมเดลนี้ก็คือ เราต้องตรวจจับใบหน้าออกมาให้ได้ก่อน แล้วเอาใบหน้านั้นไปใช้โมเดลที่เรา Training มันมา ลองดูว่าใบหน้านั้นสวมใส่หน้ากากหรือไม่ แต่ความซับซ้อนมันก็เพื่อไปอีก เพราะว่าถ้าตรวจจับแค่รูปภาพ มันก็ดูจะไม่ได้ประโยชน์อะไรจากการ Train model เท่าไหร่ ดังนั้น Model ควรถูกใช้กับภาพเคลื่อนไหว เช่น กล้องวงจรปิด หรือ Real-time video
เมื่อได้โจทย์ทั้งหมดแล้วก็มาเริ่มแก้ปัญหาไปทีละขั้นเลย
Dataset
สิ่งแรกสุดที่เราต้องมีคือ Data เราต้องหาใบหน้าคนปกติ และใบหน้าคนที่สวม Face mask เพื่อที่จะนำทั้งสอง Classes มาทำ Model training ถ้าลองค้น ๆ ดูจะพบว่า Dataset ที่เกี่ยวกับข้องกับเรื่องนี้แบ่งออกเป็น 2 Sets หลัก ๆ คือ
- รูปหน้าจริงและรูปหน้าที่ใส่หน้ากากจริง ๆ
- รูปหน้าจริงและรูปหน้าที่ใช้โมเดลเอาหน้ากากมาแปะไว้
ซึ่งถ้าพูดถึงเรื่องความแม่นยำ ความละเอียด แน่นอนว่า Dataset แรกดีกว่าอยู่แล้ว เหมาะสำหรับคนที่อยาก Build model เองตั้งแต่แรกสุด แต่ว่าวันนี้ผมจะใช้ Dataset ที่ 2 ครับ ซึ่งสามารถโหลดได้จาก Link ข้างล่าง
เหตุผลคือ เราไม่ได้ต้องการที่จะ Build model ตั้งแต่แรก แต่จะใช้ Model ที่มีคน Train เสร็จแล้ว เอามาทำ Fine tuning ต่อ ซึ่ง Model ที่ใช้ครั้งนี้คือ MobileNetV2
Google Colab
วันนี้ทำทุกอย่างบน Colab ทั้งหมดเลยละกัน ไม่เหมือนตอนก่อนหน้านี้ ที่เราเตรียม Dataset กันบนเครื่อง Local แล้วอัพขึ้นไป Training บน Colab ดังนั้นวันนี้เราต้องอัพโหลด RAW data ขึ้นไว้บน Cloud ก่อน จะใช้เป็น Google drive หรือใช้ Space ของ Colab ก็ได้เหมือนกัน (ระวังหาย)
เหมือนเดิมก่อนที่จะเริ่มต้นทำอะไรทุกอย่าง เราต้อง Import libraries ที่จำเป็นต้องใช้ทั้งหมดก่อน ถ้าอ้างอิงจากตอนเก่า ๆ ที่ผ่านมาจะพบว่ามีอะไรบางอย่างที่แปลกไปจากสิ่งที่ผมใช้อยู่เป็นประจำ คือ ImageDataGenerator
และ MobileNetV2
ซึ่งวันนี้มาลองใช้งานกัน
วันนี้ไม่ใช้ OpenCV ในการอ่านภาพเข้ามาละ แต่จะใช้ ImageDataGenerator
แทน เพราะว่ามันสะดวกและเร็วกว่ามาก ๆ อันดับแรกเราต้องสร้างตัวแปรมารับค่าจาก ImageDataGenerator
ก่อน โดยคำสั่งเป็นเหมือนการจัดการกับรูปภาพของเรา เช่น การซูม การพลิกกลับรูป การเอียงซ้ายขวา เพราะว่าเราต้องการจะนำโมเดลนี้ไปใช้การงาน Video ดังนั้นองศาของภาพในแต่ละ Frame จะเกิดเยอะกว่ารูปภาพธรรมดา จึงเป็นการดีที่กำหนดค่าเอาไว้ก่อน สิ่งที่อยากให้สนใจก็คือ rescale
อย่าลืมว่าเราต้อง Normalized รูปก่อนนำเข้าไป Train ซึ่ง ImageDataGenerator
สามารถจัดการได้เลย
จากนั้นใช้ตัว .flow_from_directory()
เพื่อให้ตัว Generator เข้าไปอ่านรูปภาพ โดยรูปภาพ ต้องแบ่งออกเป็น 2 โฟลเดอร์ตาม Class ที่เราต้องการสร้างโมเดล ในที่นี้ก็คือ with_mask
และ without_mask
ที่อยากให้สนใจก็คือ
target_size
ควรมีขนาด(224,224)
เพราะเป็นความละเอียดสูงสุดที่MoblieNetV2
สร้างมาbatch_size
ตั้งเป็นอะไรก็ได้ แต่มีค่าเดียวกันกับตอน Training modelshuffle
ต้องมีการshuffle
เพื่อให้ Dataset มันไม่เรียงตามลำดับมากจนเกินไป หรือพูดง่าย ๆ มันคือการสลับแบบ Random นั่นเอง
รูปภาพที่ใช้ทั้งหมดมี 1,376 รูป แบ่งออกเป็นทั้งหมด 2 Classes ครับ (ไม่เยอะเลย)
ต่อมาเป็นการออกแบบ Model architecture อย่างที่บอกไปตอนแรกว่าเราไม่ได้จะ Build model เองตั้งแต่ต้น แต่เราจะใช้ MobileNetV2
มาทำ Fine tuning ด้วย CNN เราจึงต้อง add MobileNetV2
เอาไว้อันดับแรกสุด แล้วตามด้วย Layer ต่าง ๆ ส่วนของการออกแบบโมเดล จะคล้าย ๆ กับตอนที่ CNN Model เพื่อวิเคราะห์ X-Ray film COVID-19 สามารถย้อนอ่านตามลิงค์ข้างล่างได้ครับ ตอนนั้นเขียนไว้ละเอียดมาก
เราไป Define ตัว Model optimiser ใช้ Adam
เหมือนเดิม แล้วก็เริ่ม Training model ได้เลย ซึ่งกำหนดไว้ 10 Epochs ก่อน ส่วน batch_size
ใส่ให้เท่ากับ Training data ที่เราทำไว้ตอนแรกที่ 64 ใครอยากปรับเพิ่มหรือลดก็ได้ตามสะดวกครับ
เห็นได้ว่าค่า Loss ลงไปต่ำมาก ๆ แล้ว และค่า Accuracy ก็สูงลิ่วเช่นกัน เอาเป็นว่าพอใจที่จุดนี้แล้วกันนะ เมื่อได้โมเดลแล้ว ก็ใช้ model.save()
เก็บไว้ได้เลย มันจะไปโผล่ที่ Directory ที่เราตั้งไว้ตั้งแต่ตอนแรก โดยจะเป็นโฟสเดอร์ที่นามสกุล .model
จบตอนนี้เท่านี้ก่อนดีกว่า…. เดี๋ยวตอนหน้าเรามาแก้ปัญหาส่วนที่เหลือก็คือ การ Detect ใบหน้าคนจากไฟล์ที่เป็น Video หรือกล้อง Real-time จากนั้นเอาโมเดลที่เพิ่งทำเสร็จไป Predict ดูว่าใส่ Face mask หรือไม่ใส่