人脸姿态估计
1.实验目的
通过摄像头捕获图像,定位人脸,并计算其姿态信息,包括俯仰角(Pitch)、偏航角(Yaw)和滚转角(Roll)。
2.核心代码
预处理
def config_preprocess(self,det,input_image_size=None):
with ScopedTiming("set preprocess config",self.debug_mode > 0):
# 初始化ai2d预处理配置,默认为sensor给到AI的尺寸,可以通过设置input_image_size自行修改输入尺寸
ai2d_input_size=input_image_size if input_image_size else self.rgb888p_size
# 计算affine矩阵并设置affine预处理
matrix_dst = self.get_affine_matrix(det)
self.ai2d.affine(nn.interp_method.cv2_bilinear,0, 0, 127, 1,matrix_dst)
# 构建预处理流程,参数为预处理输入tensor的shape和预处理输出的tensor的shape
self.ai2d.build([1,3,ai2d_input_size[1],ai2d_input_size[0]],[1,3,self.model_input_size[1],self.model_input_size[0]])
选择预处理输入尺寸:
- 默认为原图像尺寸
rgb888p_size
,也可手动指定input_image_size
。
仿射矩阵生成:
- 调用
get_affine_matrix(det)
,根据人脸框 bbox 生成 affine warp 所需的 2x3 仿射矩阵。
设置 affine 参数:
- 使用
cv2_bilinear
插值,背景填充为灰色(127)。
构建流程图:
build()
接收输入 tensor 和输出 tensor 的 shape,用于预处理模块生成图像流。
仿射变换
def get_affine_matrix(self,bbox):
# 获取仿射矩阵,用于将边界框映射到模型输入空间
with ScopedTiming("get_affine_matrix", self.debug_mode > 1):
# 设置缩放因子
factor = 2.7
# 从边界框提取坐标和尺寸
x1, y1, w, h = map(lambda x: int(round(x, 0)), bbox[:4])
# 模型输入大小
edge_size = self.model_input_size[1]
# 平移距离,使得模型输入空间的中心对准原点
trans_distance = edge_size / 2.0
# 计算边界框中心点的坐标
center_x = x1 + w / 2.0
center_y = y1 + h / 2.0
# 计算最大边长
maximum_edge = factor * (h if h > w else w)
# 计算缩放比例
scale = edge_size * 2.0 / maximum_edge
# 计算平移参数
cx = trans_distance - scale * center_x
cy = trans_distance - scale * center_y
# 创建仿射矩阵
affine_matrix = [scale, 0, cx, 0, scale, cy]
return affine_matrix
使用一个缩放因子 factor = 2.7
,适当扩大人脸区域以适配模型期望输入。
计算边界框中心点坐标
缩放比例 scale = (edge_size * 2.0) / maximum_edge
:确保人脸完整显示在模型输入区域
偏移量 cx, cy 计算用于平移
构建仿射矩阵 affine_matrix = [scale, 0, cx, 0, scale, cy]
,表示仿射变换的 2×3 矩阵