完整教程:【K230 AI Demo 学习笔记1】AI2d

文章目录

一、预处理操作总览

二、核心操作详解

(一)padding 边沿填充

1. 作用与原理

2. 代码解析:get_padding_param函数

3. 相关 API:my_ai2d.pad

(二)resize 改变图像尺寸

1. 作用与原理

2. 插值算法对比

3. 相关 API:my_ai2d.resize

4. interp_method

5.interp_mode

(三)其他操作:shift、crop、build

1. shift(图像平移)

2. crop(图像裁剪)

3. build(构造预处理器)

三、配置预处理操作代码

(一)预处理代码

1. 预处理流程

2. 代码解析:config_preprocess函数


一、预处理操作总览

在 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 元素列表,对应[N左, N右, C左, C右, H左, H右, W左, W右]

    通常仅对 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]])

    菜鸟,有问题还望大佬指出(≧∀≦)ゞ

     文中代码出处:人脸识别 | 立创开发板技术文档中心

    API出处:5.2 Ai2d 模块 API 手册 — CanMV K230

    posted @ 2025-07-26 13:56  yjbjingcha  阅读(12)  评论(0)    收藏  举报