功能及约束说明
功能说明
VPC(vision preprocessing core)功能包括:
-
-
非8K缩放,用于处理“widthStride在32~4096(包括4096)范围内,heightStride在6~4096”的输入图片,不同格式的输入图片,widthStride的取值范围不同,详细描述参见约束说明。
- 8K缩放:
昇腾310 AI处理器,8K缩放用于处理“widthStride在4096~8192范围内或heightStride在4096~8192范围内(不包括4096)”的输入图片,支持的输入图片格式,请参见约束说明。
昇腾910 AI处理器,8K缩放用于处理“widthStride在4096~8192范围内或heightStride在4096~8192范围内(不包括4096)”的输入图片,支持的输入图片格式,请参见约束说明。
-
叠加,从输入图片中抠出来的图,对抠出的图进行缩放后,放在用户输出图片的指定区域,输出图片可以是空白图片(由用户申请的空输出内存产生的),也可以是已有图片(由用户申请输出内存后将已有图片读入输出内存),只有当输出图片是已有图片时,才表示叠加。
-
支持RGB格式、YUV格式之间的格式转换,目前的输入图片格式、输出图片格式,请参见约束说明。
- 图像灰度化,将彩色图像转化为灰度图像。需注意,输入为灰度图像、输出只能为灰度图像。
昇腾310 AI处理器,实现图像灰度化的操作是从YUV420SP格式的输出图像数据中只取Y分量的数据。
昇腾910 AI处理器,实现图像灰度化的操作是从YUV420SP格式的输出图像数据中只取Y分量的数据。
概念 |
描述 |
---|---|
宽stride(widthStride) |
指一行图像步长,表示输入/输出图片对齐后的宽,RGB格式或YUV格式的宽stride计算方式不一样。宽stride最小为32,最大为4096 * 4(宽是4096的argb格式的图像,1个像素占用4个字节,一行像素就占用4096*4,即宽stride)。 宽stride的对齐要求,请参见约束说明。 |
高stride(heightStride) |
指图像在内存中的行数,表示输入/输出图片对齐后的高。 高stride的对齐要求,请参见约束说明。 |
上/下/左/右偏移 |
|
抠图区域 |
指用户指定的需抠出的图片区域。 抠图区域最小分辨率为10*6,最大分辨率为4096*4096。 |
贴图区域 |
指在输出图片中用户指定的区域,贴图区域最小分辨率为10*6,最大分辨率为4096*4096。 |
约束说明
- VPC输入的约束:
- 输入图片分辨率:
- 非8K缩放:
- YUV400/YUV420SP/YUV422SP/yuv444sp:widthStride在32~4096(包括4096)范围内,heightStride在6~4096。
- YUV422packed:widthStride/2在32~4096(包括4096)范围内,heightStride在6~4096。
- YUV444packed/RGB888:widthStride/3在32~4096(包括4096)范围内,heightStride在6~4096。
- XRGB8888:widthStride/4在32~4096(包括4096)范围内,heightStride在6~4096。
- 8K缩放:
昇腾310 AI处理器,8K缩放用于处理“widthStride在4096~8192范围内或heightStride在4096~8192范围内(不包括4096)”的输入图片。
昇腾910 AI处理器,8K缩放用于处理“widthStride在4096~8192范围内或heightStride在4096~8192范围内(不包括4096)”的输入图片。
输入图片的宽高限制跟输入图片格式有关,在VPC支持的输入图片格式中,对于YUV420SP格式,宽高均需要2对齐;对于YUV422SP或者YUV422Packed格式,宽度需要2对齐,高度无限制;对于YUV440SP格式,宽度无限制,高度需要2对齐;其它格式宽高没有限制。
- 非8K缩放:
- 输入图片格式:
- 非8K缩放:
支持acldvppPixelFormat枚举值中的如下枚举项:
PIXEL_FORMAT_YUV_400 = 0, PIXEL_FORMAT_YUV_SEMIPLANAR_420 = 1, PIXEL_FORMAT_YVU_SEMIPLANAR_420 = 2, PIXEL_FORMAT_YUV_SEMIPLANAR_422 = 3, PIXEL_FORMAT_YVU_SEMIPLANAR_422 = 4, PIXEL_FORMAT_YUV_SEMIPLANAR_444 = 5, PIXEL_FORMAT_YVU_SEMIPLANAR_444 = 6, PIXEL_FORMAT_YUYV_PACKED_422 = 7, PIXEL_FORMAT_UYVY_PACKED_422 = 8, PIXEL_FORMAT_YVYU_PACKED_422 = 9, PIXEL_FORMAT_VYUY_PACKED_422 = 10, PIXEL_FORMAT_YUV_PACKED_444 = 11, PIXEL_FORMAT_RGB_888 = 12, PIXEL_FORMAT_BGR_888 = 13, PIXEL_FORMAT_ARGB_8888 = 14, PIXEL_FORMAT_ABGR_8888 = 15, PIXEL_FORMAT_RGBA_8888 = 16, PIXEL_FORMAT_BGRA_8888 = 17, PIXEL_FORMAT_YUV_SEMIPLANAR_440 = 1000, PIXEL_FORMAT_YVU_SEMIPLANAR_440,
在昇腾310 AI处理器上,不支持以上枚举值中的PIXEL_FORMAT_YUV_SEMIPLANAR_440、PIXEL_FORMAT_YVU_SEMIPLANAR_440。
在昇腾910 AI处理器上,不支持以上枚举值中的PIXEL_FORMAT_YUV_SEMIPLANAR_440、PIXEL_FORMAT_YVU_SEMIPLANAR_440。
- 8K缩放:
昇腾310 AI处理器支持acldvppPixelFormat中的如下值:
PIXEL_FORMAT_YUV_SEMIPLANAR_420 = 1, PIXEL_FORMAT_YVU_SEMIPLANAR_420 = 2,
昇腾910 AI处理器支持acldvppPixelFormat中的如下值:PIXEL_FORMAT_YUV_SEMIPLANAR_420 = 1, PIXEL_FORMAT_YVU_SEMIPLANAR_420 = 2,
- 非8K缩放:
- 输入内存:
- 内存地址起始要求16对齐。其中128对齐性能最高。调用acl.media.dvpp_malloc接口/acl.media.dvpp_free接口申请或释放内存。
- 内存大小(单位byte)与图片数据的格式相关,计算公式如下:
- YUV400:
昇腾310 AI处理器,计算公式:widthStride*heightStride*3/2
昇腾910 AI处理器,计算公式:widthStride*heightStride*3/2
- YUV420SP:widthStride*heightStride*3/2
- YUV422SP:widthStride*heightStride*2
- YUV444SP:widthStride*heightStride*3
- YUV422packed:widthStride*heightStride
- YUV444packed、RGB888:widthStride*heightStride
- ARGB8888:widthStride*heightStride
- YUV400:
- 输入图片的宽stride、高stride对齐要求:
- 输入图片分辨率:
- VPC输出的约束:
- 输出图片分辨率:
输出图片的宽高限制跟输出图片格式有关,在VPC支持的输出图片格式中,对于YUV420SP格式,宽高均需要2对齐;对于YUV422SP格式,宽度需要2对齐,高度无限制;其它格式宽高没有限制。
- 输出图片格式:
昇腾310 AI处理器支持acldvppPixelFormat枚举值中的如下枚举项:
PIXEL_FORMAT_YUV_SEMIPLANAR_420 = 1, PIXEL_FORMAT_YVU_SEMIPLANAR_420 = 2,
昇腾910 AI处理器支持acldvppPixelFormat枚举值中的如下枚举项:PIXEL_FORMAT_YUV_SEMIPLANAR_420 = 1, PIXEL_FORMAT_YVU_SEMIPLANAR_420 = 2,
- 输出内存:
- 内存地址起始要求16对齐。其中128对齐性能最高。调用acl.media.dvpp_malloc接口/acl.media.dvpp_free接口申请或释放内存。
- 内存大小与图片数据的格式相关,计算公式请参见◦内存大小(单位byte)与图片数据的格式相关,...。
- 输出图片的宽stride、高stride对齐要求:
- 输出图片分辨率:
- VPC抠图、贴图约束:
- 抠图区域不超出输入图片,贴图区域不超出输出图片。
- 最大贴图个数256。
- 抠图、贴图区域的奇数、偶数限制为:
昇腾310 AI处理器,贴图区域奇数、偶数限制为:左偏移和上偏移为偶数、右偏移和下偏移为奇数。
昇腾910 AI处理器,贴图区域奇数、偶数限制为:左偏移和上偏移为偶数、右偏移和下偏移为奇数。
- 贴图区域相对输出图片的左偏移16对齐。
- 贴图区域的宽建议16对齐,如果不是16对齐,会多写一段无效数据使其16对齐。
- 缩放场景下,贴图/抠图的宽高缩放比例范围:
昇腾310 AI处理器,贴图/抠图的宽高缩放比例范围:[1/32, 16]。
昇腾910 AI处理器,贴图/抠图的宽高缩放比例范围:[1/32, 16]。
- 等比例缩放场景下,对贴图偏移的要求:
昇腾310 AI处理器,当输出图片格式为YUV420SP格式时,贴图左偏移满足16对齐、上偏移2对齐的要求即可。
昇腾910 AI处理器,当输出图片格式为YUV420SP格式时,贴图左偏移满足16对齐、上偏移2对齐的要求即可。
- VPC的输出作为模型推理的输入时:
昇腾310 AI处理器,由于经过VPC处理的输出图片中的贴图区域的宽*高有16*2对齐的约束,因此输出图片中的贴图区域的宽、高有一些补边的无效数据,所以在VPC贴图前,应首先使用VPC的缩放功能将贴图区域的分辨率缩放成16*2对齐,否则无效数据会影响模型推理的精度。
昇腾910 AI处理器,由于经过VPC处理的输出图片中的贴图区域的宽*高有16*2对齐的约束,因此输出图片中的贴图区域的宽、高有一些补边的无效数据,所以在VPC贴图前,应首先使用VPC的缩放功能将贴图区域的分辨率缩放成16*2对齐,否则无效数据会影响模型推理的精度。
- 输入不同分辨率图片的处理约束:
- 输入图片分辨率已对齐的情况:如1088X720_nv12.yuv,可按内存对齐要求直接拷贝图片数据到device侧内存当中运算。
- 输入图片分辨率未对齐的情况:如1080X720_nv12.yuv,1080的宽对齐为1088,此时需要根据不同格式图像的分量排布方式,将数据重新排布并拷贝到device内存。
- RGB、YUV格式图像的各分量排布参考说明请参见参考说明。
示例代码如下:
RUN_MODE = {'device': 0, 'host': 1} """ uv 宽和高排布规则 图片格式详见acldvppPixelFormat ,从0到17 """ VPC_UV_H = { (0,): lambdax: 0, (1, 2): lambdax: x // 2 } VPC_UV_W_COEFFICIENT = { (5, 6, 7, 8, 9, 10): lambdax: 2, (11, 12, 13): lambdax: 3, (14, 15, 16, 17): lambdax: 4 } def align_size(orig_size, alignment): if not alignment: return 0 alignment_h = alignment - 1 return (orig_size + alignment_h) // alignment * alignment def check_ret(message, ret): if ret != 0: raise Exception("{} failed ret = {}".format(message, ret)) def get_align_size(align_dic, pixel_fmt, default_value=0): for key in align_dic.keys(): if pixel_fmt in key: return align_dic.get(key)(default_value) return default_value def align_semi_planar_image(pic_desc, in_buf, image_buffer, image_buf_size, mem_type): # yuv memory arrangement, y go first for i inrange(pic_desc['h']): ret = acl.rt.memcpy(in_buf + i * pic_desc['w_stride'], pic_desc['w'], image_buffer + i * pic_desc['w'], pic_desc['w'], mem_type) check_ret("acl.rt.memcpy", ret) # then uv uv_h = get_align_size(VPC_UV_H, pic_desc['format'], default_value=pic_desc['h']) uv_w_coefficient = get_align_size(VPC_UV_W_COEFFICIENT, pic_desc['format'], default_value=1) src_data = in_buf + pic_desc['w_stride'] * pic_desc['h_stride'] dst_data = image_buffer + pic_desc['w'] * pic_desc['h'] for i inrange(uv_h): ret = acl.rt.memcpy(src_data + i * pic_desc['w_stride'] * uv_w_coefficient, pic_desc['w'] * uv_w_coefficient, dst_data + i * pic_desc['w'] * uv_w_coefficient, pic_desc['w'] * uv_w_coefficient, mem_type) check_ret("acl.rt.memcpy", ret) def align_packed_image(pic_desc, in_buf, image_buffer, image_buf_size, mem_type): coefficient = get_align_size(VPC_UV_W_COEFFICIENT, pic_desc['format'], default_value=1) for i inrange(pic_desc['h']): ret = acl.rt.memcpy(in_buf + i * pic_desc['w_stride'], pic_desc['w'] * coefficient, image_buffer + i * pic_desc['w'] * coefficient, pic_desc['w'] * coefficient, mem_type) check_ret("acl.rt.memcpy", ret) """ 调用示例:输入分辨率未对齐的YUV图片,按smi-planar和packed的排布方式重新排布 pic_desc = { 'file_name': file, 'buf_size': align_in_buffer_size, 'format': in_format, 'w': in_width, 'h': in_height, 'w_stride': align_in_width, 'h_stride': align_in_height } """ def check_is_device(): run_mode, ret = acl.rt.get_run_mode() check_ret("acl.rt.get_run_mode", ret) return run_mode == RUN_MODE.get('device') def get_adjust_pic_buffer(pic_desc): pic_dev, ret = acl.media.dvpp_malloc(pic_desc['buf_size']) check_ret("acl.media.dvpp_malloc", ret) np_file = np.fromfile(pic_desc['file_name'], dtype=np.byte) file_size = np_file.size image_ptr = acl.util.numpy_to_ptr(np_file) if not check_is_device(): PIXEL_FORMAT_YVU_SEMIPLANAR_444 = 6 if pic_desc['format'] <= PIXEL_FORMAT_YVU_SEMIPLANAR_444: align_semi_planar_image(pic_desc, pic_dev, image_ptr, file_size, 1) else: align_packed_image(pic_desc, pic_dev, image_ptr, file_size, 1) else: # app is running in device if pic_desc['format'] <= PIXEL_FORMAT_YVU_SEMIPLANAR_444: align_semi_planar_image(pic_desc, pic_dev, image_ptr, file_size, 3) else: align_packed_image(pic_desc, pic_dev, image_ptr, file_size, 3) return pic_dev
功能示意图



性能指标说明(昇腾310 AI处理器)
- 对于非8K缩放,基本场景性能指标参考如下:
对于1080p的图像,若存在Host->Device的图片数据拷贝,由于拷贝带宽限制,最大总帧率约为1000fps。
对于4K的图像,若存在Host->Device的图片数据拷贝,由于拷贝带宽限制,最大总帧率约为250fps。场景举例
总帧率
- 输入图像分辨率:1080p(1920*1080)
- 输出图像分辨率:1080p(1920*1080)
- 输入/输出图片格式:YUV420SP
- n路(n<4,1路对应一个线程)
n*360fps
- 输入图像分辨率:1080p(1920*1080)
- 输出图像分辨率:1080p(1920*1080)
- 输入/输出图片格式:YUV420SP
- n路(n≥4,1路对应一个线程)
1440fps
- 输入图像分辨率:4K图像(3840*2160)
- 输出图像分辨率:4K图像(3840*2160)
- 输入/输出图片格式:YUV420SP
- n路(n<4,1路对应一个线程)
n*90fps
- 输入图像分辨率:4K图像(3840*2160)
- 输出图像分辨率:4K图像(3840*2160)
- 输入/输出图片格式:YUV420SP
- n路(n≥4,1路对应一个线程)
360fps
- 对于8K缩放,典型场景性能指标参考如下:
场景举例
总帧率
- 输入图像分辨率:8K图像(7680*4320)
- 输出图像分辨率:1080p(1920*1080)
- 输入/输出图片格式:YUV420SP
- n路(n<4,1路对应一个线程)
n*25fps
- 输入图像分辨率:8K图像(7680*4320)
- 输出图像分辨率:1080p(1920*1080)
- 输入/输出图片格式:YUV420SP
- n路(n≥4,1路对应一个线程)
100fps
- 输入图像分辨率:8K图像(7680*4320)
- 输出图像分辨率:4K图像(3840*2160)
- 输入/输出图片格式:YUV420SP
- n路(n<4,1路对应一个线程)
n*25fps
- 输入图像分辨率:8K图像(7680*4320)
- 输出图像分辨率:4K图像(3840*2160)
- 输入/输出图片格式:YUV420SP
- n路(n≥4,1路对应一个线程)
100fps
性能指标说明(昇腾910 AI处理器)
- 对于非8K缩放,基本场景性能指标参考如下:
场景举例
总帧率
- 输入图像分辨率:1080p(1920*1080)
- 输出图像分辨率:1080p(1920*1080)
- 输入/输出图片格式:YUV420SP
- n路(n<16,1路对应一个线程)
n*360fps
- 输入图像分辨率:1080p(1920*1080)
- 输出图像分辨率:1080p(1920*1080)
- 输入/输出图片格式:YUV420SP
- n路(n≥16,1路对应一个线程)
5760fps
- 输入图像分辨率:4K图像(3840*2160)
- 输出图像分辨率:4K图像(3840*2160)
- 输入/输出图片格式:YUV420SP
- n路(n<16,1路对应一个线程)
n*90fps
- 输入图像分辨率:4K图像(3840*2160)
- 输出图像分辨率:4K图像(3840*2160)
- 输入/输出图片格式:YUV420SP
- n路(n≥16,1路对应一个线程)
1440fps
- 对于8K缩放,典型场景性能指标参考如下:
场景举例
总帧率
- 输入图像分辨率:8K图像(7680*4320)
- 输出图像分辨率:1080p(1920*1080)
- 输入/输出图片格式:YUV420SP
- n路(n<16,1路对应一个线程)
n*25fps
- 输入图像分辨率:8K图像(7680*4320)
- 输出图像分辨率:1080p(1920*1080)
- 输入/输出图片格式:YUV420SP
- n路(n≥16,1路对应一个线程)
400fps
- 输入图像分辨率:8K图像(7680*4320)
- 输出图像分辨率:4K图像(3840*2160)
- 输入/输出图片格式:YUV420SP
- n路(n<16,1路对应一个线程)
n*25fps
- 输入图像分辨率:8K图像(7680*4320)
- 输出图像分辨率:4K图像(3840*2160)
- 输入/输出图片格式:YUV420SP
- n路(n≥16,1路对应一个线程)
400fps