結果展示
最近嘗試做了下人臉檢測,先上兩張效果圖吧:
這已經是跳出來的效果比較好的圖檔了,表現的确是有點差。
我用了4000(19*19)多張人臉圖檔和8000(19*19)多張非人臉圖檔訓練出了這個卷積模型。這個資料量确實有點少,是以效果不太好也是可以了解的。主要還是分享做人臉檢測的經曆。但是,我還是相信隻要給我充分的資料,我也可以訓練出高品質的模型。
FaceDetector
源碼我已經上傳到Github了,感興趣的歡迎下載下傳,點贊的感謝萬分!!!!
位址:FaceDetector
和代碼一起上傳的,還有訓練使用的資料(face_detection.bin),它是一個二進制檔案,制作過程和讀取過程請參考前面一篇部落格:
自己制作機器學習訓練和測試使用的二進制資料集(C++)
當然,在FaceDetector項目中我用java重寫了讀取二進制檔案的部分代碼。
FaceDetector中使用的卷積神經網絡是我之前自己寫的CupCnn,請參考我之前的部落格:
java寫卷積神經網絡—CupCnn簡介
有了卷積神經網絡,有了資料,接下來做的事情和訓練mnist差不多了。
訓練完成後,建構圖像金字塔,然後掃描圖像金字塔,從中尋找人臉。
FaceDetector工程圖如下:
cupcnn包下是卷積神經網絡的實作。
face包下是人臉檢測的實作。
BinaryDatasetReader.java —-從二進制資料集中讀取圖檔和标簽
FaceInfo.java —– 記錄人臉的位置,是人臉的機率
FaceNetwork.java —- 搭建人臉檢測神經網絡
ImageGui.java —– 顯示圖檔
ScanImagePyramid —– 建構圖像金字塔并在金字塔上搜尋人臉
FaceDetectorTest —– main函數入口。
public static void main(String[] args) {
// TODO Auto-generated method stub
System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
//if you want train nework,Uncomment the following code
//trainFaceNetwork();
//if you want test,Uncomment the following code
testFaceDetector();
}
如果想訓練,就調用trainFaceNetwork()方法,如果要測試,請調用testFaceDetector();
依賴
為了友善讀取圖檔,建構圖像金字塔,項目使用opencv庫。如果您對配置Opencv不熟悉,請參考下面的步驟:
下面内容引用自 OpenCV For Java環境搭建與功能示範一文
交流
如果在使用這個FaceDetector的過程中遇到問題,或者對機器學習感興趣,歡迎加入下面的QQ群讨論交流:
機器學習 QQ交流群:704153141