VPC(vision preprocessing core)功能包括:
非8K缩放,用于处理“widthStride在32~4096(包括4096)范围内,heightStride在6~4096”的输入图片,不同格式的输入图片,widthStride的取值范围不同,详细描述参见约束说明。
昇腾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。 |
昇腾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对齐;其它格式宽高没有限制。
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。
PIXEL_FORMAT_YUV_SEMIPLANAR_420 = 1, PIXEL_FORMAT_YVU_SEMIPLANAR_420 = 2,
PIXEL_FORMAT_YUV_SEMIPLANAR_420 = 1, PIXEL_FORMAT_YVU_SEMIPLANAR_420 = 2,
昇腾310 AI处理器,计算公式:widthStride*heightStride*3/2
昇腾910 AI处理器,计算公式:widthStride*heightStride*3/2
输出图片的宽高限制跟输出图片格式有关,在VPC支持的输出图片格式中,对于YUV420SP格式,宽高均需要2对齐;对于YUV422SP格式,宽度需要2对齐,高度无限制;其它格式宽高没有限制。
PIXEL_FORMAT_YUV_SEMIPLANAR_420 = 1, PIXEL_FORMAT_YVU_SEMIPLANAR_420 = 2,
PIXEL_FORMAT_YUV_SEMIPLANAR_420 = 1, PIXEL_FORMAT_YVU_SEMIPLANAR_420 = 2,
昇腾310 AI处理器,贴图区域奇数、偶数限制为:左偏移和上偏移为偶数、右偏移和下偏移为奇数。
昇腾910 AI处理器,贴图区域奇数、偶数限制为:左偏移和上偏移为偶数、右偏移和下偏移为奇数。
昇腾310 AI处理器,贴图/抠图的宽高缩放比例范围:[1/32, 16]。
昇腾910 AI处理器,贴图/抠图的宽高缩放比例范围:[1/32, 16]。
昇腾310 AI处理器,当输出图片格式为YUV420SP格式时,贴图左偏移满足16对齐、上偏移2对齐的要求即可。
昇腾910 AI处理器,当输出图片格式为YUV420SP格式时,贴图左偏移满足16对齐、上偏移2对齐的要求即可。
昇腾310 AI处理器,由于经过VPC处理的输出图片中的贴图区域的宽*高有16*2对齐的约束,因此输出图片中的贴图区域的宽、高有一些补边的无效数据,所以在VPC贴图前,应首先使用VPC的缩放功能将贴图区域的分辨率缩放成16*2对齐,否则无效数据会影响模型推理的精度。
昇腾910 AI处理器,由于经过VPC处理的输出图片中的贴图区域的宽*高有16*2对齐的约束,因此输出图片中的贴图区域的宽、高有一些补边的无效数据,所以在VPC贴图前,应首先使用VPC的缩放功能将贴图区域的分辨率缩放成16*2对齐,否则无效数据会影响模型推理的精度。
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
对于1080p的图像,若存在Host->Device的图片数据拷贝,由于拷贝带宽限制,最大总帧率约为1000fps。
场景举例 |
总帧率 |
---|---|
|
n*360fps |
|
1440fps |
|
n*90fps |
|
360fps |
场景举例 |
总帧率 |
---|---|
|
n*25fps |
|
100fps |
|
n*25fps |
|
100fps |
场景举例 |
总帧率 |
---|---|
|
n*360fps |
|
5760fps |
|
n*90fps |
|
1440fps |
场景举例 |
总帧率 |
---|---|
|
n*25fps |
|
400fps |
|
n*25fps |
|
400fps |