https://m.toutiao.com/is/2Sqf4LD/?=總結(jié)幾個(gè)簡單好用的Python人臉識(shí)別算法 哈嘍,大家好。 今天給大家總結(jié)幾個(gè)簡單、好用的人臉識(shí)別算法。 人臉識(shí)別是計(jì)算機(jī)視覺中比較常見的技術(shù),生活中,我們接觸最多的人臉識(shí)別場景是人臉考勤,我之前還專門寫過一篇人臉考勤的項(xiàng)目,感興趣的朋友可以看看。 人臉識(shí)別的算法最核心的工作是從一張圖片中識(shí)別出人臉的位置。識(shí)別的算法可以說是多種多樣, 下面我就來為大家一一介紹下。 1. HoG人臉檢測(cè)該算法采用傳統(tǒng)的機(jī)器學(xué)習(xí)算法來識(shí)別人臉。傳統(tǒng)機(jī)器學(xué)習(xí)算法的特點(diǎn)是人工構(gòu)造特征,然后將構(gòu)造好的特征送入模型訓(xùn)練。 該算法用HoG提取圖片中人臉特征,用SVM算法進(jìn)行分類。 HoG(Histogram of Oriented Gradient, 方向梯度直方圖)特征是一種在計(jì)算機(jī)視覺和圖像處理中用來進(jìn)行物體檢測(cè)的特征描述子,通過計(jì)算和統(tǒng)計(jì)圖像局部區(qū)域的梯度方向直方圖來構(gòu)成特征。 dlib庫中有該算法的實(shí)現(xiàn),下面我們看看核心代碼 import dlib# 加載預(yù)訓(xùn)練的 HoG 人臉檢測(cè)器hog_face_detector = dlib.get_frontal_face_detector()# 對(duì)圖片進(jìn)行人臉檢測(cè)results = hog_face_detector(imgRGB, 0)for bbox in results: x1 = bbox.left() # 人臉左上角x坐標(biāo) y1 = bbox.top() # 人臉左上角y坐標(biāo) x2 = bbox.right() # 人臉右下角x坐標(biāo) y2 = bbox.bottom() # 人臉右下角y坐標(biāo) results 存放一張圖中檢測(cè)出來的多個(gè)人臉, 遍歷results可以得到每張人臉的矩形框。 檢測(cè)示例如下: 綠框框出來的就是算法檢測(cè)出來的人臉。 HoG 人臉檢測(cè)由于采用傳統(tǒng)機(jī)器學(xué)習(xí)算法,所以性能比較高,在CPU上運(yùn)行也可以比較快。但它無法檢測(cè)小于 80*80 的人臉,對(duì)旋轉(zhuǎn)人臉、非正面人臉,識(shí)別效果也不太好。 2. 深度學(xué)習(xí)人臉檢測(cè)雖然傳統(tǒng)機(jī)器學(xué)習(xí)算法檢測(cè)更快,但準(zhǔn)確度卻有待提升。基于深度學(xué)習(xí)的人臉檢測(cè)算法往往會(huì)更加準(zhǔn)確。 這里介紹的是使用殘差網(wǎng)絡(luò)ResNet-10通過網(wǎng)絡(luò)(模型)在圖像的單通道( Single Shot Detector,SSD)中檢測(cè)多個(gè)人臉。簡稱SSD算法。 首先,需要將原始圖片進(jìn)行blob預(yù)處理,然后直接送入模型,進(jìn)行檢測(cè) cv2庫提供了該算法的實(shí)現(xiàn),核心代碼如下:
results[0][0]存放了檢測(cè)出來的多張人臉,每張人臉用數(shù)組表達(dá),數(shù)組的第3位存放置信度,可以通過閾值過濾不置信的人臉。數(shù)組的第4~7位存放檢測(cè)出來的人臉矩形框左上角和右下角的坐標(biāo)。 相比于 HoG 人臉檢測(cè),SSD 算法對(duì)遮擋、非正面人臉也能檢測(cè)出來。 3. 卷積神經(jīng)網(wǎng)絡(luò)人臉檢測(cè)卷積就不多說了,了解計(jì)算機(jī)視覺的都知道。 dlib庫提供了卷積神經(jīng)網(wǎng)絡(luò)人臉檢測(cè)算法的實(shí)現(xiàn),用法跟之前類似 import dlib# 記載預(yù)訓(xùn)練模型cnn_face_detector = dlib.cnn_face_detection_model_v1('models/mmod_human_face_detector.dat')# 人臉檢測(cè)results = cnn_face_detector(imgRGB, 0)# 遍歷每張人臉for face in results: # 人臉邊框 bbox = face.rect # 人臉邊框的左上角和右下角坐標(biāo)點(diǎn) x1 = int(bbox.left() * (width/new_width)) y1 = int(bbox.top() * (height/new_height)) x2 = int(bbox.right() * (width/new_width)) y2 = int(bbox.bottom() * (height/new_height)) results的解析跟上面類似,這里就不在贅述了。 采用卷積神經(jīng)網(wǎng)絡(luò)的人臉檢測(cè)算法優(yōu)勢(shì)很明顯,比前兩個(gè)更準(zhǔn)確和健壯,并且還能夠檢測(cè)遮擋下的人臉。 即便非正面、且光線暗的圖片,也能很好檢測(cè)出來 但該算法相應(yīng)的缺點(diǎn)也很明顯,檢測(cè)過程所花費(fèi)的時(shí)間非常長,無法在 CPU 上實(shí)時(shí)運(yùn)行。 4. BlazeFace上面的算法要么精度高、速度慢,要么速度快,精度低。那有沒有一種檢測(cè)算法,既有高準(zhǔn)確率,又有高性能呢? 答案是肯定的,BlazeFace是一種非常輕量級(jí)且高度準(zhǔn)確的人臉檢測(cè)器,號(hào)稱亞毫秒級(jí)的人臉檢測(cè)器。其靈感來自 Single Shot MultiBox Detector (SSD) 和 MobileNetv2。 Mediapipe庫提供了該算法的實(shí)現(xiàn),核心代碼如下:
效果如下: 可以看到,BlazeFace算法不光能檢測(cè)人臉,還能識(shí)別出人臉6個(gè)關(guān)鍵點(diǎn)(眼睛、鼻子、耳朵、嘴)。 上面就是今天分享的4個(gè)人臉識(shí)別的算法。 識(shí)別出人臉,我們?cè)僮鋈四樋记诰头浅:唵瘟?,把人?/span>Embedding成向量,計(jì)算向量的之間的距離即可。 文章來自 |
|