【关注我,后续持续新增专题博文,谢谢!!!】
上一篇我们讲了: Camera相机人脸识别系列专题分析之三:一张图片的人脸识别过程原理
这一篇我们开始讲: Camera相机人脸识别系列专题分析之四:Camera相机领域人脸识别和人脸属性检测介绍
目录
[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)的详细说明:
输入:
- 图像处理流程始于输入图像的获取,其来源包括摄像头采集、图像文件读取以及各类传感器数据等多种渠道。
预处理(Preprocessing):
- 预处理阶段对输入图像进行初步处理,为后续操作做好准备。
- 常用的预处理步骤涵盖图像去噪、平滑处理、灰度转换以及尺寸调整等操作。
特征提取(Feature Extraction):
特征提取阶段专注于从图像中捕获关键信息。该过程可提取两类特征:
- 结构特征:如边缘轮廓、角点等几何信息
- 语义特征:包括纹理模式、形状特征等视觉元素
典型提取方法涵盖:
- 边缘检测技术
- 角点定位算法
- 纹理分析方法
特征增强(Feature Enhancement):
特征增强阶段用于强化或突出关键特征,从而提升后续分析和应用效果。
主要技术手段包括图像增强、对比度调整、直方图均衡化等方法。
特征选择和分类(Feature Selection and Classification):
- 在特征选择阶段,我们会筛选出最具代表性的特征,以降低计算和存储成本。
- 随后在特征分类阶段,基于这些选定的特征对图像进行分类识别。
- 这两个阶段主要运用机器学习、模式识别等分类算法来实现。
后处理(Post-processing):
- 在后处理阶段,我们会对分类或识别的结果进行精细化处理与优化。具体操作包括噪声消除、滤波处理、图像修复和目标追踪等。
输出:
- 最终的输出环节可将处理结果以多种形式呈现,包括保存为图像文件、屏幕实时显示或传输至下游系统进行后续处理及应用。
图像处理流水线的具体步骤及其顺序需根据实际应用需求灵活调整。部分应用可省略某些步骤,而某些场景则可能需要添加额外或定制化的处理环节。在设计过程中,需综合考虑处理效率、资源占用及性能要求等关键因素,并按实际应用场景进行针对性优化。
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)等模块调用。
- Camera APP:相机 APK 通过标准 API 获取人脸信息,进一步实现一些人脸美颜美妆等相关功能开发;
- AF:自动对焦模块,识别人脸位置并自动选择最佳对焦点;
- AE:自动曝光模块,根据环境光线自动调节人脸曝光参数;
由于高通/MTK原厂人脸识别算法提供的人脸信息较为单一,且在大逆光、暗光等特殊场景下的识别效果欠佳,我们一般在HAL层替换了该人脸识别算法,大部分场景采用三方的人脸识别解决方案。
2.3 :人脸识别算法功能模块
目前人脸检测主要包含三个功能:
- 人脸检测(FD):检测并输出画面中的人脸数量及对应的人脸区域坐标框
- 关键点检测(FFD):提供137点/296点的面部关键点定位,同时标注各关键点的遮挡状态
- 属性识别(Attr):输出年龄区间预测结果及精确的性别判断
人脸识别算法功能一般分类为:
- 人脸坐标检测
- 人脸识别
- 人脸追踪
- 人脸属性检测
2.4 :人脸特征检测FFD
在人脸识别技术中,FFD的全称是"Facial Feature Detection",即"人脸特征检测"。 FFD是一种计算机视觉技术,用于检测和定位人脸图像中的关键特征点,例如眼睛、鼻子、嘴巴等。这些特征点的位置信息可以用于进一步的面部分析和人脸识别任务。FFD通常涉及使用机器学习算法和计算机视觉方法来训练模型,以便在图像或视频中自动检测人脸的各个特征点。具体在下一节分享。
2.5 :人脸属性检测
支持检测以下特征:
- 性别识别
- 年龄区分(可辨别婴儿或成人)
- 肤色亮度检测
- 肤质分析
- 人脸角度检测
- 面部关键点遮挡判断
拍照时启用全功能属性检测模式,预览则采用精简模型仅识别性别属性
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算法基于这些框信息计算每帧的点位数据。
- Rect:人脸框坐标
- Score:识别置信度
- Yaw:水平转角
- Pitch:俯仰角
- Roll:旋转角
- ID:人脸编号points_more:137 个人脸关键点坐标
- 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帧调用一次,输出性别和年龄。
- age::0 -- 100
- gender.label:0为女性 1为男性
- gender.feature:详细的性别分数,0 -- 1.0 > =0.51为男性
预览属性检测,使用的cv_face_attribute_detector_detect算法API,输入输出参数如下注释:
cpp450 /// @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,输入输出参数如下注释:
cpp233 /// @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);
【关注我,后续持续新增专题博文,谢谢!!!】
下一篇讲解: