6.5. 图形运算加速模块
BMCV提供了一套基于算丰深度学习处理器优化的机器视觉库,目前可以完成色彩空间转换、尺度变换、仿射变换、投射变换、线性变换、画框、JPEG编码、BASE64编码、NMS、排序、特征匹配等操作。关于BMCV模块详细内容请阅读《 BMCV开发参考手册 》。
Python接口的实现请参考《 SOPHON-SAIL用户手册 》。
BMCV API均是围绕bm_image来进行的。一个bm_image结构对应于一张图片。
6.5.1. C语言编程接口
bm_image结构体
1struct bm_image {
2 int width;
3 int height;
4 bm_image_format_ext image_format;
5 bm_data_format_ext data_type;
6 bm_image_private* image_private;
7};
bm_image 结构成员包括图片的宽高,图片格式,图片数据格式,以及该结构的私有数据。
图片格式 image_format枚举类型
1typedef enum bm_image_format_ext_{
2 FORMAT_YUV420P,
3 FORMAT_NV12,
4 FORMAT_NV21,
5 FORMAT_NV16,
6 FORMAT_NV61,
7 FORMAT_RGB_PLANAR,
8 FORMAT_BGR_PLANAR,
9 FORMAT_RGB_PACKED,
10 FORMAT_BGR_PACKED,
11 FORMAT_GRAY,
12 FORMAT_COMPRESSED
13}bm_image_format_ext;
格式 |
说明 |
---|---|
FORMAT_YUV420P |
表示预创建一个YUV420格式的图片,有三个plane |
FORMAT_NV12 |
表示预创建一个NV12格式的图片,有两个plane |
FORMAT_NV21 |
表示预创建一个NV21格式的图片,有两个plane |
FORMAT_RGB_PLANAR |
表示预创建一个RGB格式的图片,RGB分开排列,有一个plane |
FORMAT_BGR_PLANAR |
表示预创建一个BGR格式的图片,BGR分开排列,有一个plane |
FORMAT_RGB_PACKED |
表示预创建一个RGB格式的图片,RGB交错排列,有一个plane |
FORMAT_BGR_PACKED |
表示预创建一个BGR格式的图片,BGR交错排列,有一个plane |
FORMAT_GRAY |
表示预创建一个灰度图格式的图片,有一个plane |
FORMAT_COMPRESSED |
表示预创建一个VPU内部压缩格式的图片,有四个plane |
数据存储格式枚举
1typedef enum bm_image_data_format_ext_{
2 DATA_TYPE_EXT_FLOAT32,
3 DATA_TYPE_EXT_1N_BYTE,
4 DATA_TYPE_EXT_4N_BYTE,
5 DATA_TYPE_EXT_1N_BYTE_SIGNED,
6 DATA_TYPE_EXT_4N_BYTE_SIGNED,
7}bm_image_data_format_ext;
数据格式 |
说明 |
---|---|
DATA_TYPE_EXT_FLOAT32 |
表示所创建的图片数据格式为单精度浮点数 |
DATA_TYPE_EXT_1N_BYTE |
表示所创建图片数据格式为普通带符号1N INT8 |
DATA_TYPE_EXT_4N_BYTE |
表示所创建图片数据格式为4N INT8,即四张带符号INT8图片数据交错排列 |
DATA_TYPE_EXT_1N_BYTE_SIGNED |
表示所创建图片数据格式为普通无符号1N UINT8 |
DATA_TYPE_EXT_4N_BYTE |
表示所创建图片数据格式为4N UINT8,即四张无符号INT8图片数据交错排列 |
关于bm_image初始化,我们不建议用户直接填充bm_image结构使用,而是通过以下API来创建/销毁一个bm_image结构
bm_image_create_batch
创建物理内存连续的多个bm image。
1 /*
2 * @param [in] handle handle of low level device
3 * @param [in] img_h image height
4 * @param [in] img_w image width
5 * @param [in] img_format format of image: BGR or YUV
6 * @param [in] data_type data type of image: INT8 or FP32
7 * @param [out] image pointer of bm image object
8 * @param [in] batch_num batch size
9 */
10 static inline bool bm_image_create_batch (bm_handle_t handle,
11 int img_h,
12 int img_w,
13 bm_image_format_ext img_format,
14 bm_image_data_format_ext data_type,
15 bm_image *image,
16 int batch_num)
bm_image_destroy_batch
释放物理内存连续的多个bm image。要和bm_image_create_batch接口成对使用。
1/*
2* @param [in] image pointer of bm image object
3* @param [in] batch_num batch size
4*/
5static inline bool bm_image_destroy_batch (bm_image *image, int batch_num)
bm_image_alloc_contiguous_mem
为多个 image 分配连续的内存
1bm_status_t bm_image_alloc_contiguous_mem(
2 int image_num,
3 bm_image *images,
4 int bmcv_image_usage
5);
参数 |
说明 |
---|---|
int image_num |
待分配内存的 image 个数 |
bm_image *images |
待分配内存的 image 的指针 |
int bmcv_image_usage |
已经为客户默认设置了参数,(如果客户对于所分配内存位置有要求,可以通过该参数进行制定) |
bm_image_free_contiguous_mem
释放通过bm_image_alloc_contiguous_mem申请的内存
1bm_status_t bm_image_free_contiguous_mem(
2 int image_num,
3 bm_image *images
4 );
参数 |
说明 |
---|---|
int image_num |
待分配内存的 image 个数 |
bm_image *images |
待分配内存的 image 的指针 |
bmcv_image_vpp_convert
BM1684上有专门的视频后处理硬件,满足一定条件下可以一次实现csc + crop + resize功能,速度比智能视觉深度学习处理器更快。
1bmcv_image_vpp_convert(
2bm_handle_t handle,
3 int output_num,
4 bm_image input,
5 bm_image * output,
6 bmcv_rect_t * crop_rect,
7 bmcv_resize_algorithm algorithm = BMCV_INTER_LINEAR);
该API将输入图像格式转化为输出图像格式,并支持crop + resize功能, 支持从1张输入中crop多张输出并resize到输出图片大小。
参数 |
说明 |
---|---|
bm_handle_t handle |
设备环境句柄,通过调用bm_dev_request获取 |
int output_num |
输出 bm_image 数量,和src image的crop 数量相等,一个src crop 输出一个dst bm_image |
bm_image input |
输入bm_image对象 |
bm_image* output |
输出bm_image对象指针 |
bmcv_rect_t * crop_rect |
每个输出bm_image对象所对应的在输入图像上crop的参数,包括起始点x坐标、起始点y坐标、crop图像的宽度以及crop图像的高度,具体请查看BMCV用户开发手册 |
bmcv_resize_algorithm algorithm = BMCV_INTER_LINEAR) |
resize算法选择,包括 BMCV_INTER_NEAREST 和 BMCV_INTER_LINEAR 两种,默认情况下是双线性差值 |
bmcv_convert_to
实现图像像素线性变化,具体数据关系可用公式表示
1bm_status_t bmcv_convert_to (bm_handle_t handle,int input_num,
2 bmcv_convert_to_attr convert_to_attr,
3 bm_image* input, bm_image* output)
参数 |
说明 |
---|---|
bm_handle_thandle |
输入的bm_handle句柄 |
int input_num |
输入图片数。最多支持4 |
bmcv_convert_to_attr convert_to_attr |
每张图片对应的配置参数 |
bm_image* input |
输入bm_image。每个bm_image外部需要调用bmcv_image_create创建。image内存可以使用bmcv_image_dev_mem_alloc或者bmcv_image_copy_to_device来开辟新的内存,或者使用bmcv_image_attach来attach已有的内存。 |
bm_image*output |
输出bm_image。每个bm_image外部需要调用bmcv_image_create创建。image内存可以通过bmcv_image_dev_mem_alloc来开辟新的内存,或者使用bmcv_image_attach来attach已有的内存。如果不主动分配将在api内部进行自行分配 |
结构体 bmcv_convert_to_attr_s
1typedef struct bmcv_convert_to_attr_s {
2 float alpha_0;
3 float beta_0;
4 float alpha_1;
5 float beta_1;
6 float alpha_2;
7 float beta_2;
8} bmcv_convert_to_attr;
参数 |
说明 |
---|---|
alpha_0 |
描述了第0个channel进行线性变换的系数 |
beta_0 |
描述了第0个channel进行线性变换的偏移 |
alpha_1 |
描述了第1个channel进行线性变换的系数 |
beta_1 |
描述了第1个channel进行线性变换的偏移 |
alpha_2 |
描述了第2个channel进行线性变换的系数 |
beta_2 |
描述了第2个channel进行线性变换的偏移 |
结构体描述了三通道中的alpha和beta。实际要根据推理的输入数据是几通道来进行参数配置。
6.5.2. Python语言编程接口
本章节只简要介绍了用例 YOLOv5 所用到的接口函数。
更多接口定义请查阅《 SOPHON-SAIL用户手册 》。
init
1def __init__(handle):
2""" Constructor.
3Parameters
4---------
5handle : sail.Handle Handle instance
6"""
convert_to
1def convert_to(input, alpha_beta):
2""" Applies a linear transformation to an image.
3Parameters
4---------
5input : sail.BMImage Input image
6alpha_beta: tuple (a0, b0), (a1, b1), (a2, b2) factors
7Returns
8---------
9output : sail.BMImage Output image
10"""
convert_format
1def convert_format(input, output):
2"""Convert input to output format.
3
4Parameters
5----------
6input : sail.BMImage
7 BMimage instance
8output : sail.BMImage
9 output image
10"""
vpp_crop_and_resize_padding
1def vpp_crop_and_resize_padding(input, crop_x0, crop_y0, crop_w, crop_h, resize_w, resize_h, padding):
2""" Crop then resize an image using vpp.
3
4Parameters
5----------
6input : sail.BMImage
7 Input image
8crop_x0 : int
9 Start point x of the crop window
10crop_y0 : int
11 Start point y of the crop window
12crop_w : int
13 Width of the crop window
14crop_h : int
15 Height of the crop window
16resize_w : int
17 Target width
18resize_h : int
19 Target height
20padding : PaddingAtrr
21 padding info
22
23Returns
24----------
25output : sail.BMImage
26 Output image
27"""