camera人臉識別問題之二:【FFD】太陽逆光場景,人像模式后置打開美顏和濾鏡,關閉heif拍攝格式對著人臉拍照,成像口紅出現位置錯誤

【關注我,后續持續新增專題博文,謝謝!!!】

上一篇我們講了

? ? ? ? 這一篇我們開始講?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即可。

【關注我,后續持續新增專題博文,謝謝!!!】

下一篇講解

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/92560.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/92560.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/92560.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

YOLO-Count:用于文本到圖像生成的可微分目標計數

摘要 https://arxiv.org/pdf/2508.00728v1 我們提出了YOLO-Count,一種可微分的開放詞匯目標計數模型,旨在解決通用計數挑戰并實現文本到圖像(T2I)生成的精確數量控制。核心貢獻是"基數"圖(cardinality map),這是一種新穎的回歸目標…

Go 的錯誤處理方式深度解析—— error vs panic vs recover:機制原理與實戰取舍

一、Go 的錯誤處理哲學Go 的設計哲學鼓勵明確的、顯式的錯誤處理方式。它不像 Java 或 Python 使用異常機制,而是采用了返回值 error 的方式,讓錯誤成為程序流程的一部分。Go 的錯誤處理核心理念是: 錯誤是值(Errors are values&a…

官方Windows系統部署下載工具實踐指南

摘要:本文介紹兩款用于獲取微軟正版系統部署文件的工具,適用于需要快速搭建Windows環境的技術人員。所有工具均基于官方渠道實現,不涉及系統修改或激活功能。一、Windows系統鏡像下載方案工具名稱:Windows鏡像直鏈下載工具 核心功…

Pandas query() 方法詳解

Pandas query() 方法詳解query() 是 Pandas 中一個非常強大的方法,它允許你使用字符串表達式來篩選數據行。這種方法比傳統的布爾索引更簡潔、更易讀。基本語法df.query(expr, inplaceFalse, **kwargs)expr: 查詢字符串表達式inplace: 是否原地修改 DataFrame (默認…

Linux系統層IO

1.c語言文件操作 fopen:打開文件,模式 "w"(寫,覆蓋)或 "r"(讀)。 fwrite:fwrite(data, size, count, fp),按 size 字節寫入 count 次數據。 fread…

QT中的trimmed() 方法(1)

QT中的trimmed() 方法(2) trimmed() 是 Qt 框架 中 QString 類提供的一個方法,用于 去除字符串首尾的空白字符(whitespace characters)。它的作用類似于標準 C 中的 std::string 的 trim 操作,但專為 Qt 的…

動漫軟件集合分享

通過網盤分享的文件:動漫軟件 鏈接: https://pan.baidu.com/s/1TD_OmaAZksfFxJ4PW6rS-w?pwd1234 提取碼: 1234 打印動漫.apk 當鳥動漫.apk 動漫共和國【OmoFun復活】.apk 咕咕香.apk 黑貓動漫.apk 團次元【推薦】.apk 橘漫.apk 曼波.apk 萌國.apk 趣動漫.apk 三…

Mysql與Ooracle 索引失效場景對比

MySQL 和 Oracle 作為主流關系型數據庫,其索引失效的場景既有共性,也因底層優化器、索引類型支持等差異存在不同。以下從常見索引失效場景對比兩者的表現及原因:一、索引列上使用函數 / 表達式共性:若直接在索引列上使用函數或表達…

【unity知識】unity使用AABB(軸對齊包圍盒)和OBB(定向包圍盒)優化碰撞檢測

文章目錄前言一、AABB(軸對齊包圍盒)1、基本概念2、數學表示3、Unity中的實現4、實際應用示例二、OBB(有向包圍盒)1、Physics.ComputePenetration (Unity 物理引擎)1.1 基本概念1.2 Unity中的實現1.3 實際應用示例2、OBB (SAT) 手…

Numpy科學計算與數據分析專題

Numpy科學計算與數據分析 1. Numpy入門:數組操作與科學計算基礎 2. Numpy入門:多平臺安裝與基礎環境配置 3. Numpy數組創建與應用入門 4. Numpy數組屬性入門:形狀、維度與大小 5. Numpy數組索引與切片入門 6. Numpy數組操作入門:…

齊護機器人小智AI_MCP圖形化編程控制Arduino_ESP32

齊護機器人小智AI_MCP圖形化編程控制Arduino_ESP32 齊護AiTall在項目實踐里,我們常常期望達成這樣一種場景:借助智能體(例如小智 AI)來遠程操控其他開發板上的設備,這類似于智能家居系統中智能音箱與各類家電的互動模式…

CPO-SVM分類預測+特征貢獻SHAP分析,通過特征貢獻分析增強模型透明度,Matlab代碼實現,引入SHAP方法打破黑箱限制,提供全局及局部雙重解釋視角

代碼功能 該Matlab代碼實現了一個基于CPO-SVM冠豪豬算法優化支持向量機的數據分類模型,結合了SHAP可解釋性分析,CPO選擇最佳的SVM參數c和g。 SVM模型有兩個非常重要的參數C與gamma。其中 C是懲罰系數,即對誤差的寬容度。c越高,說明…

Failed to restart docker.service: Unit docker.service is masked.

docker.service 被標記為 "masked" 意味著 systemd 已阻止該服務被啟動或運行。這通常發生在 Docker Desktop 安裝過程中,因為它使用自己的服務管理機制。以下是解決方法: 解決方案: 解除服務的 mask 狀態: bash sudo systemctl unmask docker.service sudo sys…

2025 藍橋杯C/C++國B 部分題解

P12836 [藍橋杯 2025 國 B] 翻倍 題目描述 給定 nnn 個正整數 A1,A2,…,AnA_1, A_2, \ldots, A_nA1?,A2?,…,An?,每次操作可以選擇任意一個數翻倍。 請輸出讓序列單調不下降,也就是每個數都不小于上一個數,最少需要操作多少次?…

os標準庫

os標準庫os包提供了操作系統函數,但和操作系統無關。 os包的接口規定為在所有操作系統中都是一致的。 設計為Unix風格的。1. 權限說明 os標準庫有大量的文件操作,在創建文件等操作中,需要指的perm。 在go語言中perm是一個uint32類型 在go語言…

QtC++ 中使用 qtwebsocket 開源庫實現基于websocket的本地服務開發詳解

前言 當前實時通信功能越來越受到重視,無論是在線聊天、實時數據監控還是多人協作工具,都離不開高效、穩定的實時通信技術。WebSocket 作為一種全雙工通信協議,為實時通信提供了良好的解決方案。而在 QtC 開發環境中,qtwebsocket …

小程序實時保存優化

背景。避免數據存儲后丟失。要求實時保存。問題:保存時出現卡斷,輸入的內容會被抹除。問題原因。輸入頻繁速度塊,會影響cpu處理速度。解決方案。用戶停止輸入500ms后開始保存,否則不保存。這里是保存方法:當500ms以內有…

國產化Excel處理組件Spire.XLS教程:使用 C# 將 DataTable 導出為 Excel 文件

在 C# 中將 DataTable 導出為 Excel 文件,是 .NET 開發中常見的任務,廣泛應用于報表生成、日志導出、系統間數據共享等場景。通過使用獨立的組件庫,開發者可以輕松將 DataTable 數據寫入 Excel 文件,并應用格式設置,生…

C語言學習筆記——編譯和鏈接

目錄1 C程序的執行流程2 翻譯環境2.1 預編譯2.2 編譯2.2.1 詞法分析2.2.2 語法分析2.2.3 語法分析2.3 匯編2.4 鏈接1 C程序的執行流程 用戶編寫好的C程序不能直接被計算機識別并執行,在執行前,要先將源文件和頭文件進行編譯,生成目標文件&am…

Flink-1.19.0源碼詳解9-ExecutionGraph生成-后篇

《Flink-1.19.0源碼詳解8-ExecutionGraph生成-前篇》前篇已從Flink集群端調度開始解析ExecutionGraph生成的源碼,解析了ExecutionGraph的ExecutionJobVertex節點、ExecutionVertex節點、IntermediateResult數據集、IntermediateResultPartition數據集分區與封裝Task…