利用python、tensorflow、opencv實現人臉識別(包會)!

文章推薦指數: 80 %
投票人數:10人

利用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) #計算短邊需要增加多上畫素寬度使其與長邊等長 ifh0: forfaceRectinfaceRects: x,y,w,h=faceRect #擷取臉部影象提交給模型識別這是誰 image=frame[y-10:y+h+10,x-10:x+w+10] faceID=model.face_predict(image) #如果是“我” iffaceID==0: cv2.rectangle(frame,(x-10,y-10),(x+w+10,y+h+10),color,thickness=2) #文字提示是誰 cv2.putText(frame,'liziqiang', (x+30,y+30),#座標 cv2.FONT_HERSHEY_SIMPLEX,#字型 1,#字號 (255,0,255),#顏色 2)#字的線寬 else: pass cv2.imshow("識別朕",frame) #等待10毫秒看是否有按鍵輸入 k=cv2.waitKey(10) #如果輸入q則退出迴圈 ifk&0xFF==ord('q'): break #釋放攝像頭並銷燬所有視窗 cap.release() cv2.destroyAllWindows() 好,最終實現的結果就是文章開頭的時候的效果。

希望能幫到你! 有什麼問題我會盡量回答! 相關文章 利用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



請為這篇文章評分?