camera人脸识别问题之二:【FFD】太阳逆光场景,人像模式后置打开美颜和滤镜,关闭heif拍摄格式对着人脸拍照,成像口红出现位置错误

发布于:2025-08-09 ⋅ 阅读:(15) ⋅ 点赞:(0)

【关注我,后续持续新增专题博文,谢谢!!!】

上一篇我们讲了

        这一篇我们开始讲 camera人脸识别问题之二:【FFD】太阳逆光场景,人像模式后置打开美颜和滤镜,关闭heif拍摄格式对着人脸拍照,成像口红出现位置错误8667070

目录

一、问题背景

二、问题分析过程

    2.1:基于原理分析

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算法返回的人脸坐标是否正常

    2.4 :确认是否FFD算法返回值存在偏移

    2.5 :确认FFD metadata值是否存在偏移

    2.6 :确认Camera HAL进程FFD是否存在问题

    2.7 :APP分析拿到的meta值

    2.8 :美颜算法输入值是否存在偏移

    2.9 :解决方案


一、问题背景

【操作步骤】【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算法返回值存在偏移有两种方式:

  1. 我们通过dump FD YUV图结合坐标值去判断坐标是否存在偏移。
  2. 我们复现并观察这些日志打印,移动手机,使其人脸尽可能靠近上下左右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即可。

【关注我,后续持续新增专题博文,谢谢!!!】

下一篇讲解


网站公告

今日签到

点亮在社区的每一天
去签到