COVID-19 DETECTION DE PORTEUR DE MASQUE ET DE TEMPERATURE CORPORELLE_BY-THIROU

Le nouveau virus du COVID-19 nous a tous forcés à repenser notre façon de vivre au quotidien tout en assurant notre sécurité et celle des autres. Les masques faciaux sont apparus comme une stratégie simple et efficace pour réduire la menace du virus et permettre aux activités commerciales de reprendre. Le masque est devenu l'accessoire indispensable pour lutter contre la propagation du virus. Mais comment contrôler à distance que cette protection sanitaire est bien portée ? Face à ce besoin, je vais vous présenter un projet qui permet la détection en temps réel du port du masque et la mesure de la température corporelle sans contact et donc un accès contrôler des diffèrent lieu.

Slides & Videos

Members

NameContribution
Bharathidasan Thiroutoutes les taches ont était effectué par moi car j'ai réaliser ce projet seul

State of the Art

Business Aspect

Borne de détection de température corporelle avec mode détection du port de masque pour visiteurs d’ERP.

Borne de détection de température corporelle pour visiteurs d’ERP. Possibilité d’activer le mode détection du port de masque.

Autonome, il ne nécessite aucune action d’un personnel formé. 

Équipe de deux caméras Haute Définition et d’un capteur d’imagerie thermique infrarouge très précis le ThermoVid détecte immédiatement une température anormalement élevée et déclenche une annonce sonore ainsi qu’un message texte sur l’écran LCD 7”(données non sauvegardés).

Détection de la température en moins d’une seconde avec une précision de +/-0.3°C à une distance de 1M.

Affichage très lisible à distance sur l’écran 7” de la température détectée.

Facile à mettre en place (se branche sur une prise 220V avec un adaptateur 12V fournit) livré prêt à fonctionner dès réception, ce thermomètre pour ERP permet également la reconnaissance faciale (configuration nécessaire)

3 différents supports en métal robustes permettent une installation en fonction de votre structure, pied a poser sur une table ou comptoir d’accueil, pied 60 cm pour être placé dans une école ou un lieux recevant des enfants ainsi qu’un pied de 1,10M pour touts les autre lieux recevants du public adulte.

Pratique pour assurer l’hygiène et la non-contamination en cas d’épidémie, un distributeur automatique de gel hydroalcoolique sans contact peut être installé sur la borne.

Convient pour tout type de structures recevant du public (ERP), centres commerciaux, mairies, bureaux, administrations, écoles, hôpitaux, cliniques, entrepôts, maison de retraite, musées, cinéma…

Conforme RGPD, Fonctionnement autonome,  connexion possible à un serveur TCP/IP, compatible avec les portiques et contrôles d’accès, peut être configuré en reconnaissance faciale. Conforme norme CE.

  • Détection de température instantanée 
  • Détection de port de masque
  • Autonome et sans contact
  • Rapide réponse en moins d’une seconde à 1M de distance
  • Précision +/- 0,3°C 
  • Conforme RGPD pas d’enregistrement de données
  • Design aluminium, IP66, OS Linux,
  • Rapide à mettre en oeuvre, Plug&Play

prix: 1 599,00 € HT 1 918,80 € TTC

Borne d’accès pour contrôle de température et masques K5671

Borne d’accès pour contrôle de température et masques K5671

La borne de détection de la température corporelle est un terminal de reconnaissance faciale qui fonctionne en autonome. Ce dispositif de contrôle d’accès intègre un détecteur de fièvre permettant de mesurer la température de surface de peau des personnes. Le terminal permet également de détecter le port de masques. Il est Plug and play permettant un dépoiement rapide sans câblage avec une installation et une configuration simplifiée. Il peut être largement utilisé pour le contrôle préalable de la température dans les immeubles, bureaux, usines, gares, écoles, aéroports et autres les lieux publics.

des caméras thermographiques de détection de la température de Hikvision sont conçues pour la détection de températures cutanées élevées afin de réaliser un dépistage préliminaire rapide dans les zones publiques. Les températures corporelles réelles doivent être confirmées davantage à l’aide d’appareils de mesure cliniques.

Fonctions principales

► Compatible avec le tourniquet Kikvision

► Communique avec le tourniquet via la sortie I/O ou Wiegand

► Plug and Play. Déploiement rapide, configuration simplifiée

► Intègre un détecteur non-refroidi en Oxyde de Vanadium pour mesurer la température de la cible

► Gamme de mesure de températures : +30°C à +45°C / Précision : +- 0.5°C

► Distance de détection de 0.3m à 2m

► Mesure de température ultra-rapide : détection du visage et prise de température

► Détecte le visage et mesure la température de surface de la peau sans identification de la personne

► Détection du port de masque

► Modes d’authentification multiples avec la mesure de température

► Etat de porte configurable ( ouverte ou fermée ) lorsqu’une température trop élevée est détectée

► Transmet les informations de température en ligne et hors-ligne au logiciel client via une communication TCP/IP et enregistre les données sur le logiciel client

► Design intégrant un pied permettant une installation sur un torniquet ou une barrière

► Processus haute performance avec l’algorithme d’apprentissage profond  (deep learning)

► Transmet et enregistre les résultats et les images au logiciel client ou autre

► Message audio et visuels pour donner une information suite à la prise de mesure quand la température est jugée trop élevée, ou à la non détection de masque

► Watchdog permettant de protéger et assurer le fonctionnement de l’appareil

 

prix: 2499$

solution

Un masque est obligatoire dans de nombreuses régions géographiques, bureaux, agences gouvernementales, magasins/centres commerciaux, transports en commun, lieux saints, et dans presque tous les domaines. Certains gouvernements en ont déjà fait une règle et ont imposé des amendes.

Il incombe aux propriétaires/chefs de service de s’assurer que les gens portent des masques dans les lieux publics, sinon de prendre les mesures appropriées.

-Surveiller chaque personne dans une foule et lui demander de porter un masque est une tâche difficile
– il est très difficile de déterminer et d’analyser le nombre de personnes qui portent un masque, le temps qu’il faut pour le faire et l’endroit où l’infraction se produit.
– Identifier les personnes qui prétendent porter un masque
-Il est également difficile de traiter avec les contrevenants sans preuves

 

C’est pourquoi  la détection en temps réel du port du masque grâce a la vidéo-surveillance reste a ce jour la meilleur alternative

Technical Aspect

description technique

Un modèle hybride utilisant le deep learning  et le machine learning  pour la détection des masques sera présentée. La base de données pour la détection de masque se compose de photo de visage avec masque et des photo de visage sans   masque, nous allons utiliser OpenCV pour faire la détection de visage en temps réel à partir d’un flux en direct via notre webcam. Nous utiliserons l’ensemble de données pour créer un détecteur de masque facial pour la COVID-19 avec vision par ordinateur à l’aide de Python, d’OpenCV, de Tensor Flow et de Keras. Notre objectif est de déterminer si la personne sur le flux image/vidéo porte un masque ou non, avec l’aide de la vision par ordinateur et du deep learning.

Project Description

Problem Definition
Selon l’Organisation mondiale de la Santé (OMS), la pandémie de COVID-19 causée par le coronavirus provoque une crise sanitaire mondiale. Les méthodes de protection efficaces consistent donc à porter un masque dans les lieux publics. La pandémie de COVID-19 a forcé les gouvernements du monde entier à imposer le confinement afin de prévenir la transmission du virus. Les rapports indiquent que le port de masques au travail réduit clairement le risque de transmission. Une approche efficace et économique de l’utilisation de l’IA pour créer un environnement sûr.
Challenges & Motivation
La transmission de la COVID-19 se fait notamment par les micro-gouttelettes que l’on projette dans l’air, en respirant ou en parlant. En se couvrant le nez et la bouche, jusqu’au menton, avec un masque, on limite la quantité de micro-gouttelettes que l’on projette autour de nous. L’objectif de notre projet est donc de limiter la propagation du Covid-19 et de protéger les différents individus au sain des entreprises et des enseignes en contrôlant le port du masque.
Real and Complete Usecases

Cas d’utilisation de la technologie de détection de masque:

Hôpitaux – Grâce au système de détection des masques, les hôpitaux peuvent surveiller et signaler si un visiteur ou un membre du personnel porte un masque pendant son quart de travail ou non. Si un travailleur de la santé est trouvé sans masque, il recevra un avis lui rappelant de porter un masque, et les visiteurs seront avisés de porter un masque. En outre, si les personnes qui doivent porter un masque sont en quarantaine, le système peut garder un œil et détecter si le masque est présent ou non et envoyer une notification automatique ou signaler aux autorités.

Bureaux – Le système de détection de masque facial peut également être utilisé dans les bureaux pour détecter si les employés respectent les normes de sécurité au travail. Il surveille tous les employés et le personnel sans masque et leur envoie un avertissement de porter un masque. De plus, les rapports peuvent être téléchargés ou envoyés par courriel à la fin de la journée pour saisir les personnes qui ne respectent pas les règlements ou les exigences.

Aéroports – Le système de détection de masque facial peut être mis en œuvre dans les aéroports intégrés aux caméras de sécurité pour détecter les voyageurs sans masque. Les données faciales des voyageurs peuvent être saisies dans le système à l’entrée. Si un voyageur se trouve sans masque, sa photo est envoyée aux autorités aéroportuaires afin qu’elles puissent agir rapidement. Si le visage de la personne est déjà stocké, comme le visage d’un travailleur d’aéroport, il peut envoyer l’alerte au téléphone du travailleur directement.

Technical Description
  1. Schématisation

 

comme on peut le voir ci-dessus la caméra se connecte au port CSI qui se trouve entre la prise Ethernet et la sortie HDMI.

Ensuite pour le capteur de temperature, il dispose de 4 pins (VIN, GND, SCL, SDA) qui se connecte facilement aux différents pins correspondant comme montré  sur le schéma ci-dessus.

  • La première étape est l’installation des dépendances pour cela on va utiliser pip

-Pip3 Install keras==2.3.1

-Pip3 install numpy==1.18.2

-Pip3 install imutils==0.5.3

-Pip3 install matplotlib==3.2.1

-Pip3 install argparse==1.1

-Pip3 install scipy ==1.4.1

-pip3 install tensorflow

-pip3 install open-cv

  • Ensuite on va télécharger une base de donnée  d’images de personnes  portant des  maques et des personnes  sans  masque pour pouvoir entrainer notre model

 

  • Notre programme d’entrainement de détection de masque est écrit en python et  se compose de deux partie la première le partie est le Prétraitement des données pour le machine learning et la seconde partie est  l’entrainement

Pour la deuxième partie pour entrainer notre model  nous allons utiliser un  Réseau neuronal convolutifs

Les réseaux de neurones convolutifs sont à ce jour les modèles les plus performants pour classer des images. Désignés par l’acronyme CNN, de l’anglais Convolutional Neural Network, ils comportent deux parties bien distinctes. En entrée, une image est fournie sous la forme d’une matrice de pixels. Elle a 2 dimensions pour une image en niveaux de gris. La couleur est représentée par une troisième dimension, de profondeur 3 pour représenter les couleurs fondamentales [Rouge, Vert, Bleu].

La première partie d’un CNN est la partie convolutive à proprement parler. Elle fonctionne comme un extracteur de caractéristiques des images. Une image est passée à travers une succession de filtres, ou noyaux de convolution, créant de nouvelles images appelées cartes de convolutions. Certains filtres intermédiaires réduisent la résolution de l’image par une opération de maximum local.  Au final, les cartes de convolutions sont mises à plat et concaténées en un vecteur de caractéristiques, appelé code CNN.

Pour notre projet IOT on peut illustrer le paragraphe ci-dessus avec mon image ci-dessous

 

  • Après l’exécution de notre programme d’entrainement de détection de masque le « mask_detector.model » et le résultat de l’entrainement  en format jpeg  est sauvegardé dans notre dossier

 

 

 

 

On peut voir que notre model est plutôt bon, le taux de perte est plutôt bas et la taux de précision et plutôt haut

 

 

 

 

Maintenant que  nous avons  le « mask_detector.model » pour pourvoir détecter  les masques, il nous manque encor  un model pour la détection du visage.

Pour cela j’ai directement  telecharger un model déjà existent,  a l’aide de ce model  de détection du visage et a l’aide du model de  détection  de masque que nous avons préalablement créer nous allons pouvoir  détecter les  les masques sur les visages.

Et pour le fonctionnement de la  camera nous allons utiliser open cv

Enfin pour la mesure de la température corporelle je vais utiliser le code ci-dessous qui permet de mesurer la température d’une personne en approchant le doigt prés du capteur

 

 

Hardware

Materials
ImageNamePart NumberPriceCountLink
Raspberry Pi 4 Modèle B (4 B) 4Go RAMModèle B (4 B) 4Go109.99$1🛒
Raspberry Pi Camera Module V2 8M Camera Module V2 28.99$1🛒
Module capteur de température sans contact Mlx90614Mlx906149.75$1🛒
Câbles Dupont Breadboard 3 en 1,Mâle vers Femelle, Mâle vers Mâle, Femelle vers Femelle,pour Arduino,Raspberry Pi Câble 3 x 40 pcs Chaque 20 cm5.92$1🛒
Schematic

Software

Arduino Code

# import the necessary packages
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.applications import MobileNetV2
from tensorflow.keras.layers import AveragePooling2D
from tensorflow.keras.layers import Dropout
from tensorflow.keras.layers import Flatten
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import Input
from tensorflow.keras.models import Model
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.applications.mobilenet_v2 import preprocess_input
from tensorflow.keras.preprocessing.image import img_to_array
from tensorflow.keras.preprocessing.image import load_img
from tensorflow.keras.utils import to_categorical
from sklearn.preprocessing import LabelBinarizer
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from imutils import paths
import matplotlib.pyplot as plt
import numpy as np
import os

# initialize the initial learning rate, number of epochs to train for,
# and batch size
INIT_LR = 1e-4
EPOCHS = 20
BS = 32

DIRECTORY = r"C:\Mask Detection\CODE\Face-Mask-Detection-master\dataset"
CATEGORIES = ["with_mask", "without_mask"]

# grab the list of images in our dataset directory, then initialize
# the list of data (i.e., images) and class images
print("[INFO] loading images...")

data = []
labels = []

for category in CATEGORIES:
    path = os.path.join(DIRECTORY, category)
    for img in os.listdir(path):
    	img_path = os.path.join(path, img)
    	image = load_img(img_path, target_size=(224, 224))
    	image = img_to_array(image)
    	image = preprocess_input(image)

    	data.append(image)
    	labels.append(category)

# perform one-hot encoding on the labels
lb = LabelBinarizer()
labels = lb.fit_transform(labels)
labels = to_categorical(labels)

data = np.array(data, dtype="float32")
labels = np.array(labels)

(trainX, testX, trainY, testY) = train_test_split(data, labels,
	test_size=0.20, stratify=labels, random_state=42)

# construct the training image generator for data augmentation
aug = ImageDataGenerator(
	rotation_range=20,
	zoom_range=0.15,
	width_shift_range=0.2,
	height_shift_range=0.2,
	shear_range=0.15,
	horizontal_flip=True,
	fill_mode="nearest")

# load the MobileNetV2 network, ensuring the head FC layer sets are
# left off
baseModel = MobileNetV2(weights="imagenet", include_top=False,
	input_tensor=Input(shape=(224, 224, 3)))

# construct the head of the model that will be placed on top of the
# the base model
headModel = baseModel.output
headModel = AveragePooling2D(pool_size=(7, 7))(headModel)
headModel = Flatten(name="flatten")(headModel)
headModel = Dense(128, activation="relu")(headModel)
headModel = Dropout(0.5)(headModel)
headModel = Dense(2, activation="softmax")(headModel)

# place the head FC model on top of the base model (this will become
# the actual model we will train)
model = Model(inputs=baseModel.input, outputs=headModel)

# loop over all layers in the base model and freeze them so they will
# *not* be updated during the first training process
for layer in baseModel.layers:
	layer.trainable = False

# compile our model
print("[INFO] compiling model...")
opt = Adam(lr=INIT_LR, decay=INIT_LR / EPOCHS)
model.compile(loss="binary_crossentropy", optimizer=opt,
	metrics=["accuracy"])

# train the head of the network
print("[INFO] training head...")
H = model.fit(
	aug.flow(trainX, trainY, batch_size=BS),
	steps_per_epoch=len(trainX) // BS,
	validation_data=(testX, testY),
	validation_steps=len(testX) // BS,
	epochs=EPOCHS)

# make predictions on the testing set
print("[INFO] evaluating network...")
predIdxs = model.predict(testX, batch_size=BS)

# for each image in the testing set we need to find the index of the
# label with corresponding largest predicted probability
predIdxs = np.argmax(predIdxs, axis=1)

# show a nicely formatted classification report
print(classification_report(testY.argmax(axis=1), predIdxs,
	target_names=lb.classes_))

# serialize the model to disk
print("[INFO] saving mask detector model...")
model.save("mask_detector.model", save_format="h5")

# plot the training loss and accuracy
N = EPOCHS
plt.style.use("ggplot")
plt.figure()
plt.plot(np.arange(0, N), H.history["loss"], label="train_loss")
plt.plot(np.arange(0, N), H.history["val_loss"], label="val_loss")
plt.plot(np.arange(0, N), H.history["accuracy"], label="train_acc")
plt.plot(np.arange(0, N), H.history["val_accuracy"], label="val_acc")
plt.title("Training Loss and Accuracy")
plt.xlabel("Epoch #")
plt.ylabel("Loss/Accuracy")
plt.legend(loc="lower left")
plt.savefig("plot.png")
# import the necessary packages
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 imutils
import time
import cv2
import os

def detect_and_predict_mask(frame, faceNet, maskNet):
	# grab the dimensions of the frame and then construct a blob
	# from it
	(h, w) = frame.shape[:2]
	blob = cv2.dnn.blobFromImage(frame, 1.0, (224, 224),
		(104.0, 177.0, 123.0))

	# pass the blob through the network and obtain the face detections
	faceNet.setInput(blob)
	detections = faceNet.forward()
	print(detections.shape)

	# initialize our list of faces, their corresponding locations,
	# and the list of predictions from our face mask network
	faces = []
	locs = []
	preds = []

	# loop over the detections
	for i in range(0, detections.shape[2]):
		# extract the confidence (i.e., probability) associated with
		# the detection
		confidence = detections[0, 0, i, 2]

		# filter out weak detections by ensuring the confidence is
		# greater than the minimum confidence
		if confidence > 0.5:
			# compute the (x, y)-coordinates of the bounding box for
			# the object
			box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
			(startX, startY, endX, endY) = box.astype("int")

			# ensure the bounding boxes fall within the dimensions of
			# the frame
			(startX, startY) = (max(0, startX), max(0, startY))
			(endX, endY) = (min(w - 1, endX), min(h - 1, endY))

			# extract the face ROI, convert it from BGR to RGB channel
			# ordering, resize it to 224x224, and preprocess it
			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)

			# add the face and bounding boxes to their respective
			# lists
			faces.append(face)
			locs.append((startX, startY, endX, endY))

	# only make a predictions if at least one face was detected
	if len(faces) > 0:
		# for faster inference we'll make batch predictions on *all*
		# faces at the same time rather than one-by-one predictions
		# in the above `for` loop
		faces = np.array(faces, dtype="float32")
		preds = maskNet.predict(faces, batch_size=32)

	# return a 2-tuple of the face locations and their corresponding
	# locations
	return (locs, preds)

# load our serialized face detector model from disk
prototxtPath = r"face_detector\deploy.prototxt"
weightsPath = r"face_detector\res10_300x300_ssd_iter_140000.caffemodel"
faceNet = cv2.dnn.readNet(prototxtPath, weightsPath)

# load the face mask detector model from disk
maskNet = load_model("mask_detector.model")

# initialize the video stream
print("[INFO] starting video stream...")
vs = VideoStream(src=0).start()

# loop over the frames from the video stream
while True:
	# grab the frame from the threaded video stream and resize it
	# to have a maximum width of 400 pixels
	frame = vs.read()
	frame = imutils.resize(frame, width=400)

	# detect faces in the frame and determine if they are wearing a
	# face mask or not
	(locs, preds) = detect_and_predict_mask(frame, faceNet, maskNet)

	# loop over the detected face locations and their corresponding
	# locations
	for (box, pred) in zip(locs, preds):
		# unpack the bounding box and predictions
		(startX, startY, endX, endY) = box
		(mask, withoutMask) = pred

		# determine the class label and color we'll use to draw
		# the bounding box and text
		label = "Mask" if mask > withoutMask else "No Mask"
		color = (0, 255, 0) if label == "Mask" else (0, 0, 255)

		# include the probability in the label
		label = "{}: {:.2f}%".format(label, max(mask, withoutMask) * 100)

		# display the label and bounding box rectangle on the output
		# frame
		cv2.putText(frame, label, (startX, startY - 10),
			cv2.FONT_HERSHEY_SIMPLEX, 0.45, color, 2)
		cv2.rectangle(frame, (startX, startY), (endX, endY), color, 2)

	# show the output frame
	cv2.imshow("Frame", frame)
	key = cv2.waitKey(1) & 0xFF

	# if the `q` key was pressed, break from the loop
	if key == ord("q"):
		break

# do a bit of cleanup
cv2.destroyAllWindows()
vs.stop()
import board
import busio as io
import adafruit_mlx90614

from time import sleep

i2c = io.I2C(board.SCL, board.SDA, frequency=100000)
mlx = adafruit_mlx90614.MLX90614(i2c)

ambientTemp = "{:.2f}".format(mlx.ambient_temperature)
targetTemp = "{:.2f}".format(mlx.object_temperature)

sleep(1)

print("Ambient Temperature:", ambientTemp, "°C")
print("Target Temperature:", targetTemp,"°C")
  

External Services

.

.