Abstract:本文記錄了在學習深度學習過程當中,使用opencv+mtcnn+facenet+python+tensorflow,開發環境爲ubuntu18.04,實現局域網鏈接手機攝像頭,對目標人員進行實時人臉識別,效果並不是特別好,會繼續改進html
這裏是python
若是各位老爺看完以爲對你有幫助的話,請給個小星星,3qlinux
當前時間距facenet論文發佈已有三年,網上對於facenet的解讀也有許多,但卻也找不到什麼能修修改改就能用的代碼,因此本文就此而生,將會系統的介紹在CNN在圖像識別方向-人臉識別,我會把我遇到的一切問題以及看法都陸續的補充在本文中,並會附上項目地址,保證各位官人看的開心。git
你確定已經或多或許對機器學習或者是深度學習有些瞭解,因此你應該知道整個項目的過程無非就是github
由於如今我還處於菜鳥階段,有幸搭建過的幾個網絡無非是吳恩達老師課程中的幾個淺層網絡,實現了一些非主流功能,還有的就是google官方的一些教學例子,總之都是些幫助鞏固知識,可是沒什麼luan用的,若是想要做出比較吊的東西仍是須要使用大公司和大神開源的一些模型,「嫁接」過來,改改,又不能不能用......真香算法
github上開源的一些項目以及一些大公司開源的項目,其項目文件通常包含 網絡的搭建 網絡的測試等文件,其訓練好的模型每每比較大,須要另到他出下載,當咱們有了一個項目的想法之後,並肯定了要用哪些項目時候,切記幾件事,否則後面會很影響效率數據庫
ok,廢話說完,開工ubuntu
鏈接手機攝像頭,並經過其一些小函數,對圖片進行一些簡單的處理,手機上要下載一個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)
github上的facenet工程在實現facent的時候,爲了便於測試,mtcnn也一放在了工程文件中,在工程中的位置是align/detect_face.py
,它的參數模型也保存在align文件夾下,分別是det1.npy,det2.npy,det3.npy
,它的用法即是先將網絡搭建出來,定位input中的人臉的位置,而後返回本身設置的固定大小的臉部crop,而後再將其輸入facenet就ok了(做用就是人臉檢測+定位+對齊,由於咱們首要目的是讓工程能跑起來,而且對其有一個大致的認識,這才方便後面的學習,具體的實現原理和代碼解讀,以及物體的檢測發展歷史,目前的發展方向,各類檢測的算法,我會在文章的後面細說)服務器
facenet.py直接放在主目錄下了,其主實現的功能是搭建網絡,而後從模型中加載參數,接收固定大小的剪裁好的人臉照片,最終通過embeding層輸出1*128的臉部特徵向量,計算不一樣臉部照片的類似度時候直接計算向量的歐式距離就ok了,同一我的的照片,它們的差值比較小,不一樣的人差值會比較大,其中facenet最後使用的是triplet loss方法來微調embeding(具體的論文算法,網絡搭建,各類算法,以及代碼解讀我都放在文章的最後再說)
### 目錄結構
detect_face.py
,這裏面的東西在facenet的項目中的均可以找到train_dir
顧名思義,就不解釋了facenet.py
就是一直在談的東西,其中包含了如何搭建facenet網絡,以及計算的內容test.py
train_knn.py
temp_test.py
imageconvert.py
這幾個文件分別人臉識別測試
、 訓練knn模型
、 遇到問題是精簡代碼調試使用
、 圖像批量轉化 用於準備數據集
其餘的沒有談及的文件都沒有使用到,應該是之前測試時候忘記刪除的
這是使用手機攝像頭拍攝ipad從網上隨便搜來的合照進行測試(也許也不是隨便搜的...),可以準確將人臉框出,並進行識別,由於我使用的是knn訓練的,而這幾我的是未通過特殊訓練的,因此將其歸結爲未知人羣,再接下來一段時間會對其進行改進,最終效果應該是能夠實現單張圖片數據庫比對,這樣就不用對須要識別的目標每個都訓練一遍了,這也是人臉識別要達到的效果,上面所說的triplet loss就是一種很好的方法
由於房間光線比較暗,用手機攝像頭拍攝之前的自拍,識別成功
本項目裏的幾個運行的代碼,我都寫好了參數,直接運行便可(固然制定文件要在指定位置) 運行順序是
train_knn.py
獲得本身的knn模型test.py
(記得要把手機上的ip攝像頭app打開,點擊下面打開IP攝像頭服務器
,並檢查下顯示的局域網ip和test.py
中的是否相同,如不相同,改一下)至此你應該已經成功跑起來這個項目了,在此感謝開源的偉大,讓咱們能感覺到這些神奇的算法
好學的各位爺確定是要將代碼好好看一通的,由於我也是菜雞,看到拙劣之處,請會心一笑...
代碼思路
學習思路
至此,你應該已經很容易的就可以吃透本項目的內容了,讀完下面的論文和各類算法的衍生,相信你必定對計算機視覺會有更加深入的認識,而且會以爲豁然開朗~
接下來的暑假時間我要去玩玩其餘的方向了,好比NLP啥的,好像很火,找工做簡歷裏仍是有幾個項目好,以前說好的解讀,我會在晚上打完遊戲的時候寫,畢竟一天沉澱的時間,我保證確定會寫的,各位爺,白了個白
關於物體檢測的牛逼好文 基於深度學習的目標檢測
Selective Search中如何選擇初始時Bounding Box區域合併原理
Bounding Box如何調整邊框迴歸(Bounding Box Regression)詳解
圖文並茂詳細介紹的目標檢測重大發展的paper原理基於深度學習的目標檢測技術演進
參考文章