(二)深度学习数据处理-----图片数据处理
如果你對數據處理不熟悉,可以看我的上篇博客,里面介紹了常用的數據處理方法
上篇博客地址:機器學習數據處理
目錄
1、pytorch加載數據集
1、加載pytorch自帶的數據集
2、圖像讀取和保存
? ? ? ? ?1、PIL讀取和保存圖片:
2、cv2讀取和保存圖片:?
3、matplotlib讀取和保存圖片:
4、torchvision.transforms圖片處理
0、class torchvision.transforms.Compose (transforms)
1、class torchvision.transforms.CenterCrop(size)
2、class torchvision.transforms.FiveCrop(size)
3、class torchvision.transforms.Grayscale(num_output_channels=1)
4、class torchvision.transforms.Pad(padding, fill=0, padding_mode=‘constant’)
5、class torchvision.transforms.RandomAffine(degrees, translate=None, scale=None)
6、class?torchvision.transforms.Resize(size,interpolation=2)
7.?class torchvision.transforms.ToPILImage(mode=None)
下面兩個在pytorch上操作
8、class?torchvision.transforms.ToTensor
9.class torchvision.transforms.Normalize(mean,std)
1、pytorch加載數據集
? ? ? ?torch.utils.data.Dataset
1、加載pytorch自帶的數據集
使用torchvision.datasets.‘數據集’ 可以加載下面幾個個數據集
- MNIST:一個手寫數字數據集集,提供了60000+訓練用例和10000個測試用例
- COCO:通常認為COCO是更傾向于圖像分割的數據集
- Captions:望文生義,主要是標題測試用例,通常算在COCO中
- Detection:感知數據集,通常也包含在COCO中
- LSUN:場景感知數據集(感覺很酷
- CIFAR10或CIFAR100:一個常用的微型圖像數據子集
- STL10:一個用于開發無監督特征學習、深度學習、自學學習算法的圖像識別數據集。
- SVHN:一個真實世界的圖像數據集,用于開發機器學習和對象識別算法,對數據預處理和格式要求很低。
- PhotoTour:旅游照片數據集
2、圖像讀取和保存
? ? ? ? ? ? 處理圖像的方式有三種方式,分別使用PIL, matplotlib, CV2庫
1、PIL讀取和保存圖片:
讀取通道順序:RGB?
數據類型:PIL,
轉成numpy后的像素類型和大小:uint8, 0~255
from PIL import Image import numpy as np img_path = './data/1.jpg' #圖片路徑#PIL讀取圖片 PIL_img = Image.open(img_path) #讀取圖片,圖片是PIL數據類型#PIL保存圖片 PIL_img.save('./data/2.jpg') ##將PIL類型轉成numpy類型, numpy數組格式(H,W,C=3) np_img = np.asanyarray(PIL_img) #將PIL類型轉成numpy類型,數據類型是uint8, (H, W, C)#用PIL顯示 PIL_img.show()#用matplotlib.pyplot顯示 plt.imshow(np_img) #讀取通道是RGB, 不用轉換2、cv2讀取和保存圖片:?
讀取通道順序:BRG,
數據類型:ndarray
像素類型:uint8,? 0~255
import cv2 import numpy as np#cv2讀取圖片,讀取后的類型是numpy類型的數組, 讀取的通道順序是BRG cv2_img = cv2.imread('./data/1.jpg') #numpy數組,元素類型是uinit8 0~255#保存圖片,第二個是numpy數組或mat數組,類型是jpg或png cv2.imwrite('D:/data/1.jpg', cv2_img) ##CV2顯示圖片,只能用來顯示通道順序為BRG的numpy數組,不然產生色差 cv2.imshow('labels',cv2_img) cv2.waitKey(0)#matplotlib.pyplot顯示 plt.imshow(cv2_img[:,:,::-1]) #讀取通道是BGR,所以[:,:,::-1]將其轉換成RGB格式3、matplotlib讀取和保存圖片:
讀取通道順序:RGB
數據類型:ndarray
數據類型:uint8, 0~255?
注:這個uint8類型好像有爭議,有的人說是0~1之間,我猜測是可能是因為版本太舊才會顯示float。我電腦上上顯示的是uint8
import matplotlib.pyplot as plt#讀取圖片,讀取通道的順序是RGB plt_img = plt.imread('./data/1.jpg') #uint8#保存圖片 plt.imsave('D:/data/3.png', plt_img) #類型可以是jpg或png#顯示圖片 plt.imshow(plt_img)4、torchvision.transforms圖片處理
這個模塊只能處理PIL類型的數據,所以圖片要么用PIL.Image讀取,要么將ndarray圖片數據轉成PIL類型,
PIL和numpy相互轉換方式如下:
from PIL import Image#PIL image轉成numpy np_img = np.asarray(PIL_img) #參數時PIL類型的圖片 或 np_img = np.array(PIL_img)#將array準成PIL image Image.fromarray(np.uint8(np_img))下面處理的都是PIL圖片
0、class torchvision.transforms.Compose (transforms)
? ? ? ?功能:將多個transforms進行組合
transforms.Compose([transforms.CenterCrop(10),transforms.ToTensor(), ])1、class torchvision.transforms.CenterCrop(size)
? ? ?功能:圖片剪切,返回圖片中心區域位置
? ? ?參數:size(整數或tuple), 如果是整數,將自動剪切成正方形區域(size, size)
? ? ?返回值:PIL圖片
#取圖片的中心區域,大小是(28, 28) from torchvision import transforms from PIL import Image PIL_img = Image.open('./data/1.jpg') cc_img = transforms.CenterCrop((128, 128))(PIL_img)2、class torchvision.transforms.FiveCrop(size)
? ? ? 功能:將給定的PIL圖像剪裁成四個角落區域和中心區域,這個變換返回的是一個圖像元組(tuple of images),? 也就是5張PIL圖片。
? ? ?參數:size(整數或tuple), 如果是整數,將自動裁剪成正方形區域(size, size)
? ? ?返回值:返回一個PIL元祖,里面包含五張PIL圖片
#生成5張,大小是(128,128)的PIL圖片 from torchvision import transforms from PIL import Image PIL_img = Image.open('./data/1.jpg')fc_img = transforms.FiveCrop((128, 128))(PIL_img)3、class torchvision.transforms.Grayscale(num_output_channels=1)
? ? ?功能:將圖片轉成灰度圖片, r=g=b
? ? ?參數:? num_output_channels, 只能取1或3,代表輸出通道的數量
? ? ?返回值:PIL圖片
#生成灰度圖片, R=G=B from torchvision import transforms from PIL import Image PIL_img = Image.open('./data/1.jpg')gc_img = transforms.Grayscale(1)(PIL_img)4、class torchvision.transforms.Pad(padding, fill=0, padding_mode=‘constant’)
功能:對PIL圖像的邊緣進行填充,填充的像素數值為fill值
參數1:填充長度padding(整數或者tuple)——總共四個邊界。如果padding是整數,那么會拉伸所有邊界padding個長度。如果是tuple且長度為2,那么倆個數值分別被用于拉伸left/right(寬度) 和 top/bottom(高度)。如果tuple長度是4,那么分別被用來拉伸left, top ,right 和 bottom邊界。例如,尺寸為寬度120, 高度130的圖片,即120 x 160的圖片。如果padding是10, 那么圖片將變成尺寸為130 x?170。多出的像素點全部用fill值填充。fill默認是0
參數2:fill(整數或tuple), 填充的像素值。如果是整數, 那個填充區域的R,G,B的值為fill。如果是tuple,那么R,G,B = tuple.
? ? ? ? ? ? tuple必須包含3個元素,對應R,G,B的值。
參數3:padding_mode (string) —— 填充的類型,必須為:constant, edge, reflect or symmetric,默認為 constant.
? ? ? ? ? ??constant:?以常量值進行填充,常量值由 fill 確定。
? ? ? ? ? ? ?edge:?用圖片邊界最后一個值進行填充
返回值:PIL圖片
#將圖片的寬度拉長10*2個像素, 高度拉長15*2個像素,用20, 110, 102分別填充R,G, B通道的值 from torchvision import transforms from PIL import Image PIL_img = Image.open('./data/1.jpg')pd_img = transforms.Pad((10, 15), (20, 110, 102))(PIL_img)5、class torchvision.transforms.RandomAffine(degrees, translate=None, scale=None)
? ? ?功能:保持中心位置不變,對圖片進行仿射變換
? ? ?參數1:degree (旋轉,tuple或者float或者int) —— 旋轉的角度范圍。如果角度是數值而不是類似于(min,max)的序列,
? ? ? ? ? ? ? ? 那 么將會轉換成(-degree, +degree)序列。設為0則取消旋轉。
? ? ?參數2:transalate (平移,tuple,可選) —— 數組,其中元素為代表水平和垂直變換的最大絕對分數。
? ? ? 參數3:scale (縮放,tuple, 可選) —— 縮放因子區間。若scale=(a,b), 則縮放的值在a<=scale<=b?隨機采樣。默認情況下? ? ? ? ? ? ? ? ? ? ? 沒有縮放。
? ? ? 參數4:shear (錯切,tuple或者 float 或者 int, 可選) —— 錯切的程度。如果錯切的程度是一個值,那么將會轉換為? ? ? ? ? ? ? ? ? ? ? ?序列即(—degree, +degree)。默認情況下不使用錯切。
? ? ? ? 返回值:PIL圖片
#圖片順時針旋轉90度,隨機進行平移, -0.5<水平平移動距離dx<0.5, -0.3<垂直移動距離dy<0.3, 負代表 #向左移,和向下移 from torchvision import transforms from PIL import Image PIL_img = Image.open('./data/1.jpg')ra_img = transforms.RandomAffine((90, 90), (0.5, 0.3))(PIL_img)6、class?torchvision.transforms.Resize(size,interpolation=2)
? ? ? ? 功能:將PIL圖片轉換成指定尺寸大小
? ? ? ? 參數:size(tuple?或者 int) —— 需要輸出的圖片的大小。如果size是類似于(h,w)的序列,輸出的尺寸將會跟(h,w)一致。如果size是整型,圖片較小的邊界將會被置為這個尺寸。例如,如果height->width, 圖片將會被置為 (size*height/width, size)
? ? ? ? 返回值:PIL圖片
#圖片尺寸被調整為120x203 from torchvision import transforms from PIL import Image PIL_img = Image.open('./data/1.jpg')rs_img = transforms.Resize((120, 203))(PIL_img)7.?class torchvision.transforms.ToPILImage(mode=None)
功能:將shape為(C,H,W)的Tensor或shape為(H,W,C)的numpy.ndarray轉換成PIL.Image,值不變。
返回值:PIL圖片
from torchvision import transforms#將numpy數組轉成PIL圖片PIL_img = transforms.ToPILImage()(np_img)#將tensor張量轉成PIL圖片 PIL_img = transforms.ToPILImage()(tensor_img)下面兩個在pytorch上操作
注意:只能作用在tensor上,不能是numpy和PIL類型數據
8、class?torchvision.transforms.ToTensor
功能:把一個取值范圍是[0,255]的PIL或者shape為(H,W,C)的numpy.ndarray,轉換成形狀為[C,H,W],取值范圍是[0,1.0]的torch.FloadTensor
返回值:tensor張量
#將PIL圖片轉成tensor tensor = transforms.ToTensor()(PIL_img)9.class torchvision.transforms.Normalize(mean,std)
用均值和標準差對張量圖像進行標準化處理。給定n通道的均值(M1, … , Mn) 和標準差(S1, … ,Sn), 這個變化將會歸一化根據均值和標準差歸一化每個通道值。例如,input[channel] = (input[channel]-mean[channel])/std(channel)
功能:對tensor張量的圖片數據進行標準化處理
參數:均值,標準差
返回值:tensor張量
from PIL import Image import numpy as np import torch from torchvision import transforms#先將圖片讀取成PIL類型,再轉成tensor, 再進行標準化PIL_img = Image.open('/data/1.jpg') tensor_img = transforms.ToTensor()(PIL_img) tm_img = transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))(tensor_img)總結
以上是生活随笔為你收集整理的(二)深度学习数据处理-----图片数据处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (一)机器学习数据处理
- 下一篇: 深度学习每层的通道数如何计算_模型通道剪