ผู้เขียนบทความ : นายมูฮำหมัด ปูตีล่า
1. ความเป็นมา
ความเป็นมาของระบบนี้ เมื่อประมาณวันที่ 13 มกราคม 2563 มีการพบโรคระบาดชนิดใหม่ในประเทศไทย เป็นผู้ป่วยรายแรกในประเทศไทย ซึ่งโรคระบาดนี้ได้มีผลกระทบต่อประเทศไทยเป็นอย่างมาก นับตั้งแต่วันนั้นที่พบเจอโรคนี้ในประเทศไทย ทำให้คนภายในประเทศไทยต้องใช้ชีวิตอย่างระมัด ระวัง เพื่อป้องกันการติดเชื้อจากโรคเหล่านี้ ทำให้คนในประเทศไทยต้องสวมใส่หน้ากากอนามัยเพื่อป้องกันตัวเอง (Protect yourself) และเป็นเหตุให้สถานที่ต่าง ๆ ไม่ว่าจะเป็น ร้านค้าหรือห้างสรรพสินค้า หรือเป็นสถานที่บันเทิงต่าง ๆ ต้องมีมาตรการป้องกันโรค COVID-19 โดยการสวมใส่หน้ากากอนามัย และเมื่อทุกคนจำเป็นที่จะต้องใส่หน้ากากอนามัยเพื่อป้องกันโรคระบาดชนิดนี้ ทุกห้างสรรพสินค้า หรือร้านค้าต่าง ๆ ก็ต้องตรวจผู้คนที่ผ่านเข้ามาในร้านโดยผู้คนที่ผ่าน เข้ามาในร้านก็จะต้องสวมใส่หน้ากากอนามัย เพื่อป้องกันการแพร่เชื้อ หรือกระจายเชื้อให้ผู้อื่น และเป็นการป้องกันตัวเองด้วย (Protect youself) เมื่อมีผู้คนเข้าใช้บริการห้างสรรพสินค้าจำนวนมากสิ่งที่เกิดขึ้นก็จะทำให้การตรวจหน้ากากอนามัยเต็มไปด้วยความยากลำบาก เพราะต้องใช้กำลังคนในการตรวจสอบหน้ากากอนามัย
ระบบการตรวจจับหน้ากากอนามัย หรือ Mask Detection นี้สร้างขึ้นมาเพื่อแก้ปัญหาดังกล่าวที่ได้กล่าวมาแล้วข้างต้น สามารถที่จะช่วยลดจำนวนคนที่ใช้ในการตรวจสอบการสวมใส่หน้ากากอนามัย เป็นการตรวจจับด้วยระบบ Mask Detection แทนเพื่อความสะดวก และรวดเร็วในการตรวจสอบบุคคลเข้าสู่ห้างสรรพสินค้า หรือร้านค้าต่าง ๆ ที่มีผู้คนเข้าออกจำนวนมาก
2. วัตถุประสงค์
- เพื่อตรวจจับบุคคลที่ไม่สวมใส่หน้ากากอนามัย
- เพื่อจะลดระยะเวลาในการตรวจหน้ากากอนามัยตามสถานที่ต่าง ๆ
- เพื่อที่จะลดแรงงานจากคนที่ต้องตรวจสอบหน้ากากอนามัย
3. ขอบเขต
- ระบบสามารถที่จะแยกบุคคลสวมใส่หน้ากากอนามัย
1.1 บุคคลที่ไม่สวมใส่หน้ากากอนามัยจะขึ้นกรอบสีแดง
1.2 บุคคลที่สวมใส่หน้ากากอนามัยจะขึ้นกรอบสีเขียว - ระบบสามารถที่จะแสดงเปอร์เซ็น
2.1 เปอร์เซ็นที่จะมีโอกาสไม่สวมใส่หน้ากากอนามัย
2.2 เปอร์เซ็นที่จะมีโอกาสที่สวมใส่หน้ากากอนามัย - ระบบสามารถที่จะส่งเสียงแจ้งเตือน
3.1 ตรวจเจอบุคคลที่ไม่ใส่หน้ากากอนามัยจะส่งเสียงแจ้งเตือน
3.2 ตรวจไม่เจอบุคคลที่ไม่สวมใส่หน้ากากอนามัยจะไม่มีการส่งเสียงออกมา - ระบบมีไฟแจ้งเตือน
4.1 ตรวจเจอบุคคลที่ไม่ใส่หน้ากากอนามัยจะมีไฟแจ้งเตือน
4.2 ตรวจเจอบุคคลที่ใส่หน้ากากอนามัยจะไม่มีไฟแจ้งเตือน
4. ประโยชน์ที่คาดว่าจะได้รับ
- สามารถที่จะนำระบบไปต่อยอดหรือประยุกต์ในการพัฒนาต่อได้
- ลดระยะเวลาในการตรวจจับหน้ากากอนามัย ในช่วงที่มีบุคคลจำนวนมากอยู่
- สามารถเรียนรู้และเข้าใจในเรื่องของ Image Processing
- คัดแยกบุคคลสวมใส่หน้ากากอนามัยและไม่สวมใส่หน้ากากอนามัยได้อย่างรวดเร็ว
5. ความรู้ที่เกี่ยวข้อง
แนะนำโปรแกรมหลัก ๆ ที่ต้องติดตั้งมาใช้งานกับระบบซึ่งสามารถหาโหลดได้ทางอินเตอร์เน็ต
- Anaconda
- Visual studio code
- Arduino IDE
อะไรคือ Tensorflow
Tensorflow เป็นไลบารี่เป็นแบบ Open Source สำหรับการใช้พัฒนา Machine learning ถูกพัฒนาขึ้นมาโดยกูเกิล โดยกูเกิลได้ปล่อย Library ที่ใช้งานกันในกูเกิลเอง ให้กลายเป็นแบบ Open Source ให้ทุกคนสามารถที่จะนำเอามาใช้ได้
สถาปัตยกรรม Tensorflow
ด้านสถาปัตยกรรมแบ่งเป็น 3 ส่วน
- การเตรียมประมวผลข้อมูล
- การสร้างแบบจำลอง
- ฝึกและประเมินแบบจำลอง
ส่วนประกอบของ Tensorflow
Tensor
ชื่อของ Tensorflow มาจากชื่อเฟรมเวิร์กที่ถูกนำมาพัฒนาต่ออย่าง Tensor การคำณวนทั้งหมดจึงเกี่ยวข้องเวกเตอร์ และ เมทริกซ์หลายมิติ ที่มีข้อมูลจุอยู่หลายหลากชนิด ค่าทั้งหมดในหนึ่ง Tensor จะมีขนาดของข้อมูลแตกต่างกันไปที่เรียกว่า shape
Graphs
Tensorflow ก็ใช้ graph เฟรมเวิร์กด้วย โดย graph จะเป็นตัวรวบรวมและอธิบายชุดการคำนวณทั้งหมดในระหว่างการฝึก graph จึงมีประโยชน์มากมายทั้ง
- สามารถทำงานผ่าน CPUs และ GPUs ได้
- ความสามารถในเรื่องการพกพา ทำให้สามารถหยิบใช้งานได้อย่างทันที และสามารถบันทึก graph เพื่อดำเนินการต่อในอนาคต
- การคำนวณทั้งหมดใน graph เกิดจาก tensor ที่เชื่อมไว้ด้วยกัน
การติดตั้ง Tensor flow มาใช้งานผ่าน Command Line คำสั่ง :
pip install tensorflow
หากต้องการให้รันบน GPU ติดตั้งได้ด้วยคำสั่ง :
pip install tensorflow-gpu
เราสามารถที่จะทดสอบการใช้งานได้ด้วยโปรแกรม :
$ python3
...
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print(sess.run(hello))
Hello, TensorFlow!
>>> a = tf.constant(10)
>>> b = tf.constant(32)
>>> print(sess.run(a + b))
42
>>>
imutils คืออะไร ?
imutils เป็น library เบื้องต้นของ image processing พวกหมุนภาพ กลับภาพ ปรับขนาด
ถ้าเราต้องการ เรียก Library imutils มาใช้งาน คำสั่ง :
import imutils
argparse คืออะไร ?
โมดูล argparse เป็นโมดูลที่ช่วยให้ขียนส่วนรับอาร์กิวเมนต์ของโปรแกรมได้
ถ้าต้องการเรียกใช้งาน Library argparse คำสั่ง :
import argparse
NumPy คืออะไร ?
NumPy เป็นชื่อของ library ที่ใช้ในการคำนวนทางคณิตศาสตร์ในภาษา Python ซึ่งภายในถูกเขียนด้วยภาษา C จึงทำงานได้เร็วและมีประสิทธิภาพ โดย NumPy มีความสามารถในการจัดการกับอาเรย์หลายมิติและข้อมูลแบบเมทริกซ์
เราสามารถติดตั้ง NumPy ได้ง่ายผ่าน package installer ของ Python ด้วยคำสั่ง :
pip install numpy
การเรียกใช้งาน Library numpy คำสั่ง :
import numpy
หรือเราสามารถทดสอบ การคำนวณ างคณิตศาสตร์ด้วย Library numpy ด้วยโปรแกรม :
import numpy as np
a = np.array([1,2,3])
print(a) # [1 2 3]
print(type(a)) # <class 'numpy.ndarray'>
OpenCV คืออะไร?
OpenCV (Open source Computer Vision) เป็นไลบรารีฟังก์ชันการเขียนโปรแกรม (Library of Programming Functions) โดยส่วนใหญ่จะมุ่งเป้าไปที่การแสดงผลด้วยคอมพิวเตอร์แบบเรียลไทม์ (Real-Time Computer Vision)
การติดตั้ง opencv สำหรับ python
การติดตั้งแบบ Installing OpenCV-Python from Pre-built Binaries
ติดตั้งผ่าน Python Package Index
pip install numpy
pip install opencv-python
pip install opencv-contrib-python
ถ้าต้องการเรียกใช้งาน Library Opencv คำสั่ง :
import cv2
Libarry ที่จะต้องติดตั้งเมื่อต้องการนำ python มาติดต่อกับ Serial คือ Library ที่ชื่อว่า pyserail โดยวิธีการติดตั้ง Library ใช้คำสั่ง :
pip install pyserial
เมื่อต้องการ เรียกใช้งาน Library pyserial คำสั่ง :
import serial
และ Library สำหรับการ Import Sound มาใช้งาน ใช้คำสั่ง :
pip install mixer
เมื่อต้องการเรียกใช้งาน Library mixer คำสั่ง :
import mixer
หลังจากที่ได้ติดตั้งโมดูลต่าง ๆ เรียบร้อยแล้ว อุปกรณ์ที่ต้องเตรียมสำหรับการเขียนภาษาไพทอน ติดต่อกับ Arduino
- ESP8266
2. สาย Micro usb
3. breadboard
4. ไดโอดเปล่งแสง
5. สายไฟจั้มเปอร์
6. ตัวต้านทาน ขนาด 220 โอห์ม
ก่อนที่จะสามารถใช้งานบอร์ด ESP8266 ได้จะต้องติดตั้งโปรแกรม Arduino IDE ซึ่งสามารถที่จะหาโหลดได้ทางอินเตอร์เน็ต
หลังจากที่ได้ติดตั้งโปรแกรมเรียบร้อยแล้วก็ให้เราตั้งค่าบอร์ด ดังนี้ :
- เปิดโปรแกรม Arduino IDE ขึ้นมาแล้วคลิ๊กไปที่เมนู File > Preferences
- ที่ช่อง Additional Boards Manager URLs เพิ่มคำว่า http://arduino.esp8266.com/stable/package_esp8266com_index.json
เพื่อบอกว่ามีบอร์ด ESP8266 ที่ต้องการเพิ่มที่ลิงค์นี้ - เพิ่มบอร์ดที่เมนู Tools > Board > Board Manager
- พิมพ์ค้นหาคำว่า esp8266 แล้วกดปุ่ม Install
เพียงเท่านี้เราก็สามารถที่จะใช้งานบอร์ดได้ตามที่ต้องการ
จากนั้นให้เราทำการเขียนโค้ดโปรแกรมลงบน Software arduino IDE ดังนี้ :
char serialData;
int pin = D0;
void setup() {
pinMode(pin,OUTPUT);
Serial.begin(115200);
}
void loop() {
if(Serial.available()>0){
serialData = Serial.read();
Serial.print(serialData);
}
if(serialData == '1'){
digitalWrite(pin,HIGH);
}
else if (serialData == '0'){
digitalWrite(pin,LOW);
}
}
หลังจากนั้นก็ให้กดอัพโหลด Code program ** แนะนำว่าให้ทำการบันทึกไฟล์ไปไว้ตำแหน่งเดียวกับ Mask detection **
ส่วนของการ Import module ต่าง ๆ มาใช้งานในระบบ
from tensorflow.keras.applications.mobilenet_v2 import preprocess_input
from tensorflow.keras.preprocessing.image import img_to_array
from tensorflow.keras.models import load_model
from imutils.video import VideoStream
import numpy as np
import argparse
import imutils
import time
import cv2
import os
import serial
from pygame import mixer
ส่วนของการ Import เสียงที่จะให้ดังขึ้นเมื่อระบบตรวจจับไม่เจอหน้ากากอนามัย
mixer.init()
sound = mixer.Sound('alarm.wav')
SET ค่า Board rate บนบอร์ด และ ตั้งค่า Port เชื่อมต่อ กับฮาร์ดแวร์
arduinoData = serial.Serial('COM3',115200)
สร้าง Method 2 Method สำหรับการสั่งงาน ให้ไฟดับขณะตรวจเจอหน้ากากอนามัย และไม่เจอหน้ากากอนามัย
def led_on():
arduinoData.write(str.encode('1')) #write (b '1')
def led_off():
arduinoData.write(str.encode('0'))
Method สำหรับการดึง Frame : เฟรมจากสตรีมของเรา
FaceNet : โมเดลที่ใช้ในการตรวจจับว่าใบหน้าของรูปภาพอยู่ที่ใด
MaskNet : จะเป็นแบบจำลองลักษณะการใส่หน้ากากอนามัย
def detect_and_predict_mask(frame, faceNet, maskNet):
(h, w) = frame.shape[:2]
blob = cv2.dnn.blobFromImage(frame, 1.0, (300, 300),
(104.0, 177.0, 123.0))
faceNet.setInput(blob)
detections = faceNet.forward()
faces = []
locs = []
preds = []
for i in range(0, detections.shape[2]):
confidence = detections[0, 0, i, 2]
if confidence > args["confidence"]:
box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
(startX, startY, endX, endY) = box.astype("int")
(startX, startY) = (max(0, startX), max(0, startY))
(endX, endY) = (min(w - 1, endX), min(h - 1, endY))
face = frame[startY:endY, startX:endX]
face = cv2.cvtColor(face, cv2.COLOR_BGR2RGB)
face = cv2.resize(face, (224, 224))
face = img_to_array(face)
face = preprocess_input(face)
faces.append(face)
locs.append((startX, startY, endX, endY))
if len(faces) > 0:
faces = np.array(faces, dtype="float32")
preds = maskNet.predict(faces, batch_size=32)
return (locs, preds)
ap = argparse.ArgumentParser()
ap.add_argument("-f", "--face", type=str,
default="face_detector",
help="path to face detector model directory")
ap.add_argument("-m", "--model", type=str,
default="mask_detector.model",
help="path to trained face mask detector model")
ap.add_argument("-c", "--confidence", type=float, default=0.5,
help="minimum probability to filter weak detections")
args = vars(ap.parse_args())
โหลดโมเดลเครื่องตรวจจับใบหน้าแบบอนุกรมจากดิสก์
print("[INFO] loading face detector model...")
prototxtPath = os.path.sep.join([args["face"], "deploy.prototxt"])
weightsPath = os.path.sep.join([args["face"],
"res10_300x300_ssd_iter_140000.caffemodel"])
faceNet = cv2.dnn.readNet(prototxtPath, weightsPath)
print("[INFO] loading face mask detector model...")
maskNet = load_model(args["model"])
print("[INFO] starting video stream...")
vs = VideoStream(src=0).start()
time.sleep(2.0)
while True:
frame = vs.read()
frame = imutils.resize(frame, width=400)
(locs, preds) = detect_and_predict_mask(frame, faceNet, maskNet)
for (box, pred) in zip(locs, preds):
(startX, startY, endX, endY) = box
(mask, withoutMask) = pred
label = "Mask" if mask > withoutMask else "No Mask"
color = (0, 255, 0) if label == "Mask" else (0, 0, 255)
label = "{}: {:.2f}%".format(label, max(mask, withoutMask) * 100)
cv2.putText(frame, label, (startX, startY - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.45, color, 2)
cv2.rectangle(frame, (startX, startY), (endX, endY), color, 2)
ถ้าหากว่าระบบตรวจสอบแล้วไม่เจอหน้ากากอนามัยก็จะมีเสียงดังขึ้นมา พร้อมกับไฟแจ้งเตือน
if mask < withoutMask:
path = os.path.abspath("alarm.wav")
led_on()
sound.play()
แต่ถ้าหากว่าระบบตรวจแล้วเจอหน้ากากอนามัย ก็จะไม่มีเสียงแจ้งเตือน และไฟแจ้งเตือนใด ๆ ทั้งสิ้น
if mask > withoutMask:
led_off()
เป็นคำสั่งสำหรับรอรับคีย์ เมื่อทำการกด q ระบบก็จะหยุดทำงานทันที
cv2.imshow("Frame", frame)
key = cv2.waitKey(1) & 0xFF
if key == ord("q"):
break
cv2.destroyAllWindows()
vs.stop()
6. ผลการดำเนินการ
ผังการทำงานของระบบ

ระบบตรวจจับเจอหน้ากากอนามัย
ผลการดำเนินการของระบบตรวจจับหน้ากากอนามัยก็เป็นไปตามขอบเขตที่วางไว้ ทั้ง 4 ข้อที่ได้กล่าวมาแล้วข้างต้น ซึ่งผลการดำเนินการดังกล่าว ก็สามารถที่จะสรุปผลการทดลองได้ 3 กรณี ดังนี้
1. กรณีที่ระบบตรวจเจอหน้ากากอนามัยเพียงอย่างเดียว
2. กรณีที่ระบบตรวจไม่เจอหน้ากากอนามัย
3. กรณีที่ระบบตรวจเจอหน้ากากอนามัย และ ตรวจไม่เจอหน้ากากอนามัย
กรณีที่ระบบตรวจเจอหน้ากากอนามัยเพียงอย่างเดียว
กรณีที่ระบบตรวจไม่เจอหน้ากากอนามัย
กรณีที่ระบบตรวจเจอหน้ากากอนามัย และ ตรวจไม่เจอหน้ากากอนามัย
ทดสอบระบบ Mask detection ชมวิดิโอ :
7. ข้อเสนอแนะ
จากการที่ได้ทดลองระบบตรวจจับหน้ากากอนามัย เนื่องจากเป็นการตรวจจับผ่านกล้องที่ความละเอียดไม่คมชัด
ถ้าหากว่าต้องการให้ระบบการตรวจจับนั้นดียิ่งขึ้นควรที่จะหากล้องที่มีความละเอียดภาพสูง ๆ เพื่อการประมวลผลภาพที่ดีขึ้น
ไฟแจ้งเตือน : เนื่องจากไฟแจ้งเตือนเป็นแบบ LED ขนาดเล็ก ถ้าหากอยากให้มีไฟแจ้งเตือนที่มีขนาดใหญ่เพื่อให้มองชัดยิ่งขึ้น
ก็สามารถปรับเปลี่ยนได้ตามความต้องการ
เสียงแจ้งเตือน : สามารถที่จะปรับเสียงแจ้งเตือนขณะที่ตรวจเจอหน้ากากอนามัยได้ตามที่ต้องการ
8. ข้อมูลอ้างอิง
Source Code ที่นำมาใช้งาน
https://github.com/micaelillos/Mask-Detection
คลิปวิดิโอที่นำระบบเสียงมาประยุกต์ใช้งานกับ Source Code ข้างบน
Python Serial Arduino :
ข้อมูลเกี่ยวกับ Serial ติดต่อ Python
https://stackoverflow.com/questions/33267070/no-module-named-serial
ข้อมูลเกี่ยวกับ Tenserflow
https://i.imgur.com/lgXSnqV.jpg
https://python3.wannaphong.com/2016/01/machine-learning-tensorflow.html
ข้อมูลเกี่ยวกับ OpenCV
ข้อมูลเกี่ยวกับ Argparse
https://python3.wannaphong.com/2015/04/python_15.html
ข้อมูลเกี่ยวกับ Numpy
https://miro.medium.com/max/400/1*mc5YIn7jvo5uwuqBOUDw7Q.jpeg
ข้อมูลเกี่ยวกับ Mixer
https://pypi.org/project/mixer/
ข้อมูลเกี่ยวกับการติดตั้งบอร์ดใช้งาน ESP8266