pytorch读取图像数据转成opencv格式实例
pytorch读取图像数据转成opencv格式方法:先转成numpy通用的格式,再将其转换成opencv格式。
pytorch读取的数据使用loaddata这类函数实现。pytorch网络输入图像的格式为(C,H,W),就是(通道数,高,宽)而numpy中图像的格式为(H,W,C)。
那就将其通道调换一下。用到函数transpose。
转换方法如下
例如A的格式为(c,h,w)那么经过
A=A.transpose(1,2,0)
后就变成了(h,w,c)了
然后用语句
B=cv2.cvtColor(A,cv2.COLOR_RGB2BGR)
结果就变成opencv可用的图像了。如果不做transpose转换,那么得到的图像是一个1*h大小的图.......
完整代码:
变换部分:
一般的pytorch会进行裁剪放缩归一化等操作。例如
transforms=Compose([ ToTensor(),//将数据除以255加载进来 Resize(768),//裁剪768*768大小的图像 ConvertMaskID(Cityscapes.classes),//与这个事无关不用去管它 Normalize(mean=[0.485,0.456,0.406],std=[0.229,0.224,0.225])//归一化利用均值方差归一化 ])
那么被处理的数据就要反归一化回来呗
代码如下:三通道的数据
image_idx=x[idx].cuda().data.cpu().float().numpy()#经过上面处理的数据在gpu上给取出来放在cpu上。是个numpy类型 image_idx[0]=image_idx[0]*std[0]+mean[0]#三个通道分别进行反归一化...按公式来的 image_idx[1]=image_idx[1]*std[1]+mean[1] image_idx[2]=image_idx[2]*std[2]+mean[2] image_idx[0][image_idx[0]>1]=1#对最大值最小值做次保护 image_idx[0][image_idx[0]<0]=0 image_idx[1][image_idx[1]>1]=1 image_idx[1][image_idx[1]<0]=0 image_idx[2][image_idx[2]>1]=1 image_idx[2][image_idx[2]<0]=0 image_idx=image_idx.transpose(1,2,0) img1=cv2.cvtColor(image_idx*255,cv2.COLOR_RGB2BGR)#转成opencv认识的玩意 tpath1="dddd/"+"yy0"+str(100*i+idx)+'.jpg' cv2.imwrite(tpath1,img1)
补充知识:pytorch的tensor,Image,numpy和opencv四种格式的相互转换
话不多说,先上代码
#-*-coding:utf-8-*- #@Time:2019/4/2813:52 #@Author:ljf importtorch fromtorchvisionimporttransforms fromPILimportImage importnumpyasnp importcv2 #1.1tensor2ImageImage格式进行绘图,展示 tensor1=torch.randint(0,255,(300,300)) transform1=transforms.ToPILImage(mode="L") image1=transform1(np.uint8(tensor1.numpy()))#Image接受的图像格式必须为uint8,否则就会报错 print(tensor1.size()) print(image1) #image.show() image1.save("gray.jpg") #1.2Image2tensortensor格式方便使用torch进行数据增强,也是模型训练的格式 #先剪切,再转为tensor。底层也是PIL实现的 transform2=transforms.Compose([transforms.RandomCrop([200,200],padding=10),transforms.ToTensor()]) image2=Image.open("gray.jpg") tensor2=transform2(image2) print(tensor2.size()) #2.1tensor2numpy再1.1中也用到了,numpy格式主要用于容易转换数据格式,也有利于转为opencv格式。 array1=tensor1.numpy() print(array1.shape) print(array1.dtype) #2.2numpy2tensor1.2有介绍,不再赘述 tensor3=torch.Tensor(array1) tensor4=transforms.ToTensor()(array1) print(tensor3.size()) print(tensor4.size())#会增加一个维度 #3.1numpy2opencvopenc格式方便画目标框,图片上面写字(Image格式也可以实现,不是很熟悉,,,) #opencv读取出来就是numpy的数据格式 cv2.imshow("img",np.uint8(array1)) #cv2.waitKey() #cv2.destroyAllWindows() #3.2opencv2numpy array2=cv2.imread("./gray.jpg")#这里使用opencv读取的是三通道,plt读取的是单通道。。暂时还没搞懂 print(array2.shape) print(array2.dtype) #4.1opecv2Image image3=Image.fromarray(array2,mode="RGB") #image3.show() #4.2Image2opencv #这里有两种方式,一种稍复杂点,但是可以保存数据形状 array3=transforms.ToTensor()(image3).numpy() #Image自带的属性,但是会打乱数据为一维 list1=list(image3.getdata()) print(array3.shape) print(list1)
上面的四种格式转换时在做一个“图像分类”的项目经常用到的,比如保存图片,图片上面加中文等等。因为这些代码不是很常用,不熟练,所以每次都要在网上找下。这个博文也方便我来查找,大家有需要的也可以进行保存。
后续更新解决opecv,matplotlib显示中文问题,以及分类模型中加入评价指标confusionmatrix
欢迎大家留言批评指正
以上这篇pytorch读取图像数据转成opencv格式实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。