1. 程式人生 > >Android SDK開發

Android SDK開發

stack exce 速度 codes class 功能 柵格 明顯 ...

目前我們的應用內使用了 ArcFace 的人臉檢測功能,其他的我們並不了解,所以這裏就和大家分享一下我們的集成過程和一些使用心得

集成

ArcFace FD 的集成過程非常簡單

在 ArcFace FD 的文檔上有說明支持的系統為 5.0 及以上系統,但其實在 4.4 系統上也是可以跑的,

if (engine == null) { // && Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {
    try {
        engine = new AFD_FSDKEngine();
        AFD_FSDKError err = engine.AFD_FSDK_InitialFaceEngine(
                "XXXX",
                "XXXX",
                AFD_FSDKEngine.AFD_OPF_0_HIGHER_EXT, 12, 3);
        if (err.getCode() != 0) {
            engine.AFD_FSDK_UninitialFaceEngine();
            engine = null;
        }
    } catch (Exception e) {
        e.printStackTrace();
        engine = null;
    }
}

我覺得 ArcFace 的優勢除了多角度檢測之外,另外一個是他的每次檢測並不是獨立,即這一次的檢測結果會指導下一次的檢測 (我猜測的->_->)

所以 ArcFace 在檢測到人臉之後,識別的時間會大幅減少,而 Seeta FD 的檢測每次都是獨立的,所以在無人臉的情況下,Seeta 的檢測速度要快於 ArcFace, 但是檢測到人臉之後,因為應用整體的計算量增加,導致 Seeta 的檢測速度降低的非常明顯,大大慢於 ArcFace, (所以二者是不是可以結合一下...)

AFD_FSDKError err = engine.AFD_FSDK_StillImageFaceDetection(
        data, width, height, AFD_FSDKEngine.CP_PAF_NV21, result);

優化 不得不說 ArcFace FD 的錯誤率是有待優化的,雖然 ArcFace 沒有提供任何可以調節的參數,但是還是可以稍微優化一下!

因為從攝像頭出來的 yuv 數據是橫向的,而 ArcFace 只有 AFD_OPF_0_HIGHER_EXT 這個擴展選項,優先檢測 0 度方向, 但是這個方向一般是沒有人臉的,所以如果直接進行檢測,我們覺得這個可能會增加檢測的錯誤率(猜的->_->),所以處理方法是將 yuv 旋轉到手機豎屏方向(當然這個操作不是直接由 CPU 來處理,而是從 Camera 的外部紋理上開始做操作)再拿去檢測,這樣會減少一點錯誤率(從用戶反饋得出),雖然錯誤率依然很高(特別對於帶柵格的物體)希望虹軟能繼續優化!

另外一個是目前 ArcFace 還沒有支持 Android 8.x 系統,所以這種情況下,我們會啟用備選的其他方案來進行人臉檢測!

最後希望虹軟能把 ArcFace 越做越好 _ 因為只有產品足夠好才會不斷的有人為你做免費宣傳

Android SDK開發