3、我們將看一些將面部標(biāo)記檢測應(yīng)用于圖像的結(jié)果。
什么是面部標(biāo)記?
===================================================================
人臉標(biāo)記點(diǎn)檢測是形狀預(yù)測問題的一個子集。給定一個輸入圖像(通常是一個指定感興趣對象的ROI),形狀預(yù)測器嘗試沿形狀定位感興趣的關(guān)鍵點(diǎn)。
在人臉標(biāo)記的背景下,我們的目標(biāo)是使用形狀預(yù)測方法檢測人臉上的重要人臉結(jié)構(gòu)。
因此,檢測面部標(biāo)記是一個兩步過程:
? 步驟1:在圖像中定位人臉。
? 步驟2:檢測人臉ROI上的關(guān)鍵面部結(jié)構(gòu)。
人臉檢測(步驟1)可以通過多種方式實(shí)現(xiàn)。
我們可以使用OpenCV內(nèi)置的Haar級聯(lián)。
我們可以將預(yù)先訓(xùn)練好的HOG+線性SVM對象檢測器專門用于人臉檢測任務(wù)。
或者我們甚至可以使用基于深度學(xué)習(xí)的算法進(jìn)行人臉定位。
無論哪種情況,用于檢測圖像中人臉的實(shí)際算法都無關(guān)緊要。相反,重要的是,通過某種方法,我們獲得了面邊界框(即,圖像中面的(x,y)-坐標(biāo))。
給定面部區(qū)域,我們可以應(yīng)用步驟2:檢測面部區(qū)域中的關(guān)鍵面部結(jié)構(gòu)。
有多種面部標(biāo)記檢測器,但所有方法基本上都試圖定位和標(biāo)記以下面部區(qū)域:
-
嘴
-
右眉
-
左眉
-
右眼
-
左眼
-
鼻
-
頜
dlib庫中包含的面部標(biāo)記檢測器是Kazemi和Sullivan(2014)提出的一系列回歸樹的一毫秒面部校準(zhǔn)的實(shí)現(xiàn)。
此方法首先使用:
-
圖像上標(biāo)記的面部標(biāo)記的訓(xùn)練集。這些圖像被手動標(biāo)記,指定每個面部結(jié)構(gòu)周圍區(qū)域的特定(x,y)坐標(biāo)。
-
先驗(yàn),更具體地說,是輸入像素對之間距離的概率。
給定該訓(xùn)練數(shù)據(jù),訓(xùn)練回歸樹集合,以直接從像素強(qiáng)度本身估計(jì)面部標(biāo)記位置(即,不進(jìn)行“特征提取”)。
最終的結(jié)果是一個面部標(biāo)記檢測器,可用于實(shí)時檢測具有高質(zhì)量預(yù)測的面部標(biāo)記。
dlib的面部標(biāo)記檢測器
=======================================================================
dlib庫中預(yù)先訓(xùn)練的面部標(biāo)記檢測器用于估計(jì)映射到面部結(jié)構(gòu)的68(x,y)坐標(biāo)的位置。
68個坐標(biāo)的索引可在下圖中顯示:
這些注釋是68點(diǎn)iBUG 300-W數(shù)據(jù)集的一部分,dlib面部標(biāo)記預(yù)測器是在該數(shù)據(jù)集上訓(xùn)練的。
值得注意的是,還有其他風(fēng)格的面部標(biāo)記檢測器,包括可以在HELEN數(shù)據(jù)集上訓(xùn)練的194點(diǎn)模型。
無論使用哪一個數(shù)據(jù)集,都可以利用相同的dlib框架在輸入訓(xùn)練數(shù)據(jù)上訓(xùn)練形狀預(yù)測器-如果您想訓(xùn)練面部標(biāo)記檢測器或自定義形狀預(yù)測器,這非常有用。
在這篇博文的剩余部分,我將演示如何在圖像中檢測這些面部標(biāo)記。
使用dlib、OpenCV和Python檢測面部標(biāo)記
=====================================================================================
這篇博文使用到了imutils庫face_utils.py中的兩個函數(shù)。
第一個實(shí)用函數(shù)是rect_to_bb,是“矩形到邊框”的縮寫:
def rect_to_bb(rect):
#獲取dlib預(yù)測的邊界并將其轉(zhuǎn)換
#按照我們通常使用的格式(x,y,w,h)
#使用OpenCV
x = rect.left()
y = rect.top()
w = rect.right() - x
h = rect.bottom() - y
返回一個元組 (x, y, w, h)
return (x, y, w, h)
此函數(shù)接受一個參數(shù)rect,該參數(shù)假定為dlib檢測器(即面部檢測器)生成的邊框矩形。
rect對象包括檢測的(x,y)-坐標(biāo)。
然而,在OpenCV中,我們通常認(rèn)為邊界框是“(x,y,width,height)”,因此為了方便起見,rect_to_bb函數(shù)將這個rect對象轉(zhuǎn)換為4元組坐標(biāo)。
第二,shape_to_np函數(shù):
def shape_to_np(shape, dtype=“int”):
#初始化(x,y)-坐標(biāo)列表
coords = np.zeros((68, 2), dtype=dtype)
#在68個面部標(biāo)記上循環(huán)并轉(zhuǎn)換它們
#到(x,y)-坐標(biāo)的2元組
for i in range(0, 68):
coords[i] = (shape.part(i).x, shape.part(i).y)
#返回(x,y)坐標(biāo)的列表
return coords
dlib面部標(biāo)記檢測器將返回一個包含面部標(biāo)記區(qū)域68(x,y)坐標(biāo)的形狀對象。
使用shape_to_np函數(shù),我們可以將這個對象轉(zhuǎn)換成一個NumPy數(shù)組。
有了這兩個輔助函數(shù),我們現(xiàn)在就可以檢測圖像中的面部標(biāo)記了。
圖像
打開一個新文件,將其命名為facial_landmarks.py,然后插入以下代碼:
import the necessary packages
from imutils import face_utils
import numpy as np
import argparse
import imutils
import dlib
import cv2
#構(gòu)造參數(shù)解析器并解析參數(shù)
ap = argparse.ArgumentParser()
ap.add_argument(“-p”, “–shape-predictor”, required=True,
help=“path to facial landmark predictor”)
ap.add_argument(“-i”, “–image”, required=True,
help=“path to input image”)
args = vars(ap.parse_args())
導(dǎo)入所需的Python包。
將使用imutils的face_utils子模塊訪問上面詳述的助手函數(shù)。
然后將導(dǎo)入dlib。
解析我們的命令行參數(shù):
–shape-predictor:這是通往dlib預(yù)先訓(xùn)練的面部標(biāo)記檢測器的路徑。你可以在這里下載檢測器模型,也可以使用本文的“下載”部分來獲取代碼+示例圖像+預(yù)先訓(xùn)練過的檢測器。
–image:我們要檢測面部標(biāo)記的輸入圖像的路徑。
既然我們的導(dǎo)入和命令行參數(shù)已經(jīng)處理完畢,讓我們初始化dlib的面部檢測器和面部標(biāo)記預(yù)測器:
初始化dlib的人臉檢測器(基于HOG)然后創(chuàng)建
面部標(biāo)記預(yù)測器
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(args[“shape_predictor”])
初始化dlib的預(yù)訓(xùn)練人臉檢測器,該檢測器基于對用于對象檢測的定向梯度標(biāo)準(zhǔn)直方圖+線性SVM方法的修改。
然后使用提供的shape_predictor的路徑加載面部標(biāo)記預(yù)測器。
但是,在我們能夠?qū)嶋H檢測面部標(biāo)記點(diǎn)之前,我們首先需要檢測輸入圖像中的面部:
加載輸入圖像,調(diào)整大小,并將其轉(zhuǎn)換為灰度
image = cv2.imread(args[“image”])
image = imutils.resize(image, width=500)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
在灰度圖像中檢測人臉
rects = detector(gray, 1)
通過OpenCV從磁盤加載我們的輸入圖像,然后通過調(diào)整圖像大小使其具有500像素的寬度并將其轉(zhuǎn)換為灰度來預(yù)處理圖像。
處理檢測圖像中面的邊界框。
探測器的第一個參數(shù)是我們的灰度圖像(盡管這種方法也可以用于彩色圖像)。
第二個參數(shù)是在應(yīng)用檢測器之前放大圖像時要應(yīng)用的圖像金字塔層的數(shù)量(這相當(dāng)于在圖像上計(jì)算cv2.N次)。
在人臉檢測之前提高輸入圖像分辨率的好處是,它可能允許我們檢測圖像中的更多人臉-缺點(diǎn)是輸入圖像越大,檢測過程的計(jì)算成本就越高。
給定圖像中人臉的(x,y)-坐標(biāo),我們現(xiàn)在可以對每個人臉區(qū)域應(yīng)用人臉標(biāo)記檢測:
循環(huán)面部檢測
for (i, rect) in enumerate(rects):
確定面部區(qū)域的面部標(biāo)志,然后
自我介紹一下,小編13年上海交大畢業(yè),曾經(jīng)在小公司待過,也去過華為、OPPO等大廠,18年進(jìn)入阿里一直到現(xiàn)在。
深知大多數(shù)Python工程師,想要提升技能,往往是自己摸索成長或者是報(bào)班學(xué)習(xí),但對于培訓(xùn)機(jī)構(gòu)動則幾千的學(xué)費(fèi),著實(shí)壓力不小。自己不成體系的自學(xué)效果低效又漫長,而且極易碰到天花板技術(shù)停滯不前!
因此收集整理了一份《2024年P(guān)ython開發(fā)全套學(xué)習(xí)資料》,初衷也很簡單,就是希望能夠幫助到想自學(xué)提升又不知道該從何學(xué)起的朋友,同時減輕大家的負(fù)擔(dān)。
既有適合小白學(xué)習(xí)的零基礎(chǔ)資料,也有適合3年以上經(jīng)驗(yàn)的小伙伴深入學(xué)習(xí)提升的進(jìn)階課程,基本涵蓋了95%以上Python開發(fā)知識點(diǎn),真正體系化!
由于文件比較大,這里只是將部分目錄大綱截圖出來,每個節(jié)點(diǎn)里面都包含大廠面經(jīng)、學(xué)習(xí)筆記、源碼講義、實(shí)戰(zhàn)項(xiàng)目、講解視頻,并且后續(xù)會持續(xù)更新文章來源:http://www.zghlxwxcb.cn/news/detail-849470.html
如果你覺得這些內(nèi)容對你有幫助,可以添加V獲?。簐ip1024c (備注Python)
0.png)
既有適合小白學(xué)習(xí)的零基礎(chǔ)資料,也有適合3年以上經(jīng)驗(yàn)的小伙伴深入學(xué)習(xí)提升的進(jìn)階課程,基本涵蓋了95%以上Python開發(fā)知識點(diǎn),真正體系化!
由于文件比較大,這里只是將部分目錄大綱截圖出來,每個節(jié)點(diǎn)里面都包含大廠面經(jīng)、學(xué)習(xí)筆記、源碼講義、實(shí)戰(zhàn)項(xiàng)目、講解視頻,并且后續(xù)會持續(xù)更新
如果你覺得這些內(nèi)容對你有幫助,可以添加V獲?。簐ip1024c (備注Python)
[外鏈圖片轉(zhuǎn)存中…(img-13Ozzt1z-1711821452906)]文章來源地址http://www.zghlxwxcb.cn/news/detail-849470.html
到了這里,關(guān)于人臉檢測進(jìn)階:使用 dlib、OpenCV 和 Python 檢測面部標(biāo)記的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!