人臉檢測、人臉對齊(MTCNN方法)
眾所眾知,嚴格定義上的人臉識別分為四個步驟:
①人臉檢測:從圖片中準確定位到人臉
②人臉矯正(對齊): 檢測到的人臉,可能角度不是很正,需要使其對齊
③對矯正後的人臉進行特徵提取
④對兩張人臉影象的特徵向量進行對比,計算相似度
這裡,我們主要是推薦步驟1和步驟2用到的一個方法,論文是
稱之為MTCNN人臉檢測演算法,同時有大神已經GitHub上開源了其基於caffe的C++ API 的原始碼,https://github.com/DaFuCoding/MTCNN_Caffe 再次感謝大神以及開源~
這個GitHub上是原始的caffe,再加上了MTCNN的部分(一個原始檔+8個訓練好的caffemodel以及deploy檔案),大家可以clone到本地從頭編譯。編譯完後,生成一個可執行檔案,路徑為 build/examples/MTSrc/MTMain.bin ,這個可執行檔案需要額外的兩個引數,第一個是上面的8個檔案所在目錄(caffe/examples/MTmodel/),第二引數就是測試圖片了。這裡我們先執行下demo,將一張圖片放到caffe目錄下(放哪都行),然後轉到caffe根目錄下,執行 ./build/examples/MTSrc/MTMain.bin /examples/MTmodel/ 1.jpg 然後很快就出結果了,檢測到人臉,以及五個特徵點(兩隻眼睛,鼻子,左嘴角和右嘴角),具體demo展示可看GitHub的步驟。
同時打印出圖片尺寸資訊,以及檢測耗時。
這個介面一次效能檢測一張圖片,以及給出每個人臉的五個特徵點,而我們除了要得到人臉外,還要進行人臉對齊,只要將對齊後的人臉送進網路才能得到更高的精度,所以,為了滿足這個要求,我對原始檔MTMain.cpp進行了修改,分為了標頭檔案以及原始檔,並且添加了一些程式碼,得到人臉框以及五個特徵點後,通道OpenCV裡的仿射變換,使之對齊,效果如下
左邊的是輸入圖片,中間是經過人臉檢測的影象,右邊的是對齊後的影象,效果還是很好的。
我把MTMain.cpp檔案進行修改後,分為了兩個檔案 MTCNN.h和MTCNN.cpp , 修改後的程式碼中,只開放了一個介面函式,呼叫十分簡單,如下:
對一張圖片,只要不斷的呼叫該函式,就可以返回對齊後的人臉了,注意這裡返回值是個圖片陣列,因為可能一張圖中有多個人臉,所以返回的也是多個人臉。//核心程式碼在這 class MTCNN{ public: MTCNN(const string& proto_model_dir); //建構函式,引數是8個caffemode、deploy檔案所在目錄路徑 //給定一張圖片,faceRects用於儲存檢測到的人臉框,函式返回所有對齊後的人臉圖片 vector<Mat> getFaceRects(const Mat& img,vector<Rect>* faceRects=NULL); 略.........
有了這個方便的介面後,大家根據自己的需求,寫個main.cpp 檔案,把程式跑起來吧~~
對了,也許有些小夥伴,不知道怎麼單獨編譯這兩個檔案生成可執行檔案,這裡提供個樣例Makefile檔案,實際路徑換上自己的,make一下就好了~
# Makefile
main.bin: main.cpp MTCNN.cpp
g++ -o main.bin main.cpp MTCNN.cpp -I /home/yourname/caffe/include -I /home/yourname/caffe/build/src/ -I /usr/local/cuda/include -L /home/yourname/caffe/build/lib -lcaffe -lglog /-boost_system -lprotobuf `pkg-config --libs --cflags opencv`
當然,如果只有CPU,可以把cuda的那個刪去,同時記得在最後加一句 -D CPU_ONLY
最後,分享下用opencv進行仿射變換的部落格
好了,接下來,自己跑起來吧~