原文連接:https://mp.weixin.qq.com/s/3BgDld9hILPLCIlyysZs6Q
哈喽,大家好。
今天給大家總結幾個簡單、好用的人臉識別算法。 人臉識別是計算機視覺中比較常見的技術,生活中,我們接觸最多的人臉識別場景是人臉考勤,我之前還專門寫過一篇人臉考勤的項目,感興趣的朋友可以看看。
人臉識別的算法最核心的工作是從一張圖片中識別出人臉的位置。識別的算法可以說是多種多樣, 下面我就來為大家一一介紹下。
該算法采用傳統的機器學習算法來識別人臉。傳統機器學習算法的特點是人工構造特征,然後將構造好的特征送入模型訓練。
該算法用HoG
提取圖片中人臉特征,用SVM
算法進行分類。
HoG
(Histogram of Oriented Gradient, 方向梯度直方圖)特征是一種在計算機視覺和圖像處理中用來進行物體檢測的特征描述子,通過計算和統計圖像局部區域的梯度方向直方圖來構成特征。
dlib
庫中有該算法的實現,下面我們看看核心代碼
import dlib
# 加載預訓練的 HoG 人臉檢測器
hog_face_detector = dlib.get_frontal_face_detector()
# 對圖片進行人臉檢測
results = hog_face_detector(imgRGB, 0)
for bbox in results:
x1 = bbox.left() # 人臉左上角x坐標
y1 = bbox.top() # 人臉左上角y坐標
x2 = bbox.right() # 人臉右下角x坐標
y2 = bbox.bottom() # 人臉右下角y坐標
results
存放一張圖中檢測出來的多個人臉, 遍歷results
可以得到每張人臉的矩形框。
檢測示例如下:
綠框框出來的就是算法檢測出來的人臉。
HoG 人臉檢測由於采用傳統機器學習算法,所以性能比較高,在CPU上運行也可以比較快。但它無法檢測小於 80*80 的人臉,對旋轉人臉、非正面人臉,識別效果也不太好。
雖然傳統機器學習算法檢測更快,但准確度卻有待提升。基於深度學習的人臉檢測算法往往會更加准確。
這裡介紹的是使用殘差網絡ResNet-10
通過網絡(模型)在圖像的單通道( Single Shot Detector,SSD)中檢測多個人臉。簡稱SSD
算法。
首先,需要將原始圖片進行blob
預處理,然後直接送入模型,進行檢測
cv2
庫提供了該算法的實現,核心代碼如下:
import cv2
# 加載預訓練的 SSD 模型
opencv_dnn_model = cv2.dnn.readNetFromCaffe(
prototxt="models/deploy.prototxt"
, caffeModel="models/res10_300x300_ssd_iter_140000_fp16.caffemodel")
# 原始圖片 blob 處理
preprocessed_image = cv2.dnn.blobFromImage(image, scalefactor=1.0, size=(300, 300), mean=(104.0, 117.0, 123.0), swapRB=False, crop=False)
# blob 圖片送入模型
opencv_dnn_model.setInput(preprocessed_image)
# 模型推理,進行人臉檢測
results = opencv_dnn_model.forward()
# 遍歷人臉
for face in results[0][0]:
# 置信度
face_confidence = face[2]
# 人臉邊框的左上角和右下角坐標點
x1 = int(bbox[0] * image_width)
y1 = int(bbox[1] * image_height)
x2 = int(bbox[2] * image_width)
y2 = int(bbox[3] * image_height)
results[0][0]
存放了檢測出來的多張人臉,每張人臉用數組表達,數組的第3位存放置信度,可以通過阈值過濾不置信的人臉。數組的第4~7位存放檢測出來的人臉矩形框左上角和右下角的坐標。
相比於 HoG
人臉檢測,SSD
算法對遮擋、非正面人臉也能檢測出來。
卷積就不多說了,了解計算機視覺的都知道。
dlib
庫提供了卷積神經網絡人臉檢測算法的實現,用法跟之前類似
import dlib
# 記載預訓練模型
cnn_face_detector = dlib.cnn_face_detection_model_v1("models/mmod_human_face_detector.dat")
# 人臉檢測
results = cnn_face_detector(imgRGB, 0)
# 遍歷每張人臉
for face in results:
# 人臉邊框
bbox = face.rect
# 人臉邊框的左上角和右下角坐標點
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
的解析跟上面類似,這裡就不在贅述了。
采用卷積神經網絡的人臉檢測算法優勢很明顯,比前兩個更准確和健壯,並且還能夠檢測遮擋下的人臉。
即便非正面、且光線暗的圖片,也能很好檢測出來
但該算法相應的缺點也很明顯,檢測過程所花費的時間非常長,無法在 CPU 上實時運行。
上面的算法要麼精度高、速度慢,要麼速度快,精度低。那有沒有一種檢測算法,既有高准確率,又有高性能呢?
答案是肯定的,BlazeFace
是一種非常輕量級且高度准確的人臉檢測器,號稱亞毫秒級的人臉檢測器。其靈感來自 Single Shot MultiBox Detector (SSD)
和 MobileNetv2
。
Mediapipe
庫提供了該算法的實現,核心代碼如下:
import mediapipe as mp
# 畫圖工具
mp_drawing = mp.solutions.drawing_utils
# 初始化人臉檢測模型
mp_face_detection = mp.solutions.face_detection
mp_face_detector = mp_face_detection.FaceDetection(min_detection_confidence=0.4)
results = mp_face_detector.process(imgRGB)
if results.detections:
# 變臉檢測出的人臉
for face_no, face in enumerate(results.detections):
# 畫人臉關鍵點
mp_drawing.draw_detection(image=output_image, detection=face, keypoint_drawing_spec=mp_drawing.DrawingSpec(color=(0,255,0),thickness=-1, circle_radius=image_width//115), bbox_drawing_spec=mp_drawing.DrawingSpec(color=(0,255,0),thickness=image_width//180))
# 畫人臉框
face_bbox = face.location_data.relative_bounding_box
x1 = int(face_bbox.xmin*image_width)
y1 = int(face_bbox.ymin*image_height)
cv2.rectangle(output_image, pt1=(x1, y1-image_width//20), pt2=(x1+image_width//16, y1), color=(0, 255, 0), thickness=-1)
效果如下:
可以看到,BlazeFace
算法不光能檢測人臉,還能識別出人臉6個關鍵點(眼睛、鼻子、耳朵、嘴)。
上面就是今天分享的4個人臉識別的算法。
識別出人臉,我們再做人臉考勤就非常簡單了,把人臉Embedding
成向量,計算向量的之間的距離即可。
後續我會持續分享優秀的 Python+AI 項目。
參考資料:https://bleedai.com/5-easy-effective-face-detection-algorithms-in-python/
關注公眾號 渡碼
首先給大家推薦一本書:機器學習算法原理與編程實踐 本文內容全部轉載於書中,相當於一個讀書筆記了吧 緒論 1992年麻省理工學院通過實驗對比了基於結構特征的方法與基於模版匹配的方法,發現模版匹配的方法要 ...
Face Id是一款高端的人臉解鎖軟件,官方稱:"在一百萬張臉中識別出你的臉."百度.谷歌.騰訊等各大企業都花費數億來鞭策人工智能的崛起,而實際的人臉識別技術是否有那麼神奇? 綠帽 ...
需要掌握知識python,opencv和機器學習一類的基礎 過一段時間代碼上傳github,本人菜j一個,雖然是我自己謝的,也有好多不懂,或者我這就是錯誤方向 鏈接:https://pan.baidu ...
概述: OpenCV是一個基於BSD許可(開源)發行的跨平台計算機視覺庫 為什麼有OpenCV? 計算機視覺市場巨大而且持續增長,且這方面沒有標准API,如今的計算機視覺軟件大概有以下三種: 1.研究 ...
案例一 導入圖片 思路: 1.導入庫 2.加載圖片 3.創建窗口 4.顯示圖片 5.暫停窗口 6.關閉窗口 # 1.導入庫 import cv2 # 2.加載圖片 img = cv2.imread(' ...
1.安裝python,在這裡我的版本是python 3.6 2.安裝pycharm,我的版本是pycharm 2017 3.安裝pip pip 版本10 4.安裝 numpy :pip ins ...
"""Performs face alignment and calculates L2 distance between the embeddings of image ...
該項目基於Github上面的開源項目人臉識別face-recognition,主要是對圖像和視頻中的人臉進行識別,在開源項目給出的例子基礎上對視頻人臉識別的KNN算法進行了實現. 0x1 工程項目結構 ...
欲直接下載代碼文件,關注我們的公眾號哦!查看歷史消息即可! 前言:讓我的電腦認識我 我的電腦只有認識我,才配稱之為我的電腦! 今天,我們用Python實現高大上的人臉識別技術! Python裡,簡單的 ...
自學 Java 怎麼入門? 595贊同反對,不會顯示你的姓名 給你推薦一個寫得非常用心的Java基礎教程:java-basic | 天碼營 這個教程將Java的入門基礎知識貫穿在一個實例中,逐 ...
最近在把以前寫的一個項目改成用easyui做前端.過程中遇到了不少問.其中一個就是datagrid不能很好的布.想了好多辦法都有局限.最後想到會不會是布局的問題,經過實,最後問題解. 1:比如在項目中 ...
由於數據庫軟件十分的復雜,不管是Mysql還是sqlserver安裝都有很多配置要選擇. 假若你第一次安裝數據庫失敗,然後又想卸載,又再次安裝,這時可能由於你第一次的卸載不完全,會導致你第二次安裝時出 ...
原文:SSAS系列--[03]多維數據(多維數據集對象) 1.什麼是Cube? 簡單 Cube 對象由基本信息.維度和度量值組組成. 基本信息包括多維數據集的名稱.多維數據集的默認度量值.數據源和存儲 ...
MySQL雖然輸入check語句不會報錯,但是實際上並沒有check的功能.但是MySQL 依然可以利用觸發器來實現相應功能. 本文將根據兩個例子簡要闡述MySQL實現check和assertion的 ...
1.錯誤描述 The 'org.eclipse.jdt.ui.JavaAllCompletionProposalComputer' proposal computer from 'org.eclips ...
1. .tar.gz壓縮命令: 命令格式: tar -zcvf 壓縮文件名.tar.gz 被壓縮文件名 可先切換到當前目錄下.壓縮文件名和被壓縮文件名都可加入路徑. 2. .tar.gz解壓縮命令: ...
賬號和數據庫都創建好之後,接下來就可以創建表了.來見識一下這個所謂“列式”存儲方式的表是長啥樣的! 一.可視化新建表 然後輸入所需欄位,設置好類型和長度: 上圖右上角可以看到類型是Column Sto ...
Mac安裝git-flow:brew install git-flow 克隆新代碼:git clone [email protected]:abc/test.git 切換到遠程的develop分支(很 ...
“System.Runtime.InteropServices.COMException”類型的未經處理的異常在 Arcgis_Test.exe 中發生 其他信息: ArcGIS product no ...