Maison > Article > Périphériques technologiques > L'interdiction de fumer, c'est bien ! Reconnaissance du tabagisme + reconnaissance du visage
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.
J'ai utilisé 5 000 éléments de données sur le tabagisme étiquetés comme données d'entraînement
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
Une fois la formation terminée, vous peut voir le résultat suivant :
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]
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.
Cadre de détection de la bouche, utilisant les points clés du visage pour identifier.
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.
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_descriptorCalculez 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
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)
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
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!