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

实现图像像素线性变化,具体数据关系可用公式表示

\[y=\alpha*x+\beta\]
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"""