【關注我,后續持續新增專題博文,謝謝!!!】
上一篇我們講了:
? ? ? ? 這一篇我們開始講:?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算法返回值存在偏移有兩種方式:
- 我們通過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即可。
【關注我,后續持續新增專題博文,謝謝!!!】
下一篇講解: