1. 程式人生 > >利用Python、openCV打造自己的人臉識別AI系統

利用Python、openCV打造自己的人臉識別AI系統

Get your hands dirty     

        如果要真正理解一個東西,我們必須要能夠把它創造出來。動手去做,永遠比被動地聽有用。本文介紹了我自己動手做的一種基於卷積神經網路的人臉識別系統,以python

為語言基礎,綜合應用了kerasopencvnumpysklearn等多種技術。程式碼位置:

https://github.com/jerry1900/faceRecognition.git

先看效果(感謝夫人賞臉出境):

 


開始準備

       選用語言Python,時下入門機器學習成本最低、學習速度最快的語言,python搞網路爬蟲也很靠譜運用的技術有 opencv

(攝像頭、圖片處理),numpy(圖片數字化),os(檔案的操作和處理),keras(構建神經網路進行影象識別)。

       硬體條件很簡單,windows普通筆記本+普通攝像頭即可搞定。

參考基礎

        https://github.com/Hironsan/BossSensor 本文的程式碼很多參考了之前這個日本工程師寫的demo,主體應用的技術是差不多的,但是有一些不同:

1. 識別人臉的可擴充套件性。原有的demo只能識別一個人(他老闆),新的demo在資料集的擴充套件性上有修改,理論上可以識別無數人的臉,只要你有足夠多的資料;

2.神經網路設計更加簡單。新的demo在卷積神經網路的設計上比原有的卷積神經網路更加簡單和容易理解,沒有搞得那麼複雜,更加適合入門;

3. 程式碼結構更清晰。程式設計更加模組化,把能拆分出來的儘量拆分出來,基本上每個檔案都可以單獨拿出來測試和使用;

4詳盡的中文註釋。你可以看很詳細很詳細的中文註釋、不用看日文和英文的註釋了......

Step 1  環境配置

       環境配置這塊,網上的資料非常多,總體來說我給大家的建議是:使用整合python環境  Anaconda,裡面已經集成了很多有用的安裝包比如說numpyscipy,免去了自己配置的痛苦;通過Anaconda安裝新的計算包也非常方便,具體就不再贅述了,網上可以找到很多教程,多百度、多Google。我可以再提醒一句的是,好像Anacondatheano

還有tensorflow的包都有點小問題,需要刪瞭然後重新下載配置,網上也有教程。

簡而言之,使用Anaconda,安裝好必要的科學計算包:numpy,scipy,sklearn,keras,opencv。貼一個別人的環境配置教程,僅供參考:

http://machinelearningmastery.com/setup-python-environment-machine-learning-deep-learning-anaconda/

Step 2 獲得訓練資料集

       第二步就是要獲得資料訓練集,你可以從網上找訓練集,也可以用自己或者朋友的照片來做素材(順手練習下opencvos),具體操作辦法:

開啟pick_face.py 這個程式,裡面有一個函式readPicSaveFace(sourcePath,objectPath,*suffix)sourcePath是儲存影象源的資料夾,objectPath是儲存識別出的人臉的資料夾,看這個函式的備註:


寫的是不是很清楚,具體使用如下:


前面是你儲存原始檔圖片的資料夾地址,後面那個是你儲存剪裁好、處理好的人臉圖片的地址,最後是原始檔圖片的格式(檔案字尾)。

通過這個函式你就可以很方便地把各種圖片中的人臉給扣出來並儲存下來了。像我的人臉就放在了“D:\myProject\pictures\dataset\jerry”這個資料夾中,如下所示:

 

Step 3 構建模型和進行模型訓練

        當你建立好你的的資料集之後,應該會有一個dataset的總資料夾,dataset下會分幾個資料夾,你想讓你的模型識別幾張人臉就建立幾個子資料夾,每個子資料夾裡面應該有至少幾十張格式一致的照片(訓練素材越多越好)。然後進入train_model.py,輸入你的資料集地址,我的資料集地址是“D:\myProject\pictures\dataset”,然後建立模型、讀取訓練集、訓練模型、評估模型,最後儲存模型:


        關於CNN模型的介紹我就不展開了,具體我推薦一個哥們的視訊教程叫莫煩python,講的很細,一步一步的,教的非常好,大家可以去優酷上搜索。如果要看最詳細的CNN的原理介紹,我推薦這個:http://cs231n.github.io/ 。本課程的主講人是李飛飛,什麼?你不知道誰是李飛飛?

訓練好的模型會儲存在Model這個類中寫死的一個固定位置中:


Step 4 開啟攝像頭驗證模型效果

          模型訓練好之後,開啟read_camera.py,這個檔案中有一個Camera_reader的類,在模型初始化的時候就載入你之前訓練好的模型:


         然後在建立一個Camera_reader的例項之後呼叫build_camera()的方法,該方法開啟攝像頭,並對視訊流中讀取到的人臉交給model進行識別:


模型的predict()函式會返回兩個引數,第一個是概率最高的label的index,第二個引數為對應概率,我們會對概率進行下判定,如果高於70%我們就認為模型是可靠的(這個值自己可以調整觀察帶來的影響),可以顯示具體的label,反之我們認為識別出的人臉是一個Stranger。

總結

         這個我自己搭建出的人臉識別系統是具有自己學習能力的,你給它喂的資料越多,它就可以識別越多的人而且準確度會不斷提高,希望大家可以自己測試和研究。這個demo也有幾個問題需要提醒大家:

         1. 模型有過擬合的問題。在訓練的時候如果epoch太高,會發現accuray雖然逐步提高甚至到達95%以上,但是實際test的準確度要比training的時候低很多,這個就說明模型出現了過擬合的問題。解決辦法,增加樣本類別和樣本數,這個需要花費很多功夫;調整模型,但是在樣本數量比較小的時候不是很顯著。

         2. openCV的人臉識別精度還是有點問題,這個讀者可以在使用pick_face.py進行素材抓取的時候感受到,你放入的生活照片大概只有70%-80%可以讀取人臉素材出來,有的照片明明有你的臉,但是openCV認為那不是一張臉,這個就很尷尬了有沒有;關於openCV的進階可以找本書看看,我推薦機械工業出版社出的《OpenCV 3計算機視覺Python語言實現(原書第2版)》。

       。