###こんにちは、みんな。
今日は、喫煙認識と顔認識プロジェクトについて共有します。多くの公共の場所、生産現場、学校は禁煙となっていますが、禁煙を実施し、AI が喫煙行動を自動的に識別し、誰が喫煙しているのかを識別できるようにすることが依然として必要です。 ターゲット検出アルゴリズムを使用して喫煙行動を特定し、喫煙者の顔を抽出し、顔認識アルゴリズムを使用して誰が喫煙しているかを特定します。考え方は比較的シンプルですが、細部はまだ少し面倒です。 プロジェクトで使用する学習データとソースコードがパッケージ化されています。以前と同じです、コメント欄に書いてください。 1. タバコの検出5,000 個のラベル付き喫煙データをトレーニング データとして使用して、データセット ディレクトリに配置しました。 YOLOv5 ターゲット検出モデルをトレーニングします。最初のステップ、data/coco128.yaml をsmoke.yamlにコピーし、データセットディレクトリとカテゴリ構成情報を変更します
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
2番目のステップ、./models/yolov5s.yamlをsmokeにコピーします.yaml、nc を変更します
nc: 1# number of classes
3 番目のステップは、yolov5s.pt 事前トレーニング済みモデルをダウンロードし、それを {yolov5 ディレクトリ}/weights ディレクトリに配置することです
次のコマンドを実行して、
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
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]
タバコ検出フレームと口検出フレームを使用して IOU を計算して決定することができます。端的に言えば、2 つのフレームが交差しているかどうかを判断することです。交差している場合は、現在、喫煙。
顔のキーポイントを使用して識別する口検出フレーム。2. 顔認識
顔認識アルゴリズムには成熟したモデルが多数あり、自分でトレーニングする必要はなく、データベースを直接調整するだけで済みます。
ここでは、顔の 68 個のキー ポイントを識別し、これらの 68 個のキー ポイントに基づいて顔の特徴を抽出できる dlib ライブラリを使用しています。
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 は顔を検出し、顔検出フレームを返すことができます。face_sp は顔検出フレームに基づいており、顔の 68 個のキー ポイントを識別します。
最後に、私たちは顔認識アルゴリズムを使用して誰が喫煙しているかを識別したいと考えています。
最初のステップは、顔の特徴を抽出することです
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 顔の 68 個のキー ポイント間の位置と距離に基づいて、各顔の特徴ベクトルを計算します。この原理は、前に共有した word2vec やビデオを N 次元ベクトルにマッピングするのと似ています。
2 番目のステップは、既存の顔を顔データベースに入力することです。映画やテレビシリーズでの 3 つの喫煙行動を用意しました##動画から顔を切り出し、ベクトル化し、顔データベースに書き込みます (ファイルに置き換えます)
3 番目のステップでは、喫煙が発生した後、喫煙者の顔を切り取り、顔ベクトルを計算し、顔データベースの特徴と比較して、最も類似した顔を見つけます。対応する名前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 '未知'
このプロジェクトには拡張できる領域がたくさんあります。たとえば、私が提供したビデオには顔が 1 つしかありませんが、間違いなく次のような場面で使用されます。実際のモニタリングには複数の顔があります。現時点では、MOT アルゴリズムを使用して歩行者を追跡し、各人の喫煙を個別に識別できます。
また、別の統計領域を作成して、識別された喫煙行動を保存し、証拠として使用することもできます。警告と罰のために。以上がAI禁煙は大丈夫!喫煙認識+顔認識の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。