pytorch讀取圖像數(shù)據(jù)轉(zhuǎn)成opencv格式實(shí)例
pytorch讀取圖像數(shù)據(jù)轉(zhuǎn)成opencv格式方法:先轉(zhuǎn)成numpy通用的格式,再將其轉(zhuǎn)換成opencv格式。
pytorch讀取的數(shù)據(jù)使用loaddata這類(lèi)函數(shù)實(shí)現(xiàn)。pytorch網(wǎng)絡(luò)輸入圖像的格式為(C, H, W),就是(通道數(shù),高,寬)而numpy中圖像的格式為(H,W,C)。
那就將其通道調(diào)換一下。用到函數(shù)transpose。
轉(zhuǎn)換方法如下
例如A 的格式為(c,h,w) 那么經(jīng)過(guò)
A = A.transpose(1,2,0)
后就變成了(h,w,c)了
然后用語(yǔ)句
B= cv2.cvtColor(A,cv2.COLOR_RGB2BGR)
結(jié)果就變成opencv可用的圖像了。 如果不做transpose轉(zhuǎn)換,那么得到的圖像是一個(gè)1*h大小的圖.......
完整代碼:
變換部分:
一般的pytorch會(huì)進(jìn)行裁剪 放縮 歸一化等操作。例如
transforms = Compose([ ToTensor(),//將數(shù)據(jù)除以255加載進(jìn)來(lái) Resize(768),//裁剪768*768大小的圖像 ConvertMaskID(Cityscapes.classes),//與這個(gè)事無(wú)關(guān)不用去管它 Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])// 歸一化 利用均值方差歸一化 ])
那么被處理的數(shù)據(jù)就要反歸一化回來(lái)唄
代碼如下:三通道的數(shù)據(jù)
image_idx = x[idx].cuda().data.cpu().float().numpy() #經(jīng)過(guò)上面處理的數(shù)據(jù) 在gpu上給取出來(lái)放在cpu上。是個(gè)numpy類(lèi)型 image_idx[0] = image_idx[0] * std[0] + mean[0]#三個(gè)通道分別進(jìn)行反歸一化...按公式來(lái)的 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#對(duì)最大值最小值做次保護(hù) 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)#轉(zhuǎn)成opencv認(rèn)識(shí)的玩意 tpath1="dddd/"+"yy0" + str(100 * i + idx) + '.jpg' cv2.imwrite(tpath1, img1)
補(bǔ)充知識(shí):pytorch的tensor,Image,numpy和opencv四種格式的相互轉(zhuǎn)換
話不多說(shuō),先上代碼
# -*- 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格式進(jìn)行繪圖,展示 tensor1 = torch.randint(0,255,(300,300)) transform1 = transforms.ToPILImage(mode="L") image1 = transform1(np.uint8(tensor1.numpy())) # Image接受的圖像格式必須為uint8,否則就會(huì)報(bào)錯(cuò) print(tensor1.size()) print(image1) # image.show() image1.save("gray.jpg") # 1.2 Image2tensor tensor格式方便使用torch進(jìn)行數(shù)據(jù)增強(qiáng),也是模型訓(xùn)練的格式 # 先剪切,再轉(zhuǎn)為tensor。底層也是PIL實(shí)現(xiàn)的 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格式主要用于容易轉(zhuǎn)換數(shù)據(jù)格式,也有利于轉(zhuǎn)為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()) # 會(huì)增加一個(gè)維度 # 3.1 numpy2opencv openc格式方便畫(huà)目標(biāo)框,圖片上面寫(xiě)字(Image格式也可以實(shí)現(xiàn),不是很熟悉,,,) # opencv 讀取出來(lái)就是numpy的數(shù)據(jù)格式 cv2.imshow("img",np.uint8(array1)) # cv2.waitKey() # cv2.destroyAllWindows() # 3.2 opencv2numpy array2 = cv2.imread("./gray.jpg") # 這里使用opencv讀取的是三通道,plt讀取的是單通道。。暫時(shí)還沒(méi)搞懂 print(array2.shape) print(array2.dtype) # 4.1 opecv2Image image3 = Image.fromarray(array2,mode="RGB") # image3.show() # 4.2 Image2opencv # 這里有兩種方式,一種稍復(fù)雜點(diǎn),但是可以保存數(shù)據(jù)形狀 array3 = transforms.ToTensor()(image3).numpy() # Image自帶的屬性,但是會(huì)打亂數(shù)據(jù)為一維 list1 = list(image3.getdata()) print(array3.shape) print(list1)
上面的四種格式轉(zhuǎn)換時(shí)在做一個(gè)“圖像分類(lèi)”的項(xiàng)目經(jīng)常用到的,比如保存圖片,圖片上面加中文等等。因?yàn)檫@些代碼不是很常用,不熟練,所以每次都要在網(wǎng)上找下。這個(gè)博文也方便我來(lái)查找,大家有需要的也可以進(jìn)行保存。
后續(xù)更新解決opecv,matplotlib顯示中文問(wèn)題,以及分類(lèi)模型中加入評(píng)價(jià)指標(biāo)confusion matrix
歡迎大家留言批評(píng)指正
以上這篇pytorch讀取圖像數(shù)據(jù)轉(zhuǎn)成opencv格式實(shí)例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python中Pandas庫(kù)提供的函數(shù)pd.DataFrame的基本用法
pandas庫(kù)中的pd.DataFrame()函數(shù)用于創(chuàng)建一個(gè)DataFrame對(duì)象,它是一個(gè)二維表格數(shù)據(jù)結(jié)構(gòu),每列可以是不同的數(shù)據(jù)類(lèi)型(數(shù)值、字符串、布爾值等),下面這篇文章主要給大家介紹了關(guān)于Python中Pandas庫(kù)提供的函數(shù)pd.DataFrame的基本用法,需要的朋友可以參考下2024-03-03transform python環(huán)境快速配置方法
經(jīng)常在數(shù)據(jù)開(kāi)發(fā)中需要搞udf,最近發(fā)現(xiàn)transform更加方便易用,但是經(jīng)常會(huì)涉及到集群python版本不一、包不全或者部分機(jī)器上沒(méi)有安裝python。這篇文章主要介紹了transform python環(huán)境快速配置方法,需要的朋友可以參考下2018-09-09Python何時(shí)應(yīng)該使用Lambda函數(shù)
這篇文章主要介紹了Python何時(shí)應(yīng)該使用Lambda函數(shù),Python 中定義函數(shù)有兩種方法,一種是用常規(guī)方式 def 定義,函數(shù)要指定名字,第二種是用 lambda 定義,不需要指定名字,稱(chēng)為 Lambda 函數(shù),需要的朋友可以參考下2019-07-07Python辦公自動(dòng)化之網(wǎng)絡(luò)監(jiān)控和壓縮文件處理
Python辦公?動(dòng)化是利用Python編程語(yǔ)?來(lái)創(chuàng)建腳本和程序,以簡(jiǎn)化、加速和?動(dòng)化?常辦公任務(wù)和工作流程的過(guò)程,本文主要介紹了如何進(jìn)行網(wǎng)絡(luò)監(jiān)控和壓縮文件處理,感興趣的可以了解下2023-12-12python使用docx模塊讀寫(xiě)docx文件的方法與docx模塊常用方法詳解
這篇文章主要介紹了python使用docx模塊讀寫(xiě)docx文件的方法與docx模塊常用方法詳解,需要的朋友可以參考下2020-02-02