opencv+mtcnn+facenet+python+tensorflow 實現實時人臉識別

opencv+mtcnn+facenet+python+tensorflow 實現實時人臉識別

Abstract:本文記錄了在學習深度學習過程當中,使用opencv+mtcnn+facenet+python+tensorflow,開發環境爲ubuntu18.04,實現局域網鏈接手機攝像頭,對目標人員進行實時人臉識別,效果並不是特別好,會繼續改進html

這裏是python

若是各位老爺看完以爲對你有幫助的話,請給個小星星,3qlinux

Instruction

當前時間距facenet論文發佈已有三年,網上對於facenet的解讀也有許多,但卻也找不到什麼能修修改改就能用的代碼,因此本文就此而生,將會系統的介紹在CNN在圖像識別方向-人臉識別,我會把我遇到的一切問題以及看法都陸續的補充在本文中,並會附上項目地址,保證各位官人看的開心。git

所用工具簡介

  • opencv頗有名了,在本次項目中用到的固然是它的強大的圖片處理能力了,大概就是讀取、寫入、鏈接手機攝像頭一些了
  • mtcnn是一個用來檢測圖片中人臉位置(人臉檢測)的深度學習模型,其使用了三個卷積網絡實現了對圖像中人臉的檢測,在文章後面再具體的介紹其實現的細節
  • facenet是谷歌的一篇頗有名的論文和開源項目,其實現了將輸入的人像最終轉換爲shape爲1*128的向量,而後經過計算不一樣照片之間的歐幾里得距離來判斷他們的類似度,固然其中還包含許多技巧以及創新的想法,最終的在lfw(一個頗有名的人臉數據庫)準確率達到99%+++,在文章的後面我會盡量的解讀其論文和代碼中的有意思的想法
  • tensorflow應該很熟悉了(否則你是怎麼搜到個人這篇文章的?) 學習深度學習的應該都知道存在各類各樣的方便於搭建網絡的框架,tensorflow就是其中頗有名的一個,由google開源,功能強大

正式開始前的一些廢話,防止看官老爺在後面麋鹿~

你確定已經或多或許對機器學習或者是深度學習有些瞭解,因此你應該知道整個項目的過程無非就是github

  1. 使用現有的幾大框架搭建網絡(固然不排除是使用matlab本身手動實現)
  2. 喂數據而且調參,最終獲得心儀的模型
  3. 保存模型,部署模型使用

由於如今我還處於菜鳥階段,有幸搭建過的幾個網絡無非是吳恩達老師課程中的幾個淺層網絡,實現了一些非主流功能,還有的就是google官方的一些教學例子,總之都是些幫助鞏固知識,可是沒什麼luan用的,若是想要做出比較吊的東西仍是須要使用大公司和大神開源的一些模型,「嫁接」過來,改改,又不能不能用......真香算法

github上開源的一些項目以及一些大公司開源的項目,其項目文件通常包含 網絡的搭建 網絡的測試等文件,其訓練好的模型每每比較大,須要另到他出下載,當咱們有了一個項目的想法之後,並肯定了要用哪些項目時候,切記幾件事,否則後面會很影響效率數據庫

  1. 對模型的實現原理有必定的瞭解
  2. 對其輸入輸出的數據格式有很完善的瞭解
  3. 本身要有本身的思考,否則全是單純的接受會讓你喪失了對整個項目全貌的認識,若是這樣,接下來就是痛苦時間了(想一想初高中古詩、文言文、散文、詩歌爲啥那麼熬人,如今偶爾看到的時候,都是woc,這文章寫的牛逼,但是爲啥當時我咋那麼痛苦呢?),這都是被動接受,在學習以前不肯意全局掌控的過,若是有看過這篇文章,後來沒有這樣作遇到頭疼問題的同志,問你個問題,知道大鵝仲麼叫咩?GAI!!!

ok,廢話說完,開工ubuntu

opencv

鏈接手機攝像頭,並經過其一些小函數,對圖片進行一些簡單的處理,手機上要下載一個appip攝像頭windows

import cv2
video="http://admin:admin@192.168.0.107:8081/" #此處@後的ipv4 地址須要修改成本身的地址
# 參數爲0表示打開內置攝像頭,參數是視頻文件路徑則打開視頻
capture =cv2.VideoCapture(video)

# 建個窗口並命名
cv2.namedWindow("camera",1)

# 用於循環顯示圖片,達到顯示視頻的效果
while True:
    ret, frame = capture.read()
    
    # 在frame上顯示test字符
    image1=cv2.putText(frame,'test', (50,100), 
                cv2.FONT_HERSHEY_COMPLEX_SMALL, 2, (255, 0 ,0), 
                thickness = 2, lineType = 2)
                
    cv2.imshow('camera',frame)
    
    # 不加waitkey() 則會圖片顯示後窗口直接關掉
    key = cv2.waitKey(3)
    if key == 27:
        #esc鍵退出
        print("esc break...")
        break

    if key == ord(' '):
        # 保存一張圖像
        num = num+1
        filename = "frames_%s.jpg" % num
        cv2.imwrite(filename,frame)

mtcnn

github上的facenet工程在實現facent的時候,爲了便於測試,mtcnn也一放在了工程文件中,在工程中的位置是align/detect_face.py ,它的參數模型也保存在align文件夾下,分別是det1.npy,det2.npy,det3.npy,它的用法即是先將網絡搭建出來,定位input中的人臉的位置,而後返回本身設置的固定大小的臉部crop,而後再將其輸入facenet就ok了(做用就是人臉檢測+定位+對齊,由於咱們首要目的是讓工程能跑起來,而且對其有一個大致的認識,這才方便後面的學習,具體的實現原理和代碼解讀,以及物體的檢測發展歷史,目前的發展方向,各類檢測的算法,我會在文章的後面細說)服務器

facenet

facenet.py直接放在主目錄下了,其主實現的功能是搭建網絡,而後從模型中加載參數,接收固定大小的剪裁好的人臉照片,最終通過embeding層輸出1*128的臉部特徵向量,計算不一樣臉部照片的類似度時候直接計算向量的歐式距離就ok了,同一我的的照片,它們的差值比較小,不一樣的人差值會比較大,其中facenet最後使用的是triplet loss方法來微調embeding(具體的論文算法,網絡搭建,各類算法,以及代碼解讀我都放在文章的最後再說)

工程文件說明(readme)

### 目錄結構

2018-08-07 13-42-33屏幕截圖.png

2018-08-07 14-19-28屏幕截圖.png

  • 20170512-110547文件夾是facent的模型,官方存放在google網盤上了(並且如今出來2018的預訓練模型了),不方便下載的我一下子會把用到的大文件打包放在堅果雲上
  • align文件中包含三個mtcnn要用到的模型,以及搭建mtcnn網絡的文件 detect_face.py,這裏面的東西在facenet的項目中的均可以找到
  • models中存放的是訓練好的knn模型,用於測試使用的簡單模型,一下子展現的效果也是由其完成
  • train_dir 顧名思義,就不解釋了
  • facenet.py就是一直在談的東西,其中包含了如何搭建facenet網絡,以及計算的內容
  • test.py train_knn.py temp_test.py imageconvert.py這幾個文件分別人臉識別測試訓練knn模型 遇到問題是精簡代碼調試使用圖像批量轉化 用於準備數據集 其餘的沒有談及的文件都沒有使用到,應該是之前測試時候忘記刪除的

運行效果

2018-08-07 13-22-35 的屏幕截圖.png

這是使用手機攝像頭拍攝ipad從網上隨便搜來的合照進行測試(也許也不是隨便搜的...),可以準確將人臉框出,並進行識別,由於我使用的是knn訓練的,而這幾我的是未通過特殊訓練的,因此將其歸結爲未知人羣,再接下來一段時間會對其進行改進,最終效果應該是能夠實現單張圖片數據庫比對,這樣就不用對須要識別的目標每個都訓練一遍了,這也是人臉識別要達到的效果,上面所說的triplet loss就是一種很好的方法

2018-08-07 14-44-23 的屏幕截圖.png

由於房間光線比較暗,用手機攝像頭拍攝之前的自拍,識別成功

運行環境和運行說明

  1. 推薦使用Anaconda配置tensorflow環境(由於本項目就是基於tensorflow框架的),是cpu版本(等新卡,其實就是窮...)網上教程不少,也很簡單,本環境的python版本是3.6的,若是你的是2.7的話,那就要改不少東西了(跟着報錯改就ok),但何不如再安裝個3.6的呢,在anaconda下真的是超級方便
  2. 編輯器用的是vscode,從windows轉來,習慣使用vscode,真的很好用,在安裝anaconda的時候會提示你是否裝個vscode的,固然使用其餘的也很好
  3. 一些依賴庫固然是必備的,提示少啥裝啥吧,我也忘了,反正那些基本的是要裝的,好比numpy maplotlib jupyter scikit-image librosa kersa 這些,安裝也很簡單,在anaconda裏安裝 使用conda命令 或者若是你的linux的默認python就是anaconda裏的,直接使用pip安裝就行了
  4. 本項目裏的幾個運行的代碼,我都寫好了參數,直接運行便可(固然制定文件要在指定位置) 運行順序是

    1. 準備好本身的訓練集 幾十張本身照片便可(尺寸要小一點的,最好500*500如下,否則速度慢,精度低),放到train_dir/pic_me 文件夾下面,把我打包文件裏的pic_others文件夾中的放到指定train_dir/pic_others下面(這部分數據也能夠本身準備,個人數據是來自lfw中的前幾百張圖片)
    2. 運行train_knn.py 獲得本身的knn模型
    3. 運行test.py (記得要把手機上的ip攝像頭app打開,點擊下面打開IP攝像頭服務器 ,並檢查下顯示的局域網ip和test.py 中的是否相同,如不相同,改一下)
    4. 啓動的時候會比較慢,30s到一分鐘左右,取決於電腦性能

至此你應該已經成功跑起來這個項目了,在此感謝開源的偉大,讓咱們能感覺到這些神奇的算法

閱讀代碼和重構項目建議

好學的各位爺確定是要將代碼好好看一通的,由於我也是菜雞,看到拙劣之處,請會心一笑...

代碼思路

  1. 使用mtcnn截取視頻幀中人像的人臉,並拉伸爲固定大小(這裏爲160*160,由使用的facenet網絡所受限)
  2. 將上一步驟獲得的人臉輸入facenet,獲得embedding層的輸出,一我的像對應一個1*128數據,而後將其輸入knn網絡,獲得預測結果

學習思路

  1. 必定必定要搞清楚其中的數據流是以什麼樣的格式和形式在傳遞,其中大多數使用的都是numpy.ndarray數據類型,此外便要掌握一些基本的此類數據類型的格式轉換函數,並熟記,很經常使用的,還有就是和list 的轉換
  2. 掌握一點點opcv的讀寫函數
  3. 掌握一些對文件操做的函數

至此,你應該已經很容易的就可以吃透本項目的內容了,讀完下面的論文和各類算法的衍生,相信你必定對計算機視覺會有更加深入的認識,而且會以爲豁然開朗~

接下來的暑假時間我要去玩玩其餘的方向了,好比NLP啥的,好像很火,找工做簡歷裏仍是有幾個項目好,以前說好的解讀,我會在晚上打完遊戲的時候寫,畢竟一天沉澱的時間,我保證確定會寫的,各位爺,白了個白

mtcnn

關於物體檢測的牛逼好文 基於深度學習的目標檢測

Selective Search中如何選擇初始時Bounding Box區域合併原理

Bounding Box如何調整邊框迴歸(Bounding Box Regression)詳解

圖文並茂詳細介紹的目標檢測重大發展的paper原理基於深度學習的目標檢測技術演進

facenet

參考文章

相關文章
相關標籤/搜索