FindFaceInVideo
這是一個人臉識別的小demo,通過待識別的人臉影像在視頻影像中找人。
Author chengstone
e-Mail [email protected]
本Demo完成于2017年3月末4月初。
代碼詳解請參見博客:http://blog.csdn.net/chengcheng1394/article/details/77817194
程式使用了VGG的模型引數,這里沒有上傳,需要你另外下載,共兩個檔案(VGG_FACE_deploy.prototxt,VGG_FACE.caffemodel)放到VGGFace目錄下。 我當時的下載地址如下: http://101.96.8.164/www.robots.ox.ac.uk/~vgg/software/vgg_face/src/vgg_face_caffe.tar.gz
下面是在圖片中找人的output:

視頻中找人的output在檔案夾out中,有4個avi檔案:https://github.com/chengstone/FindFaceInVideo/tree/master/VGGFace/out。
目錄結構:
facedetect.py:主程式,注意在使用時要將里面的路徑改寫成你本地的路徑。
face_recognition.py:提供兩個人臉特征比較的功能。 這個程式來源于https://github.com/HolmesShuan/DeepID-I-Reimplement,我做了修改,感興趣的同學可以BeyondCompare差分一下。
lfw_test_deal.py:來源于https://github.com/hqli/face_recognition。實際上好像并沒有用到,可能是我當時做測驗時用過,有點記不清了。
out檔案夾:用來存放視頻找人的輸出結果。
tmp.jpg:是在圖片中根據提供的待找人的人臉進行找人時的輸出。
以圖片檔案名命名的檔案夾:比如IMG_3588,qingyansi等檔案夾是對圖片進行人臉識別測驗時的輸出,只關注是否找到人臉,而不進行是否是我們要找的人的判斷。
chengshd檔案夾:用來存放我個人的測驗用例,包含圖片和視頻。
targets.txt:待查找人的圖片路徑串列。
positive_pairs_path.txt:是face_recognition.py的測驗資料,每行提供用于比較的兩個圖片路徑。例如:2-1.png 2-2.png。 測驗函式face_recog_test讀取每一對圖片,計算各組圖片最佳的引數:Accuracys,Thresholds,Precisions,Recalls,F1Score等。
其他檔案:基本上都是我測驗時的輸出。
程式的使用:
本程式還要用到另外一個程式,請一起下載https://github.com/chengstone/SeetaFaceEngine
本Demo分為兩個工程:SeetaFaceEngine和VGGFace。 其中SeetaFaceEngine來源于https://github.com/seetaface/SeetaFaceEngine,我們只使用其中的FaceDetection和FaceAlignment, 主要用來做待查找人圖片中的人臉檢測和定位。其中FaceAlignment/src/test/face_alignment_test.cpp我做了修改,使程式能夠以命令列的方式支持多樣化的人臉識別。 VGGFace用來做人臉的比較,這里也使用了opencv的人臉檢測,主要用于在目標圖片中的多人臉的檢測。
運行準備:
一、環境依賴,請提前安裝好:
opencv2 caffe Python2.7
二、build順序:
1.先編譯SeetaFaceEngine下面的FaceDetection,編譯方法可以參見里面的readme,大致命令是:
mkdir build
cd build
cmake ..
make
2.然后將編譯好的檔案(以我的電腦編譯好后為例是facedet_test,libseeta_facedet_lib.dylib這兩個檔案), FaceDetection的.h檔案face_detection.h,seeta_fa_v1.1.bin和seeta_fd_frontal_v1.0.bin幾個檔案拷貝到FaceAlignment的build目錄下, 然后編譯,編譯命令跟build FaceDetection一樣。
mkdir build
cd build
cmake ..
make
編譯好后的檔案名(以我的電腦編譯好后為例):fa_test
3.主要使用的就是FaceAlignment。 這個程式的命令列格式是:
第一種: fa_test 源圖片全路徑 目標保存檔案夾路徑 [圖片大小變幻的像素數]
其中[圖片大小變幻的像素數]可以省略,省略的話默認是不縮放圖片的大小。
舉例:fa_test /path/to/123.jpg /path/to/folder 32
將圖片123.jpg識別出的人臉圖片輸出到/path/to/folder檔案夾中,縮放后的尺寸是32 * 32的大小。
第二種:fa_test 保存源圖片全路徑串列的檔案路徑
其中[存源圖片全路徑串列的檔案路徑]是一個文本檔案,里面是若干行第一種命令格式的字串,用于批量識別圖片。
舉例:fa_test /path/to/image.txt
其中image.txt里面的內容類似如下內容,可以是一行也可以是多行:
/Users/chengstone/Downloads/ML/att_faces/s40/9.jpg /Users/chengstone/Downloads/ML/att_faces_new/s40 64
/Users/chengstone/Downloads/ML/att_faces/s40/8.jpg /Users/chengstone/Downloads/ML/att_faces_new/s40 64
/Users/chengstone/Downloads/ML/att_faces/s40/7.jpg /Users/chengstone/Downloads/ML/att_faces_new/s40 64
/Users/chengstone/Downloads/ML/att_faces/s40/6.jpg /Users/chengstone/Downloads/ML/att_faces_new/s40 64
這個程式有時并不能準確識別人臉。。。
第三種:fa_test
如果不傳入引數,默認在程式當前路徑下讀取image.txt檔案,檔案內的格式參見上面的說明。這個是本Demo的使用方式。
三、開始視頻/圖片找人:
主要代碼在VGGFace中的facedetect.py中。 這里使用了caffe的VGG模型用來做人臉的特征提取和特征比較。 由于我自己訓練的模型準確率太低(采用的DeepID模型,可能是我沒有實作好,而且我的訓練集也不太夠),只好使用VGG公開的模型引數。
facedetect.py的使用方法:
1.先修改VGGFace/targets.txt檔案,里面是圖片路徑的串列,每一個圖片必須只有一個人。 如果只有一個圖片意味著只找這一個人,就是我說的待查找人。多個的話就是在視頻和圖片中找多個人。
2.facedetect.py的命令列引數:
python ./facedetect.py —-content 圖片和視頻的全路徑
其中[圖片和視頻的全路徑]是我們要查找的目標。
舉例1:python ./facedetect.py —-content /path/to/123.jpg
舉例2:python ./facedetect.py —-content /path/to/456.mov
識別程序:
有個概念我解釋一下,targets.txt檔案中列出的是要找的人,可以是一個也可以是多個人。 比如是我的照片,意味著要在視頻或圖片中找出我,查找依據就是根據targets.txt檔案中我的照片查找。
例如:/home/chengshd/ML/caffe-master/examples/VGGFace/chengshd/IMG_3588.JPG
然后facedetect.py會先呼叫fa_test,將targets.txt檔案中指定人物的照片做人臉識別,就是把照片中的人臉先找出來。 facedetect.py會把呼叫fa_test所用的引數寫進fa_test同級目錄下的image.txt檔案中。
例如:/home/chengshd/ML/caffe-master/examples/VGGFace/chengshd/IMG_3588.JPG /home/chengshd/ML/caffe-master/examples/VGGFace/chengshd/IMG_3588 224
結果就是把識別出的人臉圖片放在以targets.txt檔案中待查找人的圖片檔案名作為目錄的目錄下。
例如:VGGFace/IMG_3588下:IMG_3588_crop_224_0_145_460_652_967.JPG檔案就是fa_test識別出的人臉。
接下來使用剛剛fa_test識別出的人臉,根據呼叫facedetect.py時傳入的引數,在圖片或者視頻中找人。
這里facedetect.py使用opencv的cv2.CascadeClassifier做人臉識別。
你一定會問我為什么使用兩種不同的方式識別人臉,我經過多次測驗發現cv2.CascadeClassifier和SeetaFace的人臉識別效果都不是很完美,當前這個組合還可以一用。
當然,一定有更好的方式替代當前這個人臉識別的方案。比如采用卷積神經網路的方式進行人臉識別,這個我沒有繼續深入去做。
在給定圖片或視頻中使用cv2.CascadeClassifier找出人臉,然后根據fa_test識別出的人臉圖片做特征的比較。
這里使用的是VGG的模型做的人臉特征值比較。按理說相似度越高越好,經過我的測驗,我將相似度閾值(VGG_THRESHOLD)設定成了0.4。
就是說相似度大于40%,我就認為是同一個人。這個值設的確實有點小了,奈何我用自己的照片去測驗,很少出現相似度大于85%以上的時候。。。。
但是一旦兩個人不相似,相似度很低,大都小于1%,所以0.4這個值還是堪用的。
更多內容請參考代碼,Enjoy!
uj5u.com熱心網友回復:
樓主有聯系方式么?希望指導交流一下哦轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/123800.html
標籤:人工智能技術
上一篇:2020加油吧
下一篇:防止或解除微機室控制,極域,
