一行代碼實現人臉檢測,人臉關鍵點檢測和戴口罩檢測。

Face[] result = FaceDetectionUtil.getInstance(MainActivity.this).predictImage(bitmap);

本項目是使用Paddle Lite 的C++實現的人臉檢測,人臉關鍵點檢測和戴口罩檢測,並將編譯好的動態庫和靜態庫部署在Android應用上,在Android設備上實現人臉檢測,人臉關鍵點檢測和戴口罩檢測,所以本應不會使用到C++開發,可以只使用筆者提供的JNI接口實現這些功能。在ai這個module是筆者在開發時使用到的,讀者在使用這個項目時,完全可以刪除掉,如果是看C++實現,也可以看這個module的源碼。

源碼地址:https://github.com/yeyupiaoling/FaceKeyPointsMask

Android開發

assets目錄是存放各個模型的文件,pyramidbox.nb模式是人臉檢測,首先第一步是需要檢查人臉才能進行下一步的識別。facekeypoints.nb這個是人臉關鍵點檢測,檢測到人臉之後,通過這個模型檢測人臉關鍵點。maskclassifier.nb這個模型是口罩分類模型,檢測到人臉之後,用這個識別是否戴口罩。第一步筆者再訓練一個性別分類和年齡模型,這樣一個程序就可以同時實現人臉檢測,人臉關鍵點檢測、戴口罩檢測和性別年齡識別等5個功能。

jniLibs是存放編譯的C++代碼和Paddle Lite的動態庫,這文件雖然大,但是打包成apk之後項目會非常小。

com.yeyupiaoling.ai是存放識別功能的代碼,這個包文件不能修改,因爲裏面包含了JNI接口,跟C++代碼保持一致。PaddleNative.java就是識別的JNI接口。Face.java是C++返回結果的結構體,通過這個java bean 解析識別結果。FaceDetectionUtil.java爲識別工具類。Utils.java爲其他通用的工具方法。

使用識別

有了以上的工具類,識別就變得很容易了,就只需要以下的一行代碼即可實現識別,該方法不僅支持Bitmap格式,還可以直接使用圖片的路徑進行預測。

Face[] result = FaceDetectionUtil.getInstance(MainActivity.this).predictImage(bitmap);

識別的結果如果我想把識別結果顯示可以使用以下一行代碼,因爲預測時使用的圖片大小有等比例縮小,不能直接使用原來的Bitmap進行畫識別信息,需要使用getBitmap()獲取縮小的圖片才能正確畫預測結果。

Bitmap b = Utils.drawBitmap(FaceDetectionUtil.getInstance(MainActivity.this).getBitmap(), result);

這樣在Android上實現人臉檢測、關鍵點檢測、口罩檢測就大功告成了。

效果圖:

小夜