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/28 13:52 # @Author : ljf import torch from torchvision import transforms from PIL import Image import numpy as np import cv2 # 1.1 tensor2Image Image格式进行绘图,展示 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.2 Image2tensor tensor格式方便使用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.1 tensor2numpy 再1.1中也用到了,numpy格式主要用于容易转换数据格式,也有利于转为opencv格式。 array1 = tensor1.numpy() print(array1.shape) print(array1.dtype) # 2.2 numpy2tensor 1.2有介绍,不再赘述 tensor3 = torch.Tensor(array1) tensor4 = transforms.ToTensor()(array1) print(tensor3.size()) print(tensor4.size()) # 会增加一个维度 # 3.1 numpy2opencv openc格式方便画目标框,图片上面写字(Image格式也可以实现,不是很熟悉,,,) # opencv 读取出来就是numpy的数据格式 cv2.imshow("img",np.uint8(array1)) # cv2.waitKey() # cv2.destroyAllWindows() # 3.2 opencv2numpy array2 = cv2.imread("./gray.jpg") # 这里使用opencv读取的是三通道,plt读取的是单通道。。暂时还没搞懂 print(array2.shape) print(array2.dtype) # 4.1 opecv2Image image3 = Image.fromarray(array2,mode="RGB") # image3.show() # 4.2 Image2opencv # 这里有两种方式,一种稍复杂点,但是可以保存数据形状 array3 = transforms.ToTensor()(image3).numpy() # Image自带的属性,但是会打乱数据为一维 list1 = list(image3.getdata()) print(array3.shape) print(list1)
上面的四种格式转换时在做一个“图像分类”的项目经常用到的,比如保存图片,图片上面加中文等等。因为这些代码不是很常用,不熟练,所以每次都要在网上找下。这个博文也方便我来查找,大家有需要的也可以进行保存。
后续更新解决opecv,matplotlib显示中文问题,以及分类模型中加入评价指标confusion matrix
欢迎大家留言批评指正
以上这篇pytorch读取图像数据转成opencv格式实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- PatriciaPaay-Playmate(ExpandedEditionRemastered2024)[24Bit-96kHz]FLAC
- 蒋志光韦绮姗.2014-传奇巨声【环星】【WAV+CUE】
- 关淑怡.2008-演唱会+无尽经典3CD【环球】【WAV+CUE】
- 伍佰.2002-冬之火九重天演唱会特选录音专辑2CD【滚石】【WAV+CUE】
- 李宗盛1996《李宗盛的凡人歌2CD》滚石[WAV+CUE][1G]
- 刘德华 《天意》1:1直刻黑胶LPCD[WAV+CUE][1.1G]
- 刘德丽2024《赤的疑惑HQCD》头版限量编号MQA[低速原抓WAV+CUE]
- 英雄联盟万圣节有什么皮肤返场 2024万圣节皮肤返场一览
- lol万圣节赠礼活动什么时候开始 2024万圣节活动时间介绍
- 2024全球总决赛blg是全华班吗 全球总决赛blg选手所属国家介绍
- 《LOL》S14半决赛:T1战胜GEN晋级决赛!对决BLG
- 《完蛋美女前传》白白演员抱怨:都没人玩我的线
- 玩家热议OLED屏对画面提升巨大:比PS5 Pro值得买
- PatriciaPaay-TheLadyIsAChamp(ExpandedEdition)(2024)[24Bit-96kHz]FLAC
- 尚士达.2024-莫回头【智慧小狗】【DTS-WAV分轨】