昇腾社区首页
中文
注册

功能及约束说明

功能说明

VPC(vision preprocessing core)功能包括:

  • 抠图,从输入图片中抠出需要用的图片区域,支持一图多框和多图多框。

  • 缩放

    • 针对不同分辨率的图像,VPC的处理方式可分为:

      • 非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格式之间的格式转换,目前的输入图片格式、输出图片格式,请参见约束说明

    • 图像灰度化,从YUV420SP格式的输出图像数据中只取Y分量的数据。

  • 图像灰度化,将彩色图像转化为灰度图像。需注意,输入为灰度图像、输出只能为灰度图像。

    昇腾310 AI处理器,实现图像灰度化的操作是从YUV420SP格式的输出图像数据中只取Y分量的数据。

    昇腾910 AI处理器,实现图像灰度化的操作是从YUV420SP格式的输出图像数据中只取Y分量的数据。

表1 关键概念解释

概念

描述

宽stride(widthStride)

指一行图像步长,表示输入/输出图片对齐后的宽,RGB格式或YUV格式的宽stride计算方式不一样。宽stride最小为32,最大为4096 * 4(宽是4096的argb格式的图像,1个像素占用4个字节,一行像素就占用4096*4,即宽stride)。

宽stride的对齐要求,请参见约束说明

高stride(heightStride)

指图像在内存中的行数,表示输入/输出图片对齐后的高。

高stride的对齐要求,请参见约束说明

上/下/左/右偏移

通过配置上偏移、下偏移、左偏移、右偏移可以实现两个功能:指定抠图区域或贴图区域的位置;控制抠图或贴图区域的宽、高,右偏移-左偏移+1=宽,下偏移-上偏移+1=高。
  • 左偏移:输入/输出图片中,抠图/贴图区域1、3两个点相对于0点水平向左偏移的值。

  • 右偏移:输入/输出图片中,抠图/贴图区域2、4两个点相对于0点水平向左偏移的值。

  • 上偏移:输入/输出图片中,抠图/贴图区域1、2两个点相对于0点垂直向上偏移的值。

  • 下偏移:输入/输出图片中,抠图/贴图区域3、4两个点相对于0点垂直向上偏移的值。

抠图区域

指用户指定的需抠出的图片区域。

抠图区域最小分辨率为10*6,最大分辨率为4096*4096。

贴图区域

指在输出图片中用户指定的区域,贴图区域最小分辨率为10*6,最大分辨率为4096*4096。

约束如下:
  • 贴图区奇数、偶数限制为:左偏移和上偏移为偶数、右偏移和下偏移为奇数。

  • 抠图区域不超出输入图片,贴图区域不超出输出图片。

  • 贴图时可直接放置在输出图片的最左侧,即相对输出图片的左偏移为0。

  • 贴图区域相对输出图片的左偏移16对齐。

  • 输出图片的贴图宽度建议16对齐,如果不是16对齐,会多写一段无效数据使其16对齐。

约束说明

  • 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缩放:
        支持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, 
    • 输入内存:
      • 内存地址起始要求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
    • 输入图片的宽stride、高stride对齐要求:
      • 对于不同图像格式,宽stride的计算公式不同:
        • YUV400、YUV420SP、YUV422SP、YUV444SP:输入图片的宽(width)对齐到16。
        • YUV422packed:输入图片的宽(width)对齐到16后,再乘以2(宽16对齐,每个像素占2个字节)。
        • YUV444packed、RGB888:输入图片的宽(width)对齐到16,再乘以3(宽16对齐,每个像素占3个字节)。
        • ARGB8888:输入图片的宽(width)对齐到16后,再乘以4(宽16对齐,每个像素占4个字节)。
      • 高stride:

        昇腾310 AI处理器,需要2对齐。

        昇腾910 AI处理器,需要2对齐。

  • VPC输出的约束
    • 输出图片分辨率:

      10*6~4096*4096

      输出图片的宽高限制跟输出图片格式有关,在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, 
    • 输出内存:
    • 输出图片的宽stride、高stride对齐要求:
      • 宽stride:16对齐。
      • 高stride:

        昇腾310 AI处理器,需要2对齐。

        昇腾910 AI处理器,需要2对齐。

  • VPC抠图、贴图约束
    • 抠图区域不超出输入图片,贴图区域不超出输出图片。
    • 最大贴图个数256。
    • 抠图、贴图区域的奇数、偶数限制为:

      昇腾310 AI处理器,贴图区域奇数、偶数限制为:左偏移和上偏移为偶数、右偏移和下偏移为奇数。

      昇腾910 AI处理器,贴图区域奇数、偶数限制为:左偏移和上偏移为偶数、右偏移和下偏移为奇数。

    • 贴图区域相对输出图片的左偏移16对齐。

      贴图时可直接放置在输出图片的最左侧,即相对输出图片的左偏移为0,0也满足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

功能示意图

图1 VPC功能示意图(抠图+缩放+叠加)
图2 VPC功能示意图(拼接)
图3 VPC功能示意图(等比例缩放,即缩放前后图片的宽高比例相同)

性能指标说明(昇腾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

参考说明

RGB、YUV格式图像的各分量排布示意图。示例:SP图像以YUV420SP为例,Packed和RGB图像以ARGB图像为例。