【昇腾】【每天进步一点点】应用开发中的一些预处理和后处理代码(Python版本)

Tianyi_Li 发表于 2020/05/31 11:28:58 2020/05/31
【摘要】 在实际应用中,输入的数据可能并不符合模型输入的要求,这时需要做预处理以满足模型输入要求。同时,对推理结果解析后,可能要做一些标价的后处理,比如对于目标检测,需要绘制方框。这里来说说常用的调用OpenCV库的方法。

在实际应用中,输入的数据可能并不符合模型输入的要求,这时需要做预处理以满足模型输入要求。同时,对推理结果解析后,可能要做一些标价的后处理,比如对于目标检测,需要绘制方框。这里来说说常用的调用OpenCV库的方法。

预处理部分

  1. 图像大小调整,即resize

# 图像大小调整

# 首先导入opencv-python库
import cv2

# 读入图片
im1 = cv2.imread(image_path)     # image_path 为图像路径,比如"test.jpg",表示当前路径下test.jpg图片
im2 = cv2.resize(im1,(416,416))     # 为图片重新指定尺寸,这里的(416, 416)即为想要调整的图像大小
cv2.imwrite(image_path,im2)       # 写图片到储存中查看

    2. 色域转换

 一般来说,模型的输入图像格式为RGB或BGR格式,但有时,获取的图像格式并不符合,比如摄像头作为输入时,获取到的图像格式为YUV_NV21或YUV_NV12格式(在Atlas 200 DK中,使用树莓派摄像头获取的图像格式,是YUV420SP格式,应该就是YUV_NV21格式了)

注:

·  YUV格式图像的大小计算和RGB不同。对于RGB格式图像,其大小为width * height * 3,而YUV格式为width * height * 1.5,这一点要注意,不然,在将处理好的图像送入模型推理时,会报出输入数据大小不匹配的错误。

·  OpenCV读取图像的为BGR格式,不是我们常用的RGB格式,如果模型输入要求为RGB格式,需要做色域转换,可以使用下面的代码完成,但建议在转换模型时,使用AIPP完成,这样可以提高硬件利用率,从而提高运行速度。

# 色域转换
import cv2 

image = cv2.imread(image_path)           # image_path 为图像路径,比如"test.jpg",表示当前路径下test.jpg图片
gray  = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)  # RGB转换为gray
hsv  = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)   # RGB转换为hsv
yuv  = cv.cvtColor(image, cv2.COLOR_BGR2YUV)   # RGB转换为yuv
rgb  = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)   #  BGR转换为RGB

# 如果你想用BGR格式,那么使用OpenCV读取图片后,就可以直接使用了,因为OpenCV默认读取格式为BGR

对于RGB与BGR之间的转换,因为只是通道顺序不同,转换方法也还有很多,比如

# 色域转换
import cv2 

# BGR转为RGB
image    = cv2.imread(image_path)    # image_path 为图像路径,比如"test.jpg",表示当前路径下test.jpg图片
b,g,r    = cv2.split(image)      # 分离色道
image_rgb  = cv2.merge([r.g.b])     # 合成色道

再比如

# 色域转换
import cv2 

# BGR转为RGB
image    = cv2.imread(image_path)         # image_path 为图像路径,比如"test.jpg",表示当前路径下test.jpg图片
image_rgb  = image[: , : , : : -1]   # 对调通道顺序

有的时候,因为没有开启AIPP,可能还需要手动完成通道转换,比如将HWC转为CHW,在OpenCV中,图格式HWC,而我么可能用到的是CHW,故需要做transpose((2,0,1))

image      = cv2.imread(image_path)              # image_path 为图像路径,比如"test.jpg",表示当前路径下test.jpg图片
image_      = image[:,:,::-1].transpose((2,0,1))

这里image[:, :, ::-1]对应H、W、C,对于彩色图像是3通道,即C是3。在OpenCV里对应BGR,故通过C通道的 ::-1 做一个顺序相反操作,把BGR转为RGB,这个在前面使用过了。另注,image[:,:,0]代表B通道,也就是蓝色分量图像;image[:,:,1]代表G通道,也就是绿色分量图像;


后处理部分

这一部分基本就是绘制方框和标注文字了。其实想绘制圆形、椭圆也可以,不过一般是方框

  1. 绘制方框

import cv2
 
image    = cv2.imread(image_path)                       # image_path 为图像路径,比如"test.jpg",表示当前路径下test.jpg图片

# 绘制矩形框
# cv2.rectangle(image, 左上角坐标,右下角坐标,颜色(RGB),线条宽度),注意这里的坐标以图像左上角为坐标原点
cv2.rectangle(image, (lx,ly), (rx,ry), (0,255,0), 4)    #  这里的(lx,ly), (rx,ry)需自行指定

   2. 标注文字

import cv2
 
image    = cv2.imread(image_path)                          # image_path 为图像路径,比如"test.jpg",表示当前路径下test.jpg图片


#标注文字
# cv2.putText(image,text,开始坐标,字体font,字体大小,字体颜色(RGB),字体粗细)
font = cv2.FONT_HERSHEY_SIMPLEX                            # 如果是无法找到字体的报错,可以换一种字体
text = '你想要加上的文本内容'
cv2.putText(image, text, (x, y), font, 1, (0,0,255), 1)    # 这里的(x, y)需自行指定


总的来说,还是比较简单的,这里的操作可能不全,欢迎大家在下面留言补充哈。



【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。