AI Demo说明文档
1. AI Demo开发框架介绍
1.1. AI Demo开发框架
为了帮助用户简化AI部分的开发,基于K230_CanMV提供的API接口,搭建了配套的AI 开发框架。框架结构如下图所示:
Camera默认出两路图像,一路格式为YUV420,直接给到Display显示;另一路格式为RGB888,给到AI部分进行处理。AI主要实现任务的前处理、推理和后处理流程,得到后处理结果后将其绘制在osd image实例上,并送给Display叠加显示。
1.2. 接口介绍
1.2.1. PipeLine
我们将Media部分的代码封装在PipeLine类型中,通过固定的接口实现整个流程操作。
其中PipeLine类提供的接口包括:
-
初始化参数包括:
(1)rgb888p_size:list类型,预设给到AI部分的图像分辨率;如rgb888p_size=[1920,1080]。
(2)display_size:list类型,显示部分Display的分辨率;如display_size=[1920,1080]。
(3)display_mode:str类型,显示模式,包括”hdmi“和”lcd“;如display_mode=”hdmi“。
(4)debug_mode:int类型,耗时调试模式,如果大于0,打印操作耗时;如debug_mode=0。
-
create(sensor=None,hmirror=None,vfilp=None):
(1)sensor:参数为可选参数,类型为Sensor对象,可自主配置现有CanMV、01Studio和k230d zero开发板实现了自动探测,可以默认使用create()实现。
(2)hmirror:默认为None,当主动设置时为bool类型(True/False),表示是否实现水平方向镜像显示。
(3)vflip: 默认为None,当主动设置时为bool类型(True/False),表示是否实现垂直方向翻转。
-
get_frame():返回一帧ulab.numpy.ndarray类型图像数据,分辨率为rgb888p_size,排布为CHW。
-
show_image():PipeLine实例中预设一帧OSD图像,该接口将成员变量osd_img显示在屏幕上。
-
destroy():销毁PipeLine实例。
下面给出无AI部分的示例代码:
from libs.PipeLine import PipeLine, ScopedTiming
from media.media import *
import gc
import sys,os
if __name__ == "__main__":
# 显示模式,默认"hdmi",可以选择"hdmi"和"lcd"
display_mode="hdmi"
if display_mode=="hdmi":
display_size=[1920,1080]
else:
display_size=[800,480]
# 初始化PipeLine,用于图像处理流程
pl = PipeLine(rgb888p_size=[1920,1080], display_size=display_size, display_mode=display_mode)
pl.create() # 创建PipeLine实例
try:
while True:
os.exitpoint() # 检查是否有退出信号
with ScopedTiming("total",1):
img = pl.get_frame() # 获取当前帧数据
print(img.shape)
gc.collect() # 垃圾回收
except Exception as e:
sys.print_exception(e) # 打印异常信息
finally:
pl.destroy() # 销毁PipeLine实例
上述代码中,通过pl.get_frame()
接口获取一帧分辨率为rgb888p_size的图像,类型为ulab.numpy.ndarray,排布为CHW。基于上面的代码得到了一帧图像给AI处理,您可以只 关注AI推理部分的操作。
图像AI开发过程包括:图像预处理、模型推理、输出后处理的过程,我们将整个过程封装在Ai2d类和AIBase类中。
1.2.2. Ai2d
对于Ai2d类,我们给出了常见的几种预处理方法,包括crop/shift/pad/resize/affine。该类别提供的接口包括:
- 初始化参数包括:
(1)debug_mode:int类型,耗时调试模式,如果大于0,打印操作耗时;如debug_mode=0。
- set_ai2d_dtype(input_format,output_format,input_type,output_type)
(1)input_format:ai2d预处理输入格式。
(2)output_format:ai2d预处理输出格式。
输入输出格式支持如下所示:
enum class ai2d_format
{
YUV420_NV12 = 0,
YUV420_NV21 = 1,
YUV420_I420 = 2,
NCHW_FMT = 3,
RGB_packed = 4,
RAW16 = 5,
}
输入格式 | 输出格式 | 备注 |
---|---|---|
YUV420_NV12 | RGB_planar/YUV420_NV12 | |
YUV420_NV21 | RGB_planar/YUV420_NV21 | |
YUV420_I420 | RGB_planar/YUV420_I420 | |
YUV400 | YUV400 | |
NCHW(RGB_planar) | NCHW(RGB_planar) | |
RGB_packed | RGB_planar/RGB_packed | |
RAW16 | RAW16/8 | 深度图,执行shift操作 |
(3)input_type:输入数据类型。
(4)output_type:输出数据类型。
下面是接口调用示例:
from libs.AI2D import Ai2d
import nncase_runtime as nn
my_ai2d=Ai2d(debug_mode=1)
my_ai2d.set_ai2d_type(nn.ai2d_format.NCHW_FMT, nn.ai2d_format.NCHW_FMT, np.uint8, np.uint8)
my_ai2d.set_ai2d_type(nn.ai2d_format.RGB_packed, nn.ai2d_format.NCHW_FMT, np.uint8, np.uint8)
-
crop(start_x,start_y,width,height):预处理crop函数。
(1)start_x:宽度方向的起始像素,int类型;
(2)start_y: 高度方向的起始像素,int类型;
(3)width: 宽度方向的crop长度,int类型;
(4)height: 高度方向的crop长度,int类型;
my_ai2d.crop(0,0,200,300)