Maison  >  Article  >  Périphériques technologiques  >  L'interdiction de fumer, c'est bien ! Reconnaissance du tabagisme + reconnaissance du visage

L'interdiction de fumer, c'est bien ! Reconnaissance du tabagisme + reconnaissance du visage

WBOY
WBOYavant
2023-04-14 12:49:022051parcourir

Bonjour à tous.

Aujourd'hui je vais partager avec vous un projet de reconnaissance du tabagisme + reconnaissance faciale. De nombreux lieux publics, sites de production et écoles interdisent de fumer. Il est encore nécessaire de mettre en œuvre une interdiction de fumer et de laisser l'IA identifier automatiquement les comportements liés au tabagisme et identifier qui fume.

Utilisez l'algorithme de détection de cible pour déterminer le comportement tabagique, extrayez le visage du fumeur et utilisez l'algorithme de reconnaissance faciale pour déterminer qui fume. L’idée est relativement simple, mais les détails restent un peu gênants.

Les données de formation et le code source utilisés dans le projet ont été empaquetés. Toujours pareil, obtenez-le dans la section commentaires.

1. Pour détecter les cigarettes

J'ai utilisé 5 000 éléments de données sur le tabagisme étiquetés comme données d'entraînement

Linterdiction de fumer, cest bien ! Reconnaissance du tabagisme + reconnaissance du visage

et je les ai placés dans le répertoire de l'ensemble de données.

Formez le modèle de détection de cible YOLOv5.

La première étape, copiez data/coco128.yaml dans smoke.yaml et modifiez le répertoire de l'ensemble de données et les informations de configuration de la catégorie

path: ../dataset/smoke # dataset root dir
train: images/train# train images (relative to 'path') 128 images
val: images/test# val images (relative to 'path') 128 images
test:# test images (optional)

# Classes
names:
0: smoke

La deuxième étape, copiez ./models/yolov5s.yaml dans smoke.yaml​, modifiez nc

nc: 1# number of classes

La troisième étape consiste à télécharger le modèle pré-entraîné yolov5s.pt et à le placer dans le répertoire {yolov5 directory}/weights

Exécutez la commande suivante pour entraîner

python ./train.py --data ./data/smoke.yaml --cfg ./models/smoke.yaml --weights ./weights/yolov5s.pt --batch-size 30 --epochs 120 --workers 8 --name smoke --project smoke_s

Linterdiction de fumer, cest bien ! Reconnaissance du tabagisme + reconnaissance du visage

Une fois la formation terminée, vous peut voir le résultat suivant :

Linterdiction de fumer, cest bien ! Reconnaissance du tabagisme + reconnaissance du visage

Très bien.

Une fois la formation terminée, la position best.pt peut être trouvée et utilisée plus tard pour la détection des cigarettes.

model = torch.hub.load('../28_people_counting/yolov5', 'custom', './weights/ciga.pt', source='local')

results = self.model(img[:, :, ::-1])
pd = results.pandas().xyxy[0]
ciga_pd = pd[pd['class'] == 0]

Linterdiction de fumer, cest bien ! Reconnaissance du tabagisme + reconnaissance du visage

Après avoir pu identifier les cigarettes, il nous reste encore à déterminer si nous fumons actuellement.

Vous pouvez utiliser le cadre de détection de cigarette et le cadre de détection de bouche pour calculer l'IOU afin de déterminer Pour parler franchement, il s'agit de déterminer si les deux cadres se croisent. Si tel est le cas, on considère que vous fumez actuellement.

Linterdiction de fumer, cest bien ! Reconnaissance du tabagisme + reconnaissance du visage

Cadre de détection de la bouche, utilisant les points clés du visage pour identifier.

2. Reconnaissance faciale

Il existe de nombreux modèles matures pour les algorithmes de reconnaissance faciale. Nous n'avons pas besoin de les former nous-mêmes, nous pouvons simplement ajuster la base de données directement.

J'utilise ici la bibliothèque dlib, qui peut identifier 68 points clés sur un visage et extraire les traits du visage en fonction de ces 68 points clés.

Linterdiction de fumer, cest bien ! Reconnaissance du tabagisme + reconnaissance du visage

face_detector = dlib.get_frontal_face_detector()
face_sp = dlib.shape_predictor('./weights/shape_predictor_68_face_landmarks.dat')

dets = face_detector(img, 1)

face_list = []
for face in dets:
l, t, r, b = face.left(), face.top(), face.right(), face.bottom()

face_shape = face_sp(img, face)

face_detector​ peut détecter les visages et renvoyer le cadre de détection de visage. face_sp est basé sur le cadre de détection de visage et identifie 68 points clés du visage.

À partir de ces 68 points clés, nous pouvons obtenir le cadre de détection buccale pour déterminer si vous fumez.

Enfin, nous espérons toujours utiliser des algorithmes de reconnaissance faciale pour identifier qui fume.

La première étape consiste à extraire les caractéristiques du visage

face_feature_model = dlib.face_recognition_model_v1('./weights/dlib_face_recognition_resnet_model_v1.dat')

face_descriptor = face_feature_model.compute_face_descriptor(img, face_shape)

face_descriptor​Calculez un vecteur de caractéristiques pour chaque visage en fonction de la position et de la distance entre les 68 points clés du visage. Ce principe est similaire au word2vec que nous avons partagé auparavant ou au mappage de vidéos sur des vecteurs à N dimensions.

La deuxième étape consiste à saisir les visages existants dans la base de données des visages. J'ai préparé 3 comportements tabagiques dans des films et des séries télévisées

Linterdiction de fumer, cest bien ! Reconnaissance du tabagisme + reconnaissance du visage

Découpez les visages des vidéos, vectorisez-les et écrivez-les dans la base de données des visages (remplacés par des fichiers)

Linterdiction de fumer, cest bien ! Reconnaissance du tabagisme + reconnaissance du visage

La troisième étape, le comportement tabagique se produit Enfin, nous pouvons recadrer le visage du fumeur, calculer le vecteur du visage, le comparer avec les caractéristiques de la base de données des visages, trouver le visage le plus similaire et renvoyer le nom correspondant

Linterdiction de fumer, cest bien ! Reconnaissance du tabagisme + reconnaissance du visage

def find_face_name(self, face_feat):
"""
人脸识别,计算吸烟者名称
:param face_feat:
:return:
"""
cur_face_feature = np.asarray(face_feat, dtype=np.float64).reshape((1, -1))

# 计算两个向量(两张脸)余弦相似度
distances = np.linalg.norm((cur_face_feature - self.face_feats), axis=1)
min_dist_index = np.argmin(distances)
min_dist = distances[min_dist_index]

if min_dist < 0.3:
return self.face_name_list[min_dist_index]
else:
return '未知'

Il y en a beaucoup d'autres dans ce projet Où cela peut-il être développé, par exemple : la vidéo que j'ai fournie n'a qu'un seul visage, mais il doit y avoir plusieurs visages dans la surveillance réelle. À ce stade, vous pouvez utiliser l'algorithme MOT pour suivre les piétons, puis identifier chaque personne individuellement parce qu'elle fume. Vous pouvez également créer une zone statistique distincte pour enregistrer les comportements tabagiques identifiés et les utiliser comme preuve d'avertissements et de sanctions.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer