首頁  >  文章  >  科技週邊  >  AI禁煙可還行!吸菸辨識+人臉識別

AI禁煙可還行!吸菸辨識+人臉識別

WBOY
WBOY轉載
2023-04-14 12:49:021961瀏覽

哈嘍,大家好。

今天跟大家分享一個吸菸辨識 人臉辨識的項目。很多公共場所、生產場所和學校,都有禁煙的要求,做一個禁煙的監控,讓AI自動識別吸煙行為,並識別是誰在吸煙,還是很有必要的。

用目標偵測演算法判斷吸菸行為,擷取吸菸者的人臉,用人臉辨識演算法判斷誰在吸菸。想法比較簡單,但細節處理起來還是稍微麻煩。

項目用到訓練資料和原始碼,都已經打包好了。還是老樣子,留言區獲取。

1. 檢測香菸

我用了 5k 張抽煙的標記數據,作為訓練數據

AI禁煙可還行!吸菸辨識+人臉識別

放在dataset目錄下。

訓練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

第二步,複製./models/yolov5s.yaml為smoke.yaml,修改nc

nc: 1# number of classes

第三步,下載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

AI禁煙可還行!吸菸辨識+人臉識別

訓練完成後可以看到如下輸出:

AI禁煙可還行!吸菸辨識+人臉識別

#準召還湊合。

訓練完成後,可以找到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禁煙可還行!吸菸辨識+人臉識別

能辨識到煙後,我們還需要判斷,目前是否正在吸菸。

可以用香菸偵測框與嘴部偵測框計算IOU來判斷,說白了,就是判斷這兩框是否有交集,若有,則認為目前正在吸菸。

AI禁煙可還行!吸菸辨識+人臉識別

嘴部偵測框,使用人臉關鍵點來辨識。

2. 人臉辨識

人臉辨識演算法有很多成熟的模型,我們不需要自己訓練,直接調庫即可。

我這裡用的是dlib函式庫,它可以辨識人臉 68 個關鍵點,並根據這 68 個關鍵點,提取人臉特徵。

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維向量。

第二步,將現有人臉錄入人臉庫。我準備了3 個影視劇中的吸煙行為

AI禁煙可還行!吸菸辨識+人臉識別

從影片中裁剪出人臉,向量化後,寫入人臉資料庫(用檔案取代)

AI禁煙可還行!吸菸辨識+人臉識別

第三步,發生吸菸行為後,我們可以裁剪出吸菸者的人臉,併計算人臉向量,與人臉資料庫的特徵進行比對,找到最相似的人臉,返回對應的名字

AI禁煙可還行!吸菸辨識+人臉識別

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 '未知'

這個項目還有很多可以擴展的地方,比如:我提供的視頻只有單張臉,實際監控中肯定是多張臉。這時候可以用MOT演算法進行行人跟踪,然後再對每個人單獨做吸煙識別

還有,可以單獨做一個統計區,把識別到的吸煙行為保存,用作警告、處罰的證據。

以上是AI禁煙可還行!吸菸辨識+人臉識別的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:51cto.com。如有侵權,請聯絡admin@php.cn刪除