【关注我,后续持续新增专题博文,谢谢!!!】
上一篇我们讲了:
这一篇我们开始讲: camera人脸识别问题之二:【FFD】太阳逆光场景,人像模式后置打开美颜和滤镜,关闭heif拍摄格式对着人脸拍照,成像口红出现位置错误8667070
目录
一、问题背景
【操作步骤】【Operation steps】大太阳逆光环境下,后置人像模式--设置--打开机型水印、位置水印、时间水印、在机型水印中编辑添加自定义水印--关闭heif拍摄格式--返回预览--随机滤镜效果--调节美颜到最大美颜,预览拍照
【实际结果】【Actual results】成像口红出现位置错误
【期望结果】【Expected results】无此现象
二、问题分析过程
2.1:基于原理分析
口红偏移,主要是人脸信息faceInfo坐标不准确导致,而faceInfo坐标涉及从底层到上层多个层面,如下流程:
camera hal进程:FDNode拿到预览YUV(会转换成FFD算法支持的size的YUV) --> YUV传入FFD算法 --> FFD算法返回人脸FFD信息 --> 传递给FDNode --> (有时可能会根据预览分辨率进行转换) --> 写入FFD metadata。
camera APP进程:人脸线程读取FFD metadata --> 解析FFD metadata --> (有时也可能需要转换) --> 传入美颜等等人脸相关算法 --> 美颜算法根据FFD信息进行美颜、口红等等处理。
流程参考:
Camera相机人脸识别系列专题分析之六:MTK ISP6S平台人脸识别fdnode流程FdNodeImp.cpp详解Camera相机人脸识别系列专题分析之十:人脸特征检测FFD算法之低功耗libvega_face.so人脸识别检测流程详解Camera相机人脸识别系列专题分析之六:MTK ISP6S平台人脸识别fdnode流程FdNodeImp.cpp详解
2.2 :开启人脸FFD日志开关和dump开关
默认情况下,人脸信息太多,打印太多日志,会影响性能,因此人脸相关日志开关默认是关闭的,因此需要打开人脸日志开关,并复现问题来分析。打开日志开关参考:
Camera相机人脸识别系列专题分析之九:MTK平台FDNode三方FFD算法dump、日志开关、bypass、resize及强制不同三方FFD切换等客制化Camera相机人脸识别系列专题分析之七:MTK ISP6S平台FDNode流程FdNodeImp.cpp调试手段及客制化dump,跳帧,开关,使能,异步控制等等Camera相机人脸识别系列专题分析之九:MTK平台FDNode三方FFD算法dump、日志开关、bypass、resize及强制不同三方FFD切换等客制化
2.3 : 先分析FFD算法返回的人脸坐标是否正常
1:参考HAL3一级日志关键字:相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
2:复现抓取日志,并搜索"VEGA_FD|VegaFace|CUSTOM_FD|OCAM-FAD| MtkCam/fdNodeImp:"关键字
行 114497: 01-01 03:05:38.093 13827 30357 I VegaFace: [vega_face_ret_get_face_rect:vega_face_sdk.cpp(616)] get face rect out, face: 0x20001d68, id: 3, score: 0.984863, rect: [(161.333,148.000), (357.333,328.000)] 行 115577: 01-01 03:05:38.129 13827 30357 I VegaFace: [vega_face_ret_get_face_rect:vega_face_sdk.cpp(616)] get face rect out, face: 0x20001d69, id: 3, score: 0.984863, rect: [(161.333,148.000), (357.333,328.000)] 行 115599: 01-01 03:05:38.129 13827 30357 D VEGA_FD : rect: [160.726807 147.589020 425.102661 328.000000], center(292 237) 行 117606: 01-01 03:05:38.198 13827 30357 I VegaFace: [vega_face_ret_get_face_rect:vega_face_sdk.cpp(616)] get face rect out, face: 0x20001d6a, id: 3, score: 0.984863, rect: [(161.333,148.000), (357.333,328.000)] 行 117628: 01-01 03:05:38.198 13827 30357 D VEGA_FD : rect: [160.726807 147.589020 425.102661 328.000000], center(292 237) 行 119702: 01-01 03:05:38.260 13827 30357 I VegaFace: [vega_face_ret_get_face_rect:vega_face_sdk.cpp(616)] get face rect out, face: 0x20001d6b, id: 3, score: 0.984863, rect: [(161.333,148.000), (357.333,328.000)] 行 119724: 01-01 03:05:38.260 13827 30357 D VEGA_FD : rect: [160.726807 147.589020 425.102661 328.000000], center(292 237) 行 121201: 01-01 03:05:38.322 13827 30357 I VegaFace: [vega_face_ret_get_face_rect:vega_face_sdk.cpp(616)] get face rect out, face: 0x20001d6c, id: 3, score: 0.984863, rect: [(161.333,148.000), (357.333,328.000)] 行 121235: 01-01 03:05:38.322 13827 30357 D VEGA_FD : rect: [160.726807 147.589020 425.102661 328.000000], center(292 237) 行 123222: 01-01 03:05:38.394 13827 30357 I VegaFace: [vega_face_ret_get_face_rect:vega_face_sdk.cpp(616)] get face rect out, face: 0x20001d6d, id: 3, score: 0.984863, rect: [(156.000,154.667), (350.667,333.333)] 行 123244: 01-01 03:05:38.394 13827 30357 D VEGA_FD : rect: [156.000000 154.346664 418.257202 333.333344], center(287 243) 行 125042: 01-01 03:05:38.466 13827 30357 I VegaFace: [vega_face_ret_get_face_rect:vega_face_sdk.cpp(616)] get face rect out, face: 0x20001d6e, id: 3, score: 0.984863, rect: [(152.000,157.333), (345.333,337.333)] 行 125064: 01-01 03:05:38.466 13827 30357 D VEGA_FD : rect: [151.392334 157.333344 412.960327 337.630829], center(282 247) 行 126854: 01-01 03:05:38.531 13827 30357 I VegaFace: [vega_face_ret_get_face_rect:vega_face_sdk.cpp(616)] get face rect out, face: 0x20001d6f, id: 3, score: 0.984863, rect: [(144.000,157.333), (341.333,336.000)] 行 126876: 01-01 03:05:38.532 13827 30357 D VEGA_FD : rect: [144.000000 157.333344 406.241882 336.000000], center(275 246) 行 128176: 01-01 03:05:38.596 13827 30357 I VegaFace: [vega_face_ret_get_face_rect:vega_face_sdk.cpp(616)] get face rect out, face: 0x20001d70, id: 3, score: 0.984863, rect: [(142.667,153.333), (340.000,330.667)] 行 128204: 01-01 03:05:38.597 13827 30357 D VEGA_FD : rect: [142.095551 152.883286 405.225067 330.690491], center(273 241) 行 129917: 01-01 03:05:38.664 13827 30357 I VegaFace: [vega_face_ret_get_face_rect:vega_face_sdk.cpp(616)] get face rect out, face: 0x20001d71, id: 3, score: 0.984863, rect: [(142.667,153.333), (340.000,330.667)] 行 129939: 01-01 03:05:38.665 13827 30357 D VEGA_FD : rect: [142.095551 152.883286 405.225067 330.690491], center(273 241) 行 131276: 01-01 03:05:38.731 13827 30357 I VegaFace: [vega_face_ret_get_face_rect:vega_face_sdk.cpp(616)] get face rect out, face: 0x20001d72, id: 3, score: 0.984863, rect: [(145.333,157.333), (344.000,336.000)] 行 131298: 01-01 03:05:38.732 13827 30357 D VEGA_FD : rect: [145.333344 156.820496 411.290100 336.000000], center(278 246) 行 133008: 01-01 03:05:38.795 13827 30357 I VegaFace: [vega_face_ret_get_face_rect:vega_face_sdk.cpp(616)] get face rect out, face: 0x20001d73, id: 3, score: 0.984863, rect: [(153.333,154.667), (352.000,336.000)] 行 133031: 01-01 03:05:38.796 13827 30357 D VEGA_FD : rect: [152.978851 154.618484 420.028503 336.000000], center(286 245) 行 134433: 01-01 03:05:38.864 13827 30357 I VegaFace: [vega_face_ret_get_face_rect:vega_face_sdk.cpp(616)] get face rect out, face: 0x20001d74, id: 3, score: 0.984863, rect: [(160.000,146.667), (358.667,329.333)] 行 134455: 01-01 03:05:38.864 13827 30357 D VEGA_FD : rect: [159.688477 146.666672 427.194214 329.478149], center(293 238) 行 136302: 01-01 03:05:38.927 13827 30357 I VegaFace: [vega_face_ret_get_face_rect:vega_face_sdk.cpp(616)] get face rect out, face: 0x20001d75, id: 3, score: 0.984863, rect: [(160.000,138.667), (360.000,320.000)]
rect: [160.726807 147.589020 425.102661 328.000000], center(292 237)类似这种日志rect就是人脸框的左上角和右下角的坐标,center就是人脸的中心位置。
.
2.4 :确认是否FFD算法返回值存在偏移
确认是否FFD算法返回值存在偏移有两种方式:
- 我们通过dump FD YUV图结合坐标值去判断坐标是否存在偏移。
- 我们复现并观察这些日志打印,移动手机,使其人脸尽可能靠近上下左右4个角,查看center的值是否有偏移,是否为负值。
通过这些方式确认FFD算法返回的坐标值是准确的,并没有偏移,下面我们可以去确认FDNode的坐标或者写入metadata的值是否正常。
2.5 :确认FFD metadata值是否存在偏移
查看FFD metadata的方式如下:
adb shell dumpsys media.camera。这个命令会dump所有的静态meta和实时meta的各种值。但FFD算法执行到写入meta,中间是有时间差的,而meta里的值会实时被覆盖,因此日志打印和meta的值是频繁更新的,观察起来就不是很方便。meta数据如下:
com.ffd.face.info (9002004b): int32[1717] [6 1 -1 137 ] [26 0 0 0 ] [1 0 0 0 ] [459 442 424 406 ] [387 369 351 333 ] [315 300 283 270 ] [255 244 237 229 ] [228 231 234 243 ] [255 267 282 297 ] [312 330 346 364 ] [382 400 417 435 ] [451 501 522 528 ] [522 511 510 517 ] [522 514 493 468 ] [447 427 408 376 ] [376 375 375 373 ] [469 475 472 463 ] [463 463 460 469 ] [471 463 457 459 ] [502 504 501 496 ] [493 498 498 496 ] [477 462 468 472 ] [457 463 465 463 ] [411 409 391 388 ] [318 333 342 337 ] [340 330 313 301 ] [295 294 297 304 ] [319 319 319 318 ] [315 318 319 321 ] [468 463 465 481 ] [496 510 525 540 ] [553 568 580 594 ] [604 615 622 627 ] [628 628 630 628 ] [625 619 610 600 ] [588 576 562 549 ] [534 519 504 489 ] [474 255 255 255 ] [256 259 262 267 ] [271 279 286 297 ] [309 321 334 351 ] [369 388 406 423 ] [439 453 465 475 ] [486 495 502 508 ] [511 516 519 522 ] [522 522 276 291 ] [316 342 366 421 ] [447 471 493 507 ] [394 393 393 393 ] [357 375 393 409 ]
这里的值对应的是代码的数据结构,比如第一行的137就是代表代码里的FFD算法是137点位的。具体坐标值在最下面。
因此我们同样可以复现并观察这些dump meta打印,移动手机,使其人脸尽可能靠近上下左右4个角,查看center的值是否有偏移,是否为负值来判断。
【另外我们可以编写工具实时把137个点位信息绘制到UI界面的人脸上去,这样就更能直观看到是否偏移了】
2.6 :确认Camera HAL进程FFD是否存在问题
通过上述方式进行不管复现观察分析,确认了底层的FFD坐标信息是正常的,并没有偏移。因此需要APP那边美颜算法进一步分析拿到的meta值是否准确,进一步看哪个阶段的问题。
2.7 :APP分析拿到的meta值
这个比较简单,camera hal写入meta,app读取meta,一般值都是一样的,没有问题。只是读写的时间有时差。
2.8 :美颜算法输入值是否存在偏移
最后算法开发开启算法开关分析日志,发现算法输入size是作为B2Y和MFNR的输出尺寸,而3x长焦需要进行downscale(4608x3456->4096x3072), 造成B2Y 输出结果与IPE size不一致,导致最终传入算法的faceInfo不准确,存在偏差。
2.9 :解决方案
对这个downscale代码逻辑进行修正,避免faceInfo即可。
【关注我,后续持续新增专题博文,谢谢!!!】
下一篇讲解: