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

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

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

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

目录

一、背景

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

    2.1:影像相关基础知识

        2.1.1 pipeline简介

    2.1.2 Raw阈图像处理

    2.2 :Camera相机人脸识别

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

    2.4 :人脸特征检测FFD

    2.5 :人脸属性检测

    2.6 :人脸识别算法介绍

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

    2.8 :预览人脸检测介绍

    2.9 :预览属性检测介绍

    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,输入输出参数如下注释: 

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,输入输出参数如下注释:

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,输入输出参数如下注释:

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);

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

下一篇讲解

你可能感兴趣的:(人工智能,计算机视觉,图像处理,android)