ระบบ Mask detection

ผู้เขียนบทความ : นายมูฮำหมัด ปูตีล่า

1. ความเป็นมา

        ความเป็นมาของระบบนี้ เมื่อประมาณวันที่ 13 มกราคม 2563 มีการพบโรคระบาดชนิดใหม่ในประเทศไทย เป็นผู้ป่วยรายแรกในประเทศไทย ซึ่งโรคระบาดนี้ได้มีผลกระทบต่อประเทศไทยเป็นอย่างมาก นับตั้งแต่วันนั้นที่พบเจอโรคนี้ในประเทศไทย ทำให้คนภายในประเทศไทยต้องใช้ชีวิตอย่างระมัด ระวัง เพื่อป้องกันการติดเชื้อจากโรคเหล่านี้ ทำให้คนในประเทศไทยต้องสวมใส่หน้ากากอนามัยเพื่อป้องกันตัวเอง (Protect yourself) และเป็นเหตุให้สถานที่ต่าง ๆ ไม่ว่าจะเป็น ร้านค้าหรือห้างสรรพสินค้า หรือเป็นสถานที่บันเทิงต่าง ๆ ต้องมีมาตรการป้องกันโรค COVID-19 โดยการสวมใส่หน้ากากอนามัย และเมื่อทุกคนจำเป็นที่จะต้องใส่หน้ากากอนามัยเพื่อป้องกันโรคระบาดชนิดนี้ ทุกห้างสรรพสินค้า หรือร้านค้าต่าง ๆ ก็ต้องตรวจผู้คนที่ผ่านเข้ามาในร้านโดยผู้คนที่ผ่าน เข้ามาในร้านก็จะต้องสวมใส่หน้ากากอนามัย เพื่อป้องกันการแพร่เชื้อ หรือกระจายเชื้อให้ผู้อื่น และเป็นการป้องกันตัวเองด้วย (Protect youself) เมื่อมีผู้คนเข้าใช้บริการห้างสรรพสินค้าจำนวนมากสิ่งที่เกิดขึ้นก็จะทำให้การตรวจหน้ากากอนามัยเต็มไปด้วยความยากลำบาก เพราะต้องใช้กำลังคนในการตรวจสอบหน้ากากอนามัย

        ระบบการตรวจจับหน้ากากอนามัย หรือ Mask Detection นี้สร้างขึ้นมาเพื่อแก้ปัญหาดังกล่าวที่ได้กล่าวมาแล้วข้างต้น สามารถที่จะช่วยลดจำนวนคนที่ใช้ในการตรวจสอบการสวมใส่หน้ากากอนามัย เป็นการตรวจจับด้วยระบบ Mask Detection แทนเพื่อความสะดวก และรวดเร็วในการตรวจสอบบุคคลเข้าสู่ห้างสรรพสินค้า หรือร้านค้าต่าง ๆ ที่มีผู้คนเข้าออกจำนวนมาก  

2. วัตถุประสงค์

  1. เพื่อตรวจจับบุคคลที่ไม่สวมใส่หน้ากากอนามัย
  2. เพื่อจะลดระยะเวลาในการตรวจหน้ากากอนามัยตามสถานที่ต่าง ๆ
  3. เพื่อที่จะลดแรงงานจากคนที่ต้องตรวจสอบหน้ากากอนามัย

3. ขอบเขต

  1. ระบบสามารถที่จะแยกบุคคลสวมใส่หน้ากากอนามัย
    1.1 บุคคลที่ไม่สวมใส่หน้ากากอนามัยจะขึ้นกรอบสีแดง
    1.2 บุคคลที่สวมใส่หน้ากากอนามัยจะขึ้นกรอบสีเขียว
  2. ระบบสามารถที่จะแสดงเปอร์เซ็น
    2.1 เปอร์เซ็นที่จะมีโอกาสไม่สวมใส่หน้ากากอนามัย
    2.2 เปอร์เซ็นที่จะมีโอกาสที่สวมใส่หน้ากากอนามัย
  3. ระบบสามารถที่จะส่งเสียงแจ้งเตือน
    3.1 ตรวจเจอบุคคลที่ไม่ใส่หน้ากากอนามัยจะส่งเสียงแจ้งเตือน
    3.2 ตรวจไม่เจอบุคคลที่ไม่สวมใส่หน้ากากอนามัยจะไม่มีการส่งเสียงออกมา
  4. ระบบมีไฟแจ้งเตือน
    4.1 ตรวจเจอบุคคลที่ไม่ใส่หน้ากากอนามัยจะมีไฟแจ้งเตือน
    4.2 ตรวจเจอบุคคลที่ใส่หน้ากากอนามัยจะไม่มีไฟแจ้งเตือน

4. ประโยชน์ที่คาดว่าจะได้รับ

  1. สามารถที่จะนำระบบไปต่อยอดหรือประยุกต์ในการพัฒนาต่อได้
  2. ลดระยะเวลาในการตรวจจับหน้ากากอนามัย ในช่วงที่มีบุคคลจำนวนมากอยู่
  3. สามารถเรียนรู้และเข้าใจในเรื่องของ Image Processing
  4. คัดแยกบุคคลสวมใส่หน้ากากอนามัยและไม่สวมใส่หน้ากากอนามัยได้อย่างรวดเร็ว

5. ความรู้ที่เกี่ยวข้อง

แนะนำโปรแกรมหลัก ๆ ที่ต้องติดตั้งมาใช้งานกับระบบซึ่งสามารถหาโหลดได้ทางอินเตอร์เน็ต

  1. Anaconda
  2. Visual studio code
  3. Arduino IDE

อะไรคือ Tensorflow

Tensorflow เป็นไลบารี่เป็นแบบ Open Source สำหรับการใช้พัฒนา Machine learning ถูกพัฒนาขึ้นมาโดยกูเกิล โดยกูเกิลได้ปล่อย Library ที่ใช้งานกันในกูเกิลเอง ให้กลายเป็นแบบ Open Source ให้ทุกคนสามารถที่จะนำเอามาใช้ได้

สถาปัตยกรรม Tensorflow

ด้านสถาปัตยกรรมแบ่งเป็น 3 ส่วน

  1. การเตรียมประมวผลข้อมูล
  2. การสร้างแบบจำลอง
  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

  1. ESP8266
บอร์ดควบคุมการทำงานของไฟแจ้งเตือน

2. สาย Micro usb

สายที่ใช้เป็นแหล่งจ่ายไฟให้กับบอร์ด

3. breadboard

เป็นอุปกรณ์ที่จะนำเอาอุปกรณ์อิเล็กทรอนิกส์และสายไฟต่าง ๆ มาเชื่อมต่อกัน

4. ไดโอดเปล่งแสง

ไดโอดเปล่งแสงสำหรับการแจ้งเตือน

5. สายไฟจั้มเปอร์

สายไฟจั้มเปอร์สำหรับการจ่ายไฟให้กับอุปกรณ์ต่าง ๆ

6. ตัวต้านทาน ขนาด 220 โอห์ม

ตัวต้านทานสำหรับลดการไหลของกระแสไฟฟ้า

ก่อนที่จะสามารถใช้งานบอร์ด ESP8266 ได้จะต้องติดตั้งโปรแกรม Arduino IDE ซึ่งสามารถที่จะหาโหลดได้ทางอินเตอร์เน็ต
หลังจากที่ได้ติดตั้งโปรแกรมเรียบร้อยแล้วก็ให้เราตั้งค่าบอร์ด ดังนี้ :

  1. เปิดโปรแกรม Arduino IDE ขึ้นมาแล้วคลิ๊กไปที่เมนู File > Preferences
  2. ที่ช่อง Additional Boards Manager URLs เพิ่มคำว่า http://arduino.esp8266.com/stable/package_esp8266com_index.json
    เพื่อบอกว่ามีบอร์ด ESP8266 ที่ต้องการเพิ่มที่ลิงค์นี้
  3. เพิ่มบอร์ดที่เมนู Tools > Board > Board Manager
  4. พิมพ์ค้นหาคำว่า 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://www.thaiprogrammer.org/2018/12/%E0%B8%A1%E0%B8%B2%E0%B8%97%E
0%B8%B3%E0%B8%84%E0%B8%A7%E0%B8%B2%E0%B8%A1%E0%B8%A3%E0%B8%
B9%E0%B9%89%E0%B8%88%E0%B8%B1%E0%B8%81-tensorflow/

https://i.imgur.com/lgXSnqV.jpg

https://python3.wannaphong.com/2016/01/machine-learning-tensorflow.html

ข้อมูลเกี่ยวกับ OpenCV 

https://medium.com/@kewinrueangraklikhit/%E0%B8%95%E0%B8%B4%E0%B8
%94%E0%B8%95%E0%B8%B1%E0%B9%89%E0%B8%87-opencv-%E0%B9%83%
E0%B8%99-raspberry-pi-d396baf4748b

https://medium.com/@nut.ch40/opencv-%E0%B8%84%E0%B8%B7%E0%B8%AD%E0%B8%AD%E0%B8%B0%E0%B9%84%
E0%B8%A3-8771e2a4c414

https://medium.com/@wanchatpookhuntod_1602/%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B
8%95%E0%B8%B4%E0%B8%94%E0%B8%95%E0%B8%B1%E0%B9%89%E0%B8%87-opencv-%E0%B8%AA%E0%B8%B3%E0%B8%AB%E0%B8%A3%E0%B8%B1%E0%B8%9A-python-98f478e70704

ข้อมูลเกี่ยวกับ Argparse

https://python3.wannaphong.com/2015/04/python_15.html

ข้อมูลเกี่ยวกับ Numpy

https://miro.medium.com/max/400/1*mc5YIn7jvo5uwuqBOUDw7Q.jpeg

https://www.borntodev.com/2020/04/16/%E0%B8%9E%E0%B8%B7%E0%B9%89%
E0%B8%99%E0%B8%90%E0%B8%B2%E0%B8%99%E0%B8%81%E0%B8%B2%E0%
B8%A3%E0%B9%83%E0%B8%8A%E0%B9%89-numpy-%E0%B9%83%E0%B8%99-python-3/

ข้อมูลเกี่ยวกับ Mixer

https://pypi.org/project/mixer/

ข้อมูลเกี่ยวกับการติดตั้งบอร์ดใช้งาน ESP8266

https://www.allnewstep.com/article/263/1-%E0%B8%AA%E0%B8%AD%E0%B
8%99-arduino-esp8266-%E0%B8%A7%E0%B8%B4%E0%B8%98%E0%B8%B5
%E0%B9%83%E0%B8%8A%E0%B9%89-nodemcu-esp8266-%E0%B9%80%E0%B8%9E%E0%B8%B4%E0%B9%88%E0%B8%A1%E0%B8%9A
%E0%B8%AD%E0%B8%A3%E0%B9%8C%E0%B8%94%E0%B9%83%E0%B8%99-arduino-ide

บทความที่เกี่ยวข้องกัน

Share

You may also like...

Leave a Reply