久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

博客專欄

EEPW首頁 > 博客 > 扣丁學堂Python培訓之實現人臉識別技術源碼分享

扣丁學堂Python培訓之實現人臉識別技術源碼分享

發布人:扣丁學習 時間:2020-12-02 來源:工程師 發布文章

現在的人臉識別技術已經得到了非常廣泛的應用,支付領域、身份驗證、美顏相機里都有它的應用。用iPhone的同學們應該對下面的功能比較熟悉。



iPhone的照片中有一個“人物”的功能,能夠將照片里的人臉識別出來并分類,背后的原理也是人臉識別技術。

這篇文章主要介紹怎樣用Python實現人臉檢測。人臉檢測是人臉識別的基礎。人臉檢測的目的是識別出照片里的人臉并定位面部特征點,人臉識別是在人臉檢測的基礎上進一步告訴你這個人是誰。

好了,介紹就到這里。接下來,開始準備我們的環境。

準備工作

本文的人臉檢測基于dlib,dlib依賴Boost和cmake,所以首先需要安裝這些包,以Ubuntu為例:

$sudoapt-getinstallbuild-essentialcmake
$sudoapt-getinstalllibgtk-3-dev
$sudoapt-getinstalllibboost-all-dev


我們的程序中還用到numpy,opencv,所以也需要安裝這些庫:

$pipinstallnumpy
$pipinstallscipy
$pipinstallopencv-python
$pipinstalldlib

人臉檢測基于事先訓練好的模型數據,從這里可以下到模型數據,dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2下載到本地路徑后解壓,記下解壓后的文件路徑,程序中會用到。

dlib的人臉特征點

上面下載的模型數據是用來估計人臉上68個特征點(x,y)的坐標位置,這68個坐標點的位置如下圖所示:



我們的程序將包含兩個步驟:

第一步,在照片中檢測人臉的區域

第二部,在檢測到的人臉區域中,進一步檢測器官(眼睛、鼻子、嘴巴、下巴、眉毛)

人臉檢測代碼

我們先來定義幾個工具函數:

defrect_to_bb(rect):
x=rect.left()
y=rect.top()
w=rect.right()-x
h=rect.bottom()-y
return(x,y,w,h)


這個函數里的rect是dlib臉部區域檢測的輸出。這里將rect轉換成一個序列,序列的內容是矩形區域的邊界信息。

defshape_to_np(shape,dtype="int"):
coords=np.zeros((68,2),dtype=dtype)
foriinrange(0,68):
coords[i]=(shape.part(i).x,shape.part(i).y)
returncoords



這個函數里的shape是dlib臉部特征檢測的輸出,一個shape里包含了前面說到的臉部特征的68個點。這個函數將shape轉換成Numpyarray,為方便后續處理。

defresize(image,width=1200):
r=width*1.0/image.shape[1]
dim=(width,int(image.shape[0]*r))
resized=cv2.resize(image,dim,interpolation=cv2.INTER_AREA)
returnresized



這個函數里的image就是我們要檢測的圖片。在人臉檢測程序的最后,我們會顯示檢測的結果圖片來驗證,這里做resize是為了避免圖片過大,超出屏幕范圍。

接下來,開始我們的主程序部分

importsys
importnumpyasnp
importdlib
importcv2
iflen(sys.argv)<2:
print"Usage:%s<imagefile>"%sys.argv[0]
sys.exit(1)
image_file=sys.argv[1]
detector=dlib.get_frontal_face_detector()
predictor=dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")


我們從sys.argv[1]參數中讀取要檢測人臉的圖片,接下來初始化人臉區域檢測的detector和人臉特征檢測的predictor。shape_predictor中的參數就是我們之前解壓后的文件的路徑。

image=cv2.imread(image_file)
image=resize(image,width=1200)
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
rects=detector(gray,1)



在檢測特征區域前,我們先要檢測人臉區域。這段代碼調用opencv加載圖片,resize到合適的大小,轉成灰度圖,最后用detector檢測臉部區域。因為一張照片可能包含多張臉,所以這里得到的是一個包含多張臉的信息的數組rects。

for(i,rect)inenumerate(rects):
shape=predictor(gray,rect)
shape=shape_to_np(shape)
(x,y,w,h)=rect_to_bb(rect)
cv2.rectangle(image,(x,y),(x+w,y+h),(0,255,0),2)
cv2.putText(image,"Face#{}".format(i+1),(x-10,y-10),
cv2.FONT_HERSHEY_SIMPLEX,0.5,(0,255,0),2)
for(x,y)inshape:
cv2.circle(image,(x,y),2,(0,0,255),-1)
cv2.imshow("Output",image)
cv2.waitKey(0)



對于每一張檢測到的臉,我們進一步檢測臉部的特征(鼻子、眼睛、眉毛等)。對于臉部區域,我們用綠色的框在照片上標出;對于臉部特征,我們用紅色的點標出來。

最后我們把加了檢測標識的照片顯示出來,waitKey(0)表示按任意鍵可退出程序。

以上是我們程序的全部

測試

接下來是令人興奮的時刻,檢驗我們結果的時刻到來了。

下面是原圖



下面是程序識別的結果



可以看到臉部區域被綠色的長方形框起來了,臉上的特征(鼻子,眼睛等)被紅色點點標識出來了。最后想要了解更多關于Python發展前景趨勢,請關注扣丁學堂python培訓官網、微信等平臺,扣丁學堂IT職業在線學習教育平臺為您提供最新的Python視頻教程系統,通過千鋒扣丁學堂金牌講師在線錄制的Python視頻教程課程,讓你快速掌握Python從入門到精通開發實戰技能。扣丁學堂Python技術交流群:816572891。

*博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。



關鍵詞:

相關推薦

技術專區

關閉