完整教程:【K230 AI Demo 学习笔记1】AI2d
文章目录
一、预处理操作总览
在 AI 模型处理图像时,需先通过预处理将原始图像转换为模型可接受的尺寸,同时最大程度保留关键特征。AI2d 库提供了一系列预处理操作,包括padding(边沿填充)、resize(尺寸缩放)、shift(平移)、crop(裁剪),并通过build方法整合这些操作,形成完整的预处理流程。在这里对AI Demo中出现的预处理函数进行一个记录。
二、核心操作详解
(一)padding 边沿填充
1. 作用与原理
padding 的核心作用是在缩放图像至目标尺寸,通过填充边缘保持原始长宽比,避免失真
举个例子,将 160×90(16:9)的图像缩放到 40×30(4:3)若按各自比例缩放:宽度缩小 4 倍(160→40),高度缩小 3 倍(90→30),最终比例变为 4:3,
与原始 16:9 差异过大,导致图像拉伸 / 压缩失真若按统一比例缩放:选择两个缩放比例中较小的缩放比例(此处为 1/3)进行缩放,宽度变为 160/3≈53,高度变为 30,比例仍接近 16:9(53:30≈1.77)。此时通过填充左右边缘(总填充量为 40-53 的绝对值),将宽度补至 40,既适配目标尺寸,又保留图像原本的比例
2. 代码解析:get_padding_param
函数
该函数用于计算填充参数,核心逻辑是确定统一缩放比例后,计算需填充的边缘尺寸:
def get_padding_param(self, src_size, dst_size):
# 输入:原始尺寸(src_size)、目标尺寸(dst_size)
dst_w, dst_h = dst_size # 目标宽、高
input_width, input_high = src_size # 原始宽、高
# 计算宽、高方向的缩放比例
ratio_w = dst_w / input_width
ratio_h = dst_h / input_high
# 选择较小比例作为统一缩放比例(避免图像超出目标尺寸)
ratio = min(ratio_w, ratio_h)
# 计算缩放后的新尺寸
new_w = int(ratio * input_width)
new_h = int(ratio * input_high)
# 计算需填充的总宽度/高度(左右、上下均分)
dw = (dst_w - new_w) / 2 # 宽度方向单侧填充量
dh = (dst_h - new_h) / 2 # 高度方向单侧填充量
# 确定最终填充参数(此处仅填充下、右边缘,根据需求调整)
top = int(round(0))
bottom = int(round(dh * 2 + 0.1)) # 高度方向总填充量(下边缘)
left = int(round(0))
right = int(round(dw * 2 - 0.1)) # 宽度方向总填充量(右边缘)
return top, bottom, left, right
3. 相关 API:my_ai2d.pad
作用:根据计算的填充参数,对图像进行边缘填充,填充模式固定为0 ,填充值可以自定义
语法与参数:
my_ai2d.pad(
paddings=[0,0,0,0,5,5,15,15], # 填充尺寸(N/C/H/W四维度两侧填充量)
pad_mode=0, # 填充模式(0表示constant填充)
pad_val=[114,114,114] # 填充值(三通道RGB值)
)
paddings | 8 元素列表,对应 通常仅对 H(高度)和 W(宽度)填充。 |
pad_mode | 固定为 0(常量填充),即填充指定值。 |
pad_val | 填充的像素值,如[114,114,114] 为灰色,[0,0,0] 为黑色。 |
(二)resize 改变图像尺寸
1. 作用与原理
resize 用于将图像缩放到目标尺寸,核心是通过插值算法计算目标像素值,常见算法包括最近邻插值和双线性插值。
2. 插值算法对比
插值方法 | 特点 |
---|---|
最近邻 | 计算快,取最近像素值,边缘生硬 |
双线性 | 融合周围 4 像素加权值,平滑自然,保留更多细节 |
3. 相关 API:my_ai2d.resize
作用:配置缩放时的插值方法和对齐模式,控制缩放质量。
语法与参数:
my_ai2d.resize(
interp_method=nn.interp_method.tf_bilinear, # 插值方法
interp_mode=nn.interp_mode.half_pixel # 对齐模式
)
4. interp_method
resize预处理方法中的插值方法。分列如下:
方法 | 说明 |
---|---|
nn.interp_method.tf_nearest | tf的最近邻插值 |
nn.interp_method.tf_bilinear | tf的双线性插值 |
nn.interp_method.cv2_nearest | cv2的最近邻插值 |
nn.interp_method.cv2_bilinear | cv2的双线性插值 |
5.interp_mode
模式 | 说明 |
---|---|
nn.interp_mode.none | 不用特殊的对齐策略 |
nn.interp_mode.align_corner | 角点强制对齐 |
nn.interp_mode.half_pixel | 中心对齐 |
(三)其他操作:shift、crop、build
1. shift(图像平移)
作用:沿水平 / 垂直方向移动图像,常用于数据增强(如模拟不同视角)。
相关 API:无详细参数,需通过my_ai2d.shift(dx)
配置平移量(dx 为水平偏移,参数类型为int)
2. crop(图像裁剪)
作用:裁剪原始图像
相关 API:通过my_ai2d.crop(x1,y1,w,h)
配置裁剪区域 x1,y1为裁剪的起始坐标 w,h为裁剪的长和宽
3. build(构造预处理器)
作用:整合已配置的预处理操作(padding、resize 等),生成最终的预处理器,确保输入输出格式匹配模型。
原理:根据输入 / 输出尺寸(NCHW 格式),串联所有预处理步骤,形成完整的数据流。
相关 API:
my_ai2d.build(
ai2d_input_shape=[1,3,512,512], # 输入shape 即摄像头拍摄到的图片尺寸
ai2d_output_shape=[1,3,640,640] # 输出shape 即模型需要的图片尺寸
)
三、配置预处理操作代码
(一)预处理代码
1. 预处理流程
2. 代码解析:config_preprocess
函数
写入要使用的预处理函数,最后通过build来完成配置
def config_preprocess(self,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
top,bottom,left,right=self.get_padding_param()
self.ai2d.pad([0,0,0,0,top,bottom,left,right], 0, [0,0,0])
self.ai2d.resize(nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel)
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]])
菜鸟,有问题还望大佬指出(≧∀≦)ゞ
文中代码出处:人脸识别 | 立创开发板技术文档中心