MTK平台Camera人脸识别算法灵敏度参数
当我们在使用MTK平台的相机时,如果默认使用MTK自带的人脸算法,可能会出现人脸识别不准确或者误识别等情况,这个问题MTK也提供了部分参数可供修改,我们接下来看一下应该如何修改。
(1)Log查看
先打开如下宏开关:
adb root
adb shell setenforce 0
adb shell setprop persist.vendor.mtk.camera.log_level 3
adb shell setprop vendor.debug.camera.log.FDNode 1
adb shell setprop vendor.debug.camera.fd.config.enable 1
adb shell setprop vendor.debug.camera.fd.enable 1
adb shell setprop vendor.debug.camera.fd.detail.log 1
adb shell setprop debug.cam.drawid 1
adb shell setprop vendor.debug.camera.log.ZoomRatioConverter 1
adb shell setprop vendor.debug.hal3av3.log 1
adb shell pkill camera*
adb logcat -G 20M
当算法识别到人脸数后 Log 中会有提示 NumFace = x,如下:
11-21 04:33:53.864 16160 16328 D MtkCam/fdNodeImp: [RunFaceDetection] status : 1, after calculateRotateDegree : 90
11-21 04:33:53.864 16160 16328 I MtkCam/fdNodeImp: [RunFaceDetection] rotatetion : 90, sensor facing : 1
11-21 04:33:53.864 16160 16328 D MtkCam/fdNodeImp: [RunFaceDetection] after calculate rot : 90
11-21 04:33:53.864 16160 16328 I MtkCam/fdNodeImp: [RunFaceDetection] FD frame timestamp : 267939140741000
11-21 04:33:53.864 16160 16328 I MtkCam/fdNodeImp: [RunFaceDetection] FD count : 199, duration : 199
11-21 04:33:53.864 16160 16328 D MtkCam/fdNodeImp: [RunFaceDetection] halFDDo In.
11-21 04:33:53.886 16160 16328 D MtkCam/fdNodeImp: [RunFaceDetection] halFDDo Out.
11-21 04:33:53.887 16160 16328 D MtkCam/fdNodeImp: [RunFaceDetection] NumFace = 2,
11-21 04:33:53.887 16160 16328 D MtkCam/fdNodeImp: [RunFaceDetection] faceArea = 762625, mFaceRatio = 0.190656
11-21 04:33:53.887 16160 16328 I MtkCam/fdNodeImp: [RunFaceDetection] 3A NumFace = 2,
11-21 04:33:53.887 16160 16328 D MtkCam/fdNodeImp: [RunFaceDetection] [Before 3A] magicNo: 105
11-21 04:33:53.887 16160 16328 I MtkCam/fdNodeImp: [convertResult] set 3A fd info
(2)算法参数配置
//这里以6765平台作为示例
//vendor/mediatek/proprietary/custom/mt6765/hal/camera/camera_custom_fd.cpp
void get_fd_CustomizeData(FD_Customize_PARA *FDDataOut)
{
FDDataOut->FDThreadNum = 1;
FDDataOut->FDThreshold = 256;
FDDataOut->MajorFaceDecision = 1;
FDDataOut->OTRatio = 1088;
FDDataOut->SmoothLevel = 8;
FDDataOut->Momentum = 0;
FDDataOut->MaxTrackCount = 10;
FDDataOut->FDSkipStep = 2;
FDDataOut->FDRectify = 10;
FDDataOut->FDRefresh = 3;
FDDataOut->SDThreshold = 69;
FDDataOut->SDMainFaceMust = 1;
FDDataOut->SDMaxSmileNum = 3;
FDDataOut->GSensor = 1;
FDDataOut->FDModel = 1;
FDDataOut->OTFlow = 1; //0:Original Flow (FDRefresh:60) , 1:New Flow (FDRefresh:3)
FDDataOut->UseCustomScale = 1;
FDDataOut->FDSizeRatio = 0.0; // float:0~1
FDDataOut->SkipPartialFD = 0;
FDDataOut->SkipAllFD = 0;
}
如上为相关参数配置,可参考如下解释:
//fd相关的参数的说明
void get_fd_CustomizeData(FD_Customize_PARA *FDDataOut)
{
FDDataOut->FDThreadNum = 1; //默认为1,不建议设的很大,此值越大,耗电越高,功耗越大,因为FD本身计算量较大,如果多开几条thread,那功耗就更多了。
FDDataOut->FDThreshold = 88; //代表人脸检测的一个阈值,用来判断是否为人脸区域。
//此值越低,表示认为人脸的标准越宽松,识别率会提高,同时误检率也会增加,反之,识别率降低,误检率降低。
FDDataOut->MajorFaceDecision = 1; //因为FD的结果会用来调整AE、AF的设定,所以当画面有多人脸的时候,需要决定一个重要的脸来做3A设定,这个值用来决定要以哪个脸优先,设定如下:
// 0: 人脸大小优先,即最大的那张人脸是要送到AE/AF那边去的
// 1: 画面中心优先,最中间的那种人脸是要送到AE/AF那边的
FDDataOut->OTRatio = 1088; // 画面中人在移动的情况下,人脸追踪的准确度和速度就需要调整此值,默认值为1024。
// 此值越大,表示越能够抗人脸的移动、转动和光线的变化,不会掉框,框会一直跟着人脸,不会lose tracing,但是框虽然跟上去了,但不一定能追到脸上去,有可能追到脖子或者脸部以外的区域,建议值:800~1280。
// 若认为tracing偏移的状况严重,可以降低此值,以losing tracing来换取校正位置。
//此值增加 ==》较不会losing tracing,易追到人脸区域以外。
//此值减小 ==》较易losing tracing,但易追到人脸区域。
FDDataOut->SmoothLevel = 8;
FDDataOut->FDSkipStep = 3;
FDDataOut->FDRectify = 10; //希望人脸框追人脸追的更准确一些,默认值为10,建议值5~15,此值越大,人脸框追踪人脸越不准确。
FDDataOut->FDRefresh = 3;
FDDataOut->SDThreshold = 69;
FDDataOut->SDMainFaceMust = 1;
FDDataOut->SDMaxSmileNum = 3;
FDDataOut->GSensor = 1; //默认值1,预设FD需要G-sensor的辅助来加速FD的搜寻时间
// 0: 不使用G-sensor
// 1:使用G-sensor
// 一般有Gsensor时,建议打开
FDDataOut->FDModel = 1;
FDDataOut->OTFlow = 1; //0:Original Flow (FDRefresh:60) , 1:New Flow (FDRefresh:3)
FDDataOut->SkipAllFD = 0;
}
以上介绍的参数是允许调整的,其它参数一般不建议去调整。
(3)关闭FD相关逻辑:
adb root
adb shell setprop vendor.debug.camera.fd.disable 1