CANN体验官第四期-随手记2
关于图片格式的转换,看了一些资料,这里汇整一下。
首先(图像/视频数据)预处理可以分为DVPP和AIPP,
- DVPP(Digital Video Pre-Processor):昇腾AI处理器内置的图像处理单元,通过AscendCL(ACL)媒体数据处理接口提供强大的媒体处理硬加速能力,主要功能包括缩放、抠图、格式转换、图片编解码、视频编解码等。
- AIPP(Artificial Intelligence Pre-Processing):人工智能预处理,在AI Core上完成数据预处理,主要功能包括改变图像尺寸(抠图、填充等)、色域转换(转换图像格式)、减均值/乘系数(改变图像像素)等。
所以因为硬加速能力,我们应该使用DVPP,可以有更快的速度;但是同时也是因为硬加速能力,支持的功能可能会不太全面。这就是成也萧何,败也萧何。例如,在昇腾310 AI处理器和昇腾910 AI处理器上,由于DVPP仅支持输出YUV格式的图片,如果模型需要RGB格式的图片,则需要再经过AIPP做色域转换的处理。
恰好这里有一个进阶的体验任务:实现图片格式的转换(从 YUV420SP NV12 格式转换成 RGB888 格式)。同时因为体验的是新的昇腾310处理器,所以这个限制都不是事了:
这里用到了这个新的resize的API,将输入图片和输出图片的格式设置成不同的,这样借用resize功能来达到转换图片格式的目的。
看一下代码(图片缩放)里,有2个format,分别是输入图片的format和输出图片的format,值都是1:
枚举值1代表什么呢?可以查到:HI_PIXEL_FORMAT_YUV_SEMIPLANAR_420 = 1, // YUV420SP NV12 8bit
根据HI_PIXEL_FORMAT_RGB_888 = 12, // RGB888
代码就比较好改了。运行也比较正常。
最后说一下对于缩放、转换格式后的文件的查看,
YUV的我用的这个软件:
叫YUV eye,需要注册一下。打开时手工指定文件类型、宽高
RGB的话,参照一位坛友的帖子(如何查看RGB888格式的数据文件):
用一段python代码转换为bmp后查看:
# importing image object from PIL
from PIL import Image
import sys
if __name__ == "__main__":
if (len(sys.argv) != 5):
print('Usage: python3 raw2bmp.py out.1920x1080.rgb 1920 1080 out.1920x1080.bmp')
sys.exit()
file = open(sys.argv[1], 'rb')
rawData = file.read()
file.close()
imgSize = (int(sys.argv[2]), int(sys.argv[3]))
# Use the PIL raw decoder to read the data.
im = Image.frombytes("RGB", imgSize, rawData)
# Save to file
im.save(sys.argv[4])
- 点赞
- 收藏
- 关注作者
评论(0)