Face mask detection #1: หาคนใส่หน้ากากป้องกัน COVID-19 ด้วยโมเดล

Sasiwut Chaiyadecha
3 min readJul 10, 2020

--

ถึงตอนนี้ COVID-19 ก็ยังไม่หายไปไหน สงสัยเราต้องอยู่กับมันไปอีกนานเลย ตอนแรกก็ว่าจะ Move on จากเรื่องนี้แล้วนะ แต่ก็ยังมีอะไรที่อยากทำ อยากลองใช้ Dataset เกี่ยวกับเรื่องนี้อยู่ เพราะว่า Data มันก็มีมากขึ้นเรื่อย ๆ ทุกวัน

face mask detection covid-19

วันนี้เราก็กลับมาเรื่อง 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 หลัก ๆ คือ

  1. รูปหน้าจริงและรูปหน้าที่ใส่หน้ากากจริง ๆ
  2. รูปหน้าจริงและรูปหน้าที่ใช้โมเดลเอาหน้ากากมาแปะไว้

ซึ่งถ้าพูดถึงเรื่องความแม่นยำ ความละเอียด แน่นอนว่า 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 model
  • shuffle ต้องมีการ 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 สามารถย้อนอ่านตามลิงค์ข้างล่างได้ครับ ตอนนั้นเขียนไว้ละเอียดมาก

face mask detection covid-19
model architecture หน้าตาประมาณนี้

เราไป Define ตัว Model optimiser ใช้ Adam เหมือนเดิม แล้วก็เริ่ม Training model ได้เลย ซึ่งกำหนดไว้ 10 Epochs ก่อน ส่วน batch_size ใส่ให้เท่ากับ Training data ที่เราทำไว้ตอนแรกที่ 64 ใครอยากปรับเพิ่มหรือลดก็ได้ตามสะดวกครับ

face mask detection covid-19

เห็นได้ว่าค่า Loss ลงไปต่ำมาก ๆ แล้ว และค่า Accuracy ก็สูงลิ่วเช่นกัน เอาเป็นว่าพอใจที่จุดนี้แล้วกันนะ เมื่อได้โมเดลแล้ว ก็ใช้ model.save() เก็บไว้ได้เลย มันจะไปโผล่ที่ Directory ที่เราตั้งไว้ตั้งแต่ตอนแรก โดยจะเป็นโฟสเดอร์ที่นามสกุล .model

จบตอนนี้เท่านี้ก่อนดีกว่า…. เดี๋ยวตอนหน้าเรามาแก้ปัญหาส่วนที่เหลือก็คือ การ Detect ใบหน้าคนจากไฟล์ที่เป็น Video หรือกล้อง Real-time จากนั้นเอาโมเดลที่เพิ่งทำเสร็จไป Predict ดูว่าใส่ Face mask หรือไม่ใส่

--

--

Sasiwut Chaiyadecha
Sasiwut Chaiyadecha

No responses yet