HUOXIU

AI搭載の禁煙?マジで?!喫煙検知+顔認識

出典:ドゥーマ

こんにちは、みんな。

本日は、喫煙検知と顔認識を組み合わせたプロジェクトをご紹介したいと思います。多くの公共の場、職場、学校では喫煙が禁止されているため、AIが喫煙行動と喫煙者を自動的に識別できる禁煙監視システムの導入は非常に重要です。

このアルゴリズムは、物体検出を用いて喫煙行動を判定し、喫煙者の顔を抽出し、顔認識を用いて誰が喫煙しているかを特定します。アイデアは比較的シンプルですが、細部の扱いはまだ少し複雑です。

1. タバコの検査

喫煙している人のラベル付き画像 5,000 枚をトレーニング データとして使用しました。

datasetディレクトリに配置します。

YOLOv5オブジェクト検出モデルをトレーニングします。

まず、 data/coco128.yamlsmoke.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 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 ]

煙を検知した後、誰かが現在喫煙しているかどうかを判断する必要があります。

タバコ検出フレームと口検出フレームを用いて、 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 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次元ベクトルにマッピングする手法に似ています。

次のステップは、既存の顔を顔認識データベースに入力することです。映画やテレビ番組から喫煙行動の例を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アルゴリズムを歩行者追跡に活用し、喫煙検知を各人物ごとに個別に行うことができます。

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