Camera相机人脸识别系列专题分析之四:Camera相机领域人脸识别和人脸属性检测介绍

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

上一篇我们讲了: Camera相机人脸识别系列专题分析之三:一张图片的人脸识别过程原理

这一篇我们开始讲: Camera相机人脸识别系列专题分析之四:Camera相机领域人脸识别和人脸属性检测介绍

目录

一、背景

二、:Camera相机领域人脸识别

2.1:影像相关基础知识

[2.1.1 pipeline简介](#2.1.1 pipeline简介)

[2.1.2 Raw阈图像处理](#2.1.2 Raw阈图像处理)

[2.2 :Camera相机人脸识别](#2.2 :Camera相机人脸识别)

[2.3 :人脸识别算法功能模块](#2.3 :人脸识别算法功能模块)

[2.4 :人脸特征检测FFD](#2.4 :人脸特征检测FFD)

[2.5 :人脸属性检测](#2.5 :人脸属性检测)

[2.6 :人脸识别算法介绍](#2.6 :人脸识别算法介绍)

[2.7 :人脸识别算法集成介绍](#2.7 :人脸识别算法集成介绍)

[2.8 :预览人脸检测介绍](#2.8 :预览人脸检测介绍)

[2.9 :预览属性检测介绍](#2.9 :预览属性检测介绍)

[2.10 :拍照人脸检测](#2.10 :拍照人脸检测)


一、背景

人脸识别是实现个性化拍摄功能的关键技术,也是各大平台的核心基础模块之一。高通或者MTK平台的原生人脸识别算法都集成在 HAL 层,能够提供人脸数量及人脸框位置坐标等基础信息,这些数据可直接供 Camera APP、自动对焦(AF)和自动曝光(AE)等模块调用。

在相机领域,人脸识别不仅涉及核心算法开发,还包括算法集成、人脸美颜等应用功能实现,以及Camera HAL层的人脸识别能力支持。具体工作涵盖Camera应用开发、自动对焦(AF)和自动曝光(AE)等模块的调用与优化。

二、:Camera相机领域人脸识别

2.1:影像相关基础知识

2.1.1 pipeline简介

图像处理流水线(pipeline):将图像处理流程划分为多个有序的处理阶段,每个阶段专注于执行特定的处理任务,通过各阶段的协同工作最终输出处理完成的图像。

下面是一个典型的图像处理流水线(pipeline)的详细说明:

  1. 输入:

    1. 图像处理流程始于输入图像的获取,其来源包括摄像头采集、图像文件读取以及各类传感器数据等多种渠道。
  2. 预处理(Preprocessing):

    1. 预处理阶段对输入图像进行初步处理,为后续操作做好准备。
    2. 常用的预处理步骤涵盖图像去噪、平滑处理、灰度转换以及尺寸调整等操作。
  3. 特征提取(Feature Extraction):

    1. 特征提取阶段专注于从图像中捕获关键信息。该过程可提取两类特征:

      1. 结构特征:如边缘轮廓、角点等几何信息
      2. 语义特征:包括纹理模式、形状特征等视觉元素
    2. 典型提取方法涵盖:

      1. 边缘检测技术
      2. 角点定位算法
      3. 纹理分析方法
  4. 特征增强(Feature Enhancement):

    1. 特征增强阶段用于强化或突出关键特征,从而提升后续分析和应用效果。

    2. 主要技术手段包括图像增强、对比度调整、直方图均衡化等方法。

  5. 特征选择和分类(Feature Selection and Classification):

    1. 在特征选择阶段,我们会筛选出最具代表性的特征,以降低计算和存储成本。
    2. 随后在特征分类阶段,基于这些选定的特征对图像进行分类识别。
    3. 这两个阶段主要运用机器学习、模式识别等分类算法来实现。
  6. 后处理(Post-processing):

    1. 在后处理阶段,我们会对分类或识别的结果进行精细化处理与优化。具体操作包括噪声消除、滤波处理、图像修复和目标追踪等。
  7. 输出:

    1. 最终的输出环节可将处理结果以多种形式呈现,包括保存为图像文件、屏幕实时显示或传输至下游系统进行后续处理及应用。

图像处理流水线的具体步骤及其顺序需根据实际应用需求灵活调整。部分应用可省略某些步骤,而某些场景则可能需要添加额外或定制化的处理环节。在设计过程中,需综合考虑处理效率、资源占用及性能要求等关键因素,并按实际应用场景进行针对性优化。

2.1.2 Raw阈图像处理

在图像处理领域,"RAW"特指未经处理或压缩的原始图像数据。这种数据直接来源于相机传感器(如CMOS或CCD),完整保留了每个像素的原始亮度信息。

在整个图像处理的pipline中,Raw域的图像处理一般是在对硬件导致的原始图像的缺陷进行补偿,主要包括:

1、黑电平补偿(BlackLevel Correction)

2、坏点矫正 (Bad Point Correction)

3、暗角矫正 (Lens Shading Correction)

4、Raw域降噪(Raw Denoise)

2.2 :Camera相机人脸识别

人脸识别是实现个性化拍摄功能的关键技术,也是各大平台的核心基础模块之一。高通或者MTK平台的原生人脸识别算法都集成在 HAL 层,能够提供人脸数量及人脸框位置坐标等基础信息,这些数据可直接供 Camera APP、自动对焦(AF)和自动曝光(AE)等模块调用。

  1. Camera APP:相机 APK 通过标准 API 获取人脸信息,进一步实现一些人脸美颜美妆等相关功能开发;
  2. AF:自动对焦模块,识别人脸位置并自动选择最佳对焦点;
  3. AE:自动曝光模块,根据环境光线自动调节人脸曝光参数;

由于高通/MTK原厂人脸识别算法提供的人脸信息较为单一,且在大逆光、暗光等特殊场景下的识别效果欠佳,我们一般在HAL层替换了该人脸识别算法,大部分场景采用三方的人脸识别解决方案。

2.3 :人脸识别算法功能模块

目前人脸检测主要包含三个功能:

  1. 人脸检测(FD):检测并输出画面中的人脸数量及对应的人脸区域坐标框
  2. 关键点检测(FFD):提供137点/296点的面部关键点定位,同时标注各关键点的遮挡状态
  3. 属性识别(Attr):输出年龄区间预测结果及精确的性别判断

人脸识别算法功能一般分类为:

  1. 人脸坐标检测
    1. 人脸识别
    2. 人脸追踪
  2. 人脸属性检测

2.4 :人脸特征检测FFD

在人脸识别技术中,FFD的全称是"Facial Feature Detection",即"人脸特征检测"。 FFD是一种计算机视觉技术,用于检测和定位人脸图像中的关键特征点,例如眼睛、鼻子、嘴巴等。这些特征点的位置信息可以用于进一步的面部分析和人脸识别任务。FFD通常涉及使用机器学习算法和计算机视觉方法来训练模型,以便在图像或视频中自动检测人脸的各个特征点。具体在下一节分享。

2.5 :人脸属性检测

支持检测以下特征:

  1. 性别识别
  2. 年龄区分(可辨别婴儿或成人)
  3. 肤色亮度检测
  4. 肤质分析
  5. 人脸角度检测
  6. 面部关键点遮挡判断

拍照时启用全功能属性检测模式,预览则采用精简模型仅识别性别属性

2.6 :人脸识别算法介绍

人脸识别算法厂家众多,算法类型也众多,举例如下:

|------|---------------------------|------------------|------------------|---------------------|
| 场景 | 预览(hal) | 预览(hal) | 预览(hal) | 拍照(app) |
| 场景模式 | 美妆模式 | 普通美颜 | 普通美颜/补妆 | 普通美颜/补妆/美妆 |
| 三方厂家 | 如:上研院预览检测库 | 如:商汤低功耗VEGA预览检测库 | 如:商汤预览检测库 | 如:商汤拍照检测库 |
| 库名 | libhci_face_camera_api.so | libvega_face.so | libcvface_api.so | libstface_fd_api.so |
| 点数 | 296点 | 137点 | 137点 | 296点 |

2.7 :人脸识别算法集成介绍

以高通平台为例:

人脸识别功能由高通camx hal的 FDManagerNode 负责处理,数据流路径为:sensorNode → IFENode → FDManagerNode。系统采用等比例缩放方式处理图像,原始 IFE 图像分辨率为 4000×3000,经缩放后传输至 FDNode 的分辨率为 640×480。这种图像降采样处理方式显著提升了处理效率。

因此预览人脸识别通常集成在camera hal模块,返回的FFD点位会写入meta中,而其他模块通过读meta的方式拿到最新人脸识别FFD点位,再去做人脸框,美颜效果算法处理。

而拍照人脸识别通常通过Google JNI集成在camera app,app拿到camera hal的YUV后,传入算法,返回拍照帧的FFD,再去做图片算法处理。

2.8 :预览人脸检测介绍

人脸检测(FD)和关键点检测(FFD)通过统一接口实现,每帧都会调用。该接口会根据算法库的设定自动选择执行人脸检测或追踪,同时完成关键点检测。

例如前置模式,在预处理模式下,检测算法每20帧执行一次,追踪算法则负责为后续19帧输出人脸框信息。随后,FFD算法基于这些框信息计算每帧的点位数据。

  1. Rect:人脸框坐标
  2. Score:识别置信度
  3. Yaw:水平转角
  4. Pitch:俯仰角
  5. Roll:旋转角
  6. ID:人脸编号points_more:137 个人脸关键点坐标
  7. Landmarks.occlusion:关键点的遮挡状态
    预览人脸检测,使用的cv_face_track算法API,输入输出参数如下注释:
cpp 复制代码
311  /// @brief 对连续视频帧进行实时快速人脸跟踪
312  /// @param[in]	tracker_handle 已初始化的实时人脸跟踪句柄
313  /// @param[in]	image 用于检测的图像数据
314  /// @param[in]	piexl_format 用于检测的图像数据的像素格式
315  /// @param[in]	image_width 用于检测的图像的宽度(以像素为单位),这里的宽度必须为图像的真实宽度,即包含align或绿边的大小,在gray8\yuv\nv21\nv12格式下大小和stride相等
316  /// @param[in]	image_height 用于检测的图像的高度(以像素为单位)
317  /// @param[in]	image_stride 用于检测的图像中每一行的跨度(以像素为单位)
318  /// @param[in]	orientation 视频中人脸的方向
319  /// @param[out]	p_faces_array 检测到的人脸信息数组,api负责分配内存,需要调用cv_facesdk_release_tracker_result函数释放
320  /// @param[out]	p_faces_count 检测到的人脸数量
321  /// @return 成功返回CV_OK,否则返回错误类型
322  CV_SDK_API
323  cv_result_t cv_face_track(cv_handle_t tracker_handle,
324                            const unsigned char *image,
325                            cv_pixel_format pixel_format,
326                            int image_width,
327                            int image_height,
328                            int image_stride,
329                            cv_face_orientation orientation,
330                            cv_face_t **p_faces_array,
331                            int *p_faces_count);

2.9 :预览属性检测介绍

attr用单独一个接口,20帧调用一次,输出性别和年龄。

  1. age::0 -- 100
  2. gender.label:0为女性 1为男性
  3. gender.feature:详细的性别分数,0 -- 1.0 > =0.51为男性
    预览属性检测,使用的cv_face_attribute_detector_detect算法API,输入输出参数如下注释:
cpp 复制代码
450  /// @brief 人脸属性检测
451  /// @param[in]	attribute_handle 已初始化的人脸属性检测句柄
452  /// @param[in]	image 用于检测的图像数据,推荐灰度格式
453  /// @param[in]	piexl_format 用于检测的图像数据的像素格式,
454  /// @param[in]	image_width 用于检测的图像的宽度(以像素为单位),这里的宽度必须为图像的真实宽度,即包含align或绿边的大小,在gray8\yuv\nv21\nv12格式下大小和stride相等
455  /// @param[in]	image_height 用于检测的图像的高度(以像素为单位)
456  /// @param[in]	image_stride 用于检测的图像中每一行的跨度(以像素为单位)
457  /// @param[out] face 输入待处理的人脸信息,需要包括关键点信息,即 face.points_count不为0
458  /// @param[out]	results_attribute_feature 检测到的人脸属性数组(由用户分配和释放,长度需为对应属性的LENGTH定义)
459  /// @param[out]	results_attribute_emotion 检测到的人脸属性数组(由用户分配和释放,长度需为对应属性的LENGTH定义)
460  /// @return 成功返回CV_OK,否则返回错误类型
461  CV_SDK_API
462  cv_result_t cv_face_attribute_detector_detect(cv_handle_t attribute_handle,
463                                                const unsigned char *image,
464                                                cv_pixel_format pixel_format,
465                                                int image_width,
466                                                int image_height,
467                                                int image_stride,
468                                                const cv_face_t *face,
469                                                int *results_attribute_feature,
470                                                int *results_attribute_emotion);

2.10 :拍照人脸检测

拍照人脸检测,使用的cv_face_detect算法API,输入输出参数如下注释:

cpp 复制代码
233  /// @brief 人脸检测
234  /// @param[in]	detector_handle 已初始化的人脸检测句柄
235  /// @param[in]	image 用于检测的图像数据
236  /// @param[in]	piexl_format 用于检测的图像数据的像素格式
237  /// @param[in]	image_width 用于检测的图像的宽度(以像素为单位),这里的宽度必须为图像的真实宽度,即包含align或绿边的大小,在gray8\yuv\nv21\nv12格式下大小和stride相等
238  /// @param[in]	image_height 用于检测的图像的高度(以像素为单位)
239  /// @param[in]	image_stride 用于检测的图像中每一行的跨度(以像素为单位)
240  /// @param[in]	orientation 图片中人脸的方向
241  /// @param[out]	p_faces_array 检测到的人脸信息数组,api负责分配内存,需要调用cv_face_release_detector_result函数释放
242  /// @param[out]	p_faces_count 检测到的人脸数量
243  /// @return 成功返回CV_OK,否则返回错误类型
244  CV_SDK_API
245  cv_result_t cv_face_detect(cv_handle_t detector_handle,
246                             const unsigned char *image,
247                             cv_pixel_format pixel_format,
248                             int image_width,
249                             int image_height,
250                             int image_stride,
251                             cv_face_orientation orientation,
252                             cv_face_t **p_faces_array,
253                             int *p_faces_count);

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

下一篇讲解:

相关推荐
kernelguru2 分钟前
AI绘画提示词:从零开始掌握Prompt Engineering的艺术
人工智能·其他·ai作画·prompt
WPG大大通7 分钟前
直播预告 | 聚焦芯必达|打造可靠高效的国产 MCU 与智能 SBC 汽车解决方案
大数据·人工智能·mcu·汽车·大大通·研讨会
工业聚32 分钟前
AI 时代的前端成长之路(2025版)
前端·人工智能
攻城狮7号38 分钟前
谷歌Gemma模型实现智能看病、翻译手语、与海豚沟通
人工智能·深度学习·medgemma·signgemma·dolphingemma
匆匆整棹还1 小时前
idea配置android--以idea2023为例
android·java·intellij-idea
巫山老妖1 小时前
Trae AI编程创意实践-DIY粽子应用
人工智能
layneyao1 小时前
计算机视觉入门:OpenCV与YOLO目标检测
opencv·yolo·计算机视觉
AI设计小站1 小时前
AI 赋能数据可视化:漏斗图制作的创新攻略
人工智能·信息可视化·设计规范
YunTM1 小时前
顶会新热门:机器学习可解释性
人工智能·机器学习
zhifanxu2 小时前
android协程异步编程常用方法
android·开发语言·kotlin