利用python、tensorflow、opencv實現人臉識別(包會)!
文章推薦指數: 80 %
利用python、tensorflow、opencv實現人臉識別(包會)! ... 本人通過網上資料的查詢發現這類人臉識別,大多參考了一位日本程式設計師小哥的文章。
利用python、tensorflow、opencv實現人臉識別(包會)!
首頁
最新
HTML
CSS
JavaScript
jQuery
Python3
Python2
Java
C
C++
Go
SQL
首頁
最新
Search
利用python、tensorflow、opencv實現人臉識別(包會)!
2019-01-08254
一,前言
本人是機械專業在讀碩士,在完成暑假實踐的時候接觸到了人臉識別,對這一實現很感興趣,所以花了大概十天時間做出了自己的人臉識別。
這篇文章應該是很詳細的了所以幫你實現人臉識別應該沒什麼問題。
先說本博文的最終要達到的效果:通過一系列操作,在攝像頭的視訊流中識別特定人的人臉,並且予以標記。
本人通過網上資料的查詢發現這類人臉識別,大多參考了一位日本程式設計師小哥的文章。
關於這個思路的人臉識別網上資料很多,但是有很多細節沒有提到,我在實踐的過程中菜過了無數的坑,希望我這篇文章能夠對你提供更加清晰的思路和操作。
先看結果(人醜勿怪)!這個是識別我的臉,別人的臉不會識別到
其實,這已經涉及到了一些機器學習的內容,對於像入門機器學習的同學來說是一個不錯的練手的專案。
二、前期準備工作
首先說,我在剛開始接觸的時候,主要是在各種資料包的安裝上以及環境的配置上花費了巨大的時間,有些資料包升級版本之後與一些功能不相容,出了很多問題,所以。
我在這裡說一下我的資料包的版本和python版本。
現在可以用anaconda來下載python和各種資料包,但是最新的版本是用python3.6.X,在後面的實踐中可能會出現不同的問題,所以為了安全起見python最好選擇3.5.X的,不要安裝2.X的,與3.X的版本不相容,會出現很多問題。
另外再安裝一個tensorflow,pip,keras,sklearn,PIL,numpy,opencv等。
其中keras要安裝2.0版本的,opencv安裝3.3.1版本的。
tensorflow有CPU版本的和GPU版本的,你可以看一下你適合哪一種,這裡貼出來一些供你參考:
您必須從以下TensorFlow型別中選擇其一來進行安裝:
僅支援CPU的TensorFlow。
如果您的系統沒有NVIDIA®GPU,則必須安裝此版本。
請注意,此版本的 TensorFlow通常更容易安裝(用時通常在5或10分鐘內),所以即使您擁有NVIDIAGPU,我們也建議先安 裝此版本。
預編譯的二進位制檔案將使用AVX指令。
支援GPU的TensorFlow。
TensorFlow程式在GPU上的執行速度通常要比在CPU上快得多。
因此,如果您 的系統配有滿足以下所示先決條件的NVIDIA®GPU,並且您需要執行效能至關重要的應用,則最終應安裝此 版本。
另外我在安裝的過程中發現了幾篇比較不錯的博文供你參考:
在幾篇博文裡你也會看到驗證安裝正確的方法,如果可以的話,說明你安裝成功了,這裡我就不多說了。
後面的話你可能還會遇到別的什麼問題,如果還需要安裝什麼模組的話,在安裝也可以。
在硬體方面,你還需要一個USB攝像頭。
總結:
USB攝像頭一個;
python -- 3.5.X
tensorflow
opencv -- 3.3.1
keras -- 3.0.X
sklearn --0.19.0
三、正式開始
1,識別人臉
實現人臉識別簡單程式沒幾行,但是我們要實現的是識別這個是誰的臉。
首先我們讓系統識別人臉,這是opencv的工作,我們只需要呼叫其中的API函式就可以了。
下面是呼叫opencv實現對於人臉的識別。
咱們在程式下面對程式進行一些解釋:
importcv2
importsys
fromPILimportImage
defCatchUsbVideo(window_name,camera_idx):
cv2.namedWindow(window_name)
#視訊來源,可以來自一段已存好的視訊,也可以直接來自USB攝像頭
cap=cv2.VideoCapture(camera_idx)
#告訴OpenCV使用人臉識別分類器
classfier=cv2.CascadeClassifier("H:\\OpenCV\\opencv\\build\\etc\\haarcascades\\haarcascade_frontalface_alt2.xml")
#識別出人臉後要畫的邊框的顏色,RGB格式
color=(0,255,0)
whilecap.isOpened():
ok,frame=cap.read()#讀取一幀資料
ifnotok:
break
#將當前幀轉換成灰度影象
grey=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
#人臉檢測,1.2和2分別為圖片縮放比例和需要檢測的有效點數
faceRects=classfier.detectMultiScale(grey,scaleFactor=1.2,minNeighbors=3,minSize=(32,32))
iflen(faceRects)>0:#大於0則檢測到人臉
forfaceRectinfaceRects:#單獨框出每一張人臉
x,y,w,h=faceRect
cv2.rectangle(frame,(x-10,y-10),(x+w+10,y+h+10),color,2)
#顯示影象
cv2.imshow(window_name,frame)
c=cv2.waitKey(10)
ifc&0xFF==ord('q'):
break
#釋放攝像頭並銷燬所有視窗
cap.release()
cv2.destroyAllWindows()
if__name__=='__main__':
iflen(sys.argv)!=1:
print("Usage:%scamera_id\r\n"%(sys.argv[0]))
else:
CatchUsbVideo("識別人臉區域",0)
首先,第一行importcv2,實際上,”cv2”中的”2”並不表示OpenCV的版本號。
我們知道,OpenCV是基於C/C++的,”cv”和”cv2”表示的是底層CAPI和C++API的區別,”cv2”表示使用的是C++API。
這主要是一個歷史遺留問題,是為了保持向後相容性。
PIL是一個模組,如果執行的過程中提示你缺少模組的時候你就要安裝一個模組了,其餘同理,就不再說了。
另外在函式Catchusbvideo中,第二個引數指的是你電腦的攝像頭的編號,例如是0,1,2等,如果0不行的話,試一下1。
在下邊的人臉識別分類器中是我自己下載的opencv,下載網站是:https://opencv.org/releases.html,如果你是windows選擇對應版本就好,還有就是“H:\\OpenCV\\opencv\\build\\etc\\haarcascades\\haarcascade_frontalface_alt2.xml”這是我安裝的一個路徑,你也要找到這個路徑並且複製到程式中,這個東西的作用主要是實現對人臉識別的功能,在安裝中還有其他的功能,我也一併列在下面:
人臉檢測器(預設):haarcascade_frontalface_default.xml
人臉檢測器(快速Harr):haarcascade_frontalface_alt2.xml
人臉檢測器(側視):haarcascade_profileface.xml
眼部檢測器(左眼):haarcascade_lefteye_2splits.xml
眼部檢測器(右眼):haarcascade_righteye_2splits.xml
嘴部檢測器:haarcascade_mcs_mouth.xml
鼻子檢測器:haarcascade_mcs_nose.xml
身體檢測器:haarcascade_fullbody.xml
人臉檢測器(快速LBP):lbpcascade_frontalface.xml
另外,如果我們想構建自己的分類器,比如識別火焰、汽車,數,花等,我們依然可以使用OpenCV訓練構建。
這個函式完成對人臉的識別以及用一個框框給框起來,其中grey是要識別的影象資料,轉化為灰度可以減少計算量。
scaleFactor:影象縮放比例,可以理解為同一個物體與相機距離不同,其大小亦不同,必須將其縮放到一定大小才方便識別,該引數指定每次縮放的比例。
minNeighbors:對特徵檢測點周邊多少有效點同時檢測,這樣可避免因選取的特徵檢測點太小而導致遺漏。
minSize:特徵檢測點的最小值。
對同一個畫面有可能出現多張人臉,因此,我們需要用一個for迴圈將所有檢測到的人臉都讀取出來,然後逐個用矩形框框出來,這就是接下來的for語句的作用。
Opencv會給出每張人臉在影象中的起始座標(左上角,x、y)以及長、寬(h、w),我們據此就可以截取出人臉。
其中,cv2.rectangle()完成畫框的工作,在這裡外擴了10個畫素以框出比人臉稍大一點的區域。
cv2.rectangle()函式的最後兩個引數一個用於指定矩形邊框的顏色,一個用於指定矩形邊框線條的粗細程度。
執行結果:
好,看來可以順利的識別出視訊中的臉,搞定!但是我們想做的是識別這個人臉是誰的,這僅僅能識別這是誰的臉,完全不能滿足我們的渴望,接下來我們進行下一步!
2.模型訓練
模型訓練的目的是讓電腦知道,這個臉的特徵是什麼,從而可以在視訊流中識別。
在訓練之前必須先準備足夠的臉部照片作為機器學習的資料。
2.1準備機器學習的資料
所謂機器學習就是給程式投喂足夠多的資料,資料越多,準確度和效率也會越高。
要想識別出這張人臉屬於誰,我們肯定需要大量的自己的臉和別人的臉,這樣才能區別開。
然後將這些資料輸入到Tensorflow中建立我們自己臉的模型。
1.keras簡介
上面提到的日本小哥利用深度學習庫keras來訓練自己的人臉識別模型。
我這裡找到一篇keras的中文文件可能對你有些幫助。
另外關於Keras, Keras是由純python編寫的基於theano/tensorflow的深度學習框架。
Keras是一個高層神經網路API,支援快速實驗,能夠把你的idea迅速轉換為結果,如果有如下需求,可以優先選擇Keras:
a)簡易和快速的原型設計(keras具有高度模組化,極簡,和可擴充特性)
b)支援CNN和RNN,或二者的結合
c)無縫CPU和GPU切換
Keras的模組結構:
使用Keras搭建一個神經網路:
資料格式(data_format):
目前主要有兩種方式來表示張量:
a)th模式或channels_first模式,Theano和caffe使用此模式。
b)tf模式或channels_last模式,TensorFlow使用此模式。
因為我裝的是tensorflow因此我直接使用了keras的Tensorflow版,同時,為了驗證其它深度學習庫的效率和準確率,我還使用了Theano,利用CNN——卷積神經網路來訓練我的人臉識別模型。
本節專注把訓練資料準備好。
完整程式碼如下:
importcv2
importsys
fromPILimportImage
defCatchPICFromVideo(window_name,camera_idx,catch_pic_num,path_name):
cv2.namedWindow(window_name)
#視訊來源,可以來自一段已存好的視訊,也可以直接來自USB攝像頭
cap=cv2.VideoCapture(camera_idx)
#告訴OpenCV使用人臉識別分類器
classfier=cv2.CascadeClassifier("H:\\OpenCV\\opencv\\build\\etc\\haarcascades\\haarcascade_frontalface_alt2.xml")
#識別出人臉後要畫的邊框的顏色,RGB格式
color=(0,255,0)
num=0
whilecap.isOpened():
ok,frame=cap.read()#讀取一幀資料
ifnotok:
break
grey=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)#將當前楨影象轉換成灰度影象
#人臉檢測,1.2和2分別為圖片縮放比例和需要檢測的有效點數
faceRects=classfier.detectMultiScale(grey,scaleFactor=1.2,minNeighbors=3,minSize=(32,32))
iflen(faceRects)>0:#大於0則檢測到人臉
forfaceRectinfaceRects:#單獨框出每一張人臉
x,y,w,h=faceRect
#將當前幀儲存為圖片
img_name='%s/%d.jpg'%(path_name,num)
image=frame[y-10:y+h+10,x-10:x+w+10]
cv2.imwrite(img_name,image)
num+=1
ifnum>(catch_pic_num):#如果超過指定最大儲存數量退出迴圈
break
#畫出矩形框
cv2.rectangle(frame,(x-10,y-10),(x+w+10,y+h+10),color,2)
#顯示當前捕捉到了多少人臉圖片了,這樣站在那裡被拍攝時心裡有個數,不用兩眼一抹黑傻等著
font=cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(frame,'num:%d'%(num),(x+30,y+30),font,1,(255,0,255),4)
#超過指定最大儲存數量結束程式
ifnum>(catch_pic_num):break
#顯示影象
cv2.imshow(window_name,frame)
c=cv2.waitKey(10)
ifc&0xFF==ord('q'):
break
#釋放攝像頭並銷燬所有視窗
cap.release()
cv2.destroyAllWindows()
if__name__=='__main__':
iflen(sys.argv)!=1:
print("Usage:%scamera_idface_num_maxpath_name\r\n"%(sys.argv[0]))
else:
CatchPICFromVideo("擷取人臉",0,1000,'C:\\Users\\Administrator\\Desktop\\Python\\data\\liziqiang')
這段程式碼我們只是在前面程式碼的基礎上增加臉部影象儲存功能,比較簡單。
defCatchPICFromVideo(window_name,camera_idx,catch_pic_num,path_name):
在函式定義中,幾個引數,反別是視窗名字,攝像頭系列號,捕捉照片數量,以及儲存路徑。
根據自己需要進行修改,咱們這裡為了精度高一點,選擇捕捉1000張臉部照片。
在你捕捉的時候由於精度的問題,會捕捉許多非臉部的照片,這時候需要你將不是臉部的照片清洗掉,使資料更加準確。
另外,我們還需要捕捉另一個人的圖片來提高模型的準確度。
然後儲存到另一個資料夾下,注意,一個人的照片儲存到一個資料夾下,不可弄混。
截圖完成,就像下圖這樣。
好了,經過前面的資料蒐集,咱們已經差不多準備了2000張照片,準備工作已經做好,下面我們將進行資料模型的訓練!
2.模型訓練
訓練程式建立了一個包含4個卷積層的神經網路(CNN),程式利用這個網路訓練我的人臉識別模型,並將最終訓練結果儲存到硬碟上。
在我們實際動手操練之前我們必須先弄明白一個問題——什麼是卷積神經網路(CNN)?
想知道你可以谷歌,另外有關神經網路我會另外寫一篇部落格。
這裡就不多做介紹了。
首先建立一個python檔案,命名load_dataset。
程式碼如下:
importos
importsys
importnumpyasnp
importcv2
IMAGE_SIZE=64
#按照指定影象大小調整尺寸
defresize_image(image,height=IMAGE_SIZE,width=IMAGE_SIZE):
top,bottom,left,right=(0,0,0,0)
#獲取影象尺寸
h,w,_=image.shape
#對於長寬不相等的圖片,找到最長的一邊
longest_edge=max(h,w)
#計算短邊需要增加多上畫素寬度使其與長邊等長
ifh
希望能幫到你!
有什麼問題我會盡量回答!
相關文章
利用python、tensorflow、opencv實現人臉識別(包會)!
Python調用OpenCV實現人臉識別
使用opencv實現人臉識別及人眼識別
25行Python代碼實現人臉識別——OpenCV技術教程
使用face-api.js實現人臉識別(一)
ubuntu16.04配置opencv實現人臉識別
程式碼C++,opencv實現人臉識別,人臉檢測,人臉匹配,視訊中的人臉檢測,攝像頭下的人臉檢測等
OpenCV3計算機視覺Python語言實現人臉識別筆記
opencv實現人臉識別
python三步實現人臉識別
手把手教你如何用OpenCV+Python實現人臉識別
Python3利用Dlib19.7實現人臉檢測和剪下
使用OpenCV+Python實現人臉識別
TensorFlow實現人臉識別(5)-------利用訓練好的模型實時進行人臉檢測
OpenCV+Python實現人臉識別
分類導航
HTML/CSS
HTML教程
HTML5教程
CSS教程
CSS3教程
JavaScript
JavaScript教程
jQuery教程
Node.js教程
服務端
Python教程
Python3教程
Linux教程
Docker教程
Ruby教程
Java教程
JSP教程
C教程
C++教程
Perl教程
Go教程
PHP教程
正則表達式
資料庫
SQL教程
MySQL教程
PostgreSQL教程
SQLite教程
MongoDB教程
Redis教程
Memcached教程
行動端
IOS教程
Swift教程
Advertisement
三度辭典
Copyright©2016-2021IT閱讀
Itread01.comAllRightsReserved.
0.001291036605835
延伸文章資訊
- 1用Python實現簡單的臉部辨識,10分鐘搞定!(附原始碼)
Python裡,簡單的臉部辨識有很多種方法可以實現,依賴於python膠水語言的特性,我們通過呼叫包可以快速準確的達成這一目的。這裡介紹的是準確性比較高的 ...
- 2理解優缺點及應用概況人臉辨識簡易實作動手玩
人臉辨識技術的出現,使人們的生活方式大幅改變,新技術的問世雖然帶來了便利,但是也無法阻止那伴隨而來的問題,本文將透過Python程式語言和OpenCV ...
- 3利用python、tensorflow、opencv實現人臉識別(包會)!
利用python、tensorflow、opencv實現人臉識別(包會)! ... 本人通過網上資料的查詢發現這類人臉識別,大多參考了一位日本程式設計師小哥的文章。
- 4[Day13] 使用OpenCV & Dlib作人臉偵測需要知道的一些事
[Computer Vision] 電腦視覺下的人臉系列第13 篇 ... 如果今天要做的只是人臉偵測或是人臉辨識,那你可以很安心的使用你喜歡的方法。
- 5Python影像辨識筆記(一):使用Open CV辨識圖片及影片中的人臉
圖片人. “Python影像辨識筆記(一):使用Open CV辨識圖片及影片中的人臉” is published by Yanwei Liu.