pytorch讀取影象資料轉成opencv格式例項
阿新 • • 發佈:2020-06-02
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,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格式例項就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。