【昇腾】【每天进步一点点】应用开发中的一些预处理和后处理代码(Python版本)
在实际应用中,输入的数据可能并不符合模型输入的要求,这时需要做预处理以满足模型输入要求。同时,对推理结果解析后,可能要做一些标价的后处理,比如对于目标检测,需要绘制方框。这里来说说常用的调用OpenCV库的方法。
预处理部分
图像大小调整,即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通道,也就是绿色分量图像;
后处理部分
这一部分基本就是绘制方框和标注文字了。其实想绘制圆形、椭圆也可以,不过一般是方框
绘制方框
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)需自行指定
总的来说,还是比较简单的,这里的操作可能不全,欢迎大家在下面留言补充哈。
- 点赞
- 收藏
- 关注作者
评论(0)