ホームページ  >  記事  >  テクノロジー周辺機器  >  AI禁煙は大丈夫!喫煙認識+顔認識

AI禁煙は大丈夫!喫煙認識+顔認識

WBOY
WBOY転載
2023-04-14 12:49:022013ブラウズ

###こんにちは、みんな。

今日は、喫煙認識と顔認識プロジェクトについて共有します。多くの公共の場所、生産現場、学校は禁煙となっていますが、禁煙を実施し、AI が喫煙行動を自動的に識別し、誰が喫煙しているのかを識別できるようにすることが依然として必要です。

ターゲット検出アルゴリズムを使用して喫煙行動を特定し、喫煙者の顔を抽出し、顔認識アルゴリズムを使用して誰が喫煙しているかを特定します。考え方は比較的シンプルですが、細部はまだ少し面倒です。

プロジェクトで使用する学習データとソースコードがパッケージ化されています。以前と同じです、コメント欄に書いてください。

1. タバコの検出

5,000 個のラベル付き喫煙データをトレーニング データとして使用して、データセット ディレクトリに配置しました。

YOLOv5 ターゲット検出モデルをトレーニングします。

AI禁煙は大丈夫!喫煙認識+顔認識最初のステップ、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

トレーニングが完了すると、次の出力が表示されます。大丈夫。

トレーニングが完了すると、best.pt の位置が見つかり、後でタバコの検出に使用できます。

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]
AI禁煙は大丈夫!喫煙認識+顔認識

タバコを識別できた後も、現在喫煙しているかどうかを判断する必要があります。

AI禁煙は大丈夫!喫煙認識+顔認識タバコ検出フレームと口検出フレームを使用して IOU を計算して決定することができます。端的に言えば、2 つのフレームが交差しているかどうかを判断することです。交差している場合は、現在、喫煙。

顔のキーポイントを使用して識別する口検出フレーム。

AI禁煙は大丈夫!喫煙認識+顔認識2. 顔認識

顔認識アルゴリズムには成熟したモデルが多数あり、自分でトレーニングする必要はなく、データベースを直接調整するだけで済みます。

ここでは、顔の 68 個のキー ポイントを識別し、これらの 68 個のキー ポイントに基づいて顔の特徴を抽出できる dlib ライブラリを使用しています。

AI禁煙は大丈夫!喫煙認識+顔認識

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 個のキー ポイントを識別します。

これらの 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 次元ベクトルにマッピングするのと似ています。 AI禁煙は大丈夫!喫煙認識+顔認識

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禁煙は大丈夫!喫煙認識+顔認識

また、別の統計領域を作成して、識別された喫煙行動を保存し、証拠として使用することもできます。警告と罰のために。

以上がAI禁煙は大丈夫!喫煙認識+顔認識の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事は51cto.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。