pytorch?transforms圖像增強實現方法
一、前言
在學習自己的項目發(fā)現自己有很多基礎知識不牢,對于圖像處理有點不太清楚,因此寫下來作為自己的筆記,主要是我想自己動手寫一下每一句代碼到底做了什么,而不是單純的我看了知道了它做了什么,說白了,不想停在看,而是要真正自己敲。
本文基于的是pytorch2.7.1
二、圖像處理
深度學習是由數據驅動的,而數據的數量和分布對于模型的優(yōu)劣具有決定性作用,所以我們需要對數據進行一定的預處理以及數據增強,用于提升模型的泛化能力。
一般來說深度學習神經網絡訓練前都需要做數據增強 (Data Augmentation) 又稱為數據增廣、數據擴增,它是對 訓練集 進行變換,使訓練集更豐富,從而讓模型更具 泛化能力。
下面為常見的圖像變換
1.原始圖片

顯示圖片,并讀取圖片大小
from torchvision import transforms from PIL import Image # 用于讀取圖片 import matplotlib.pyplot as plt # 用于顯示圖片 image_path = './dog.jpg' image = Image.open(image_path) plt.imshow(image) print(image.size) plt.show()

圖片大小(1024, 683)
2.調整圖片大小transforms.Resize
2.1.transforms.Resize(x)
主要用于調整PILImage對象的尺寸大小,圖片短邊縮放至x,長寬比保持不變
將圖片短邊縮放至x,長寬比保持不變,上述圖片執(zhí)行transforms.Resize(300)
from torchvision import transforms from PIL import Image # 用于讀取圖片 import matplotlib.pyplot as plt # 用于顯示圖片 # 圖片顯示,打印圖片大小 image_path = './dog.jpg' image = Image.open(image_path) resize = transforms.Resize(300) image1 = resize(image) plt.imshow(image1) print(image1.size) plt.show()
圖片大小(449, 300)
得到如下

2.2.transforms.Resize([x, y])
同時指定圖片長寬,這樣會改變長寬比例但是不是裁剪,可以恢復
from torchvision import transforms from PIL import Image # 用于讀取圖片 import matplotlib.pyplot as plt # 用于顯示圖片 # 圖片顯示,打印圖片大小 image_path = './dog.jpg' image = Image.open(image_path) resize = transforms.Resize([512, 300]) image1 = resize(image) plt.imshow(image1) print(image1.size) plt.show()
圖片大小(512, 300)

2.3關于圖片的恢復
測試代碼
from torchvision import transforms from PIL import Image # 用于讀取圖片 import matplotlib.pyplot as plt # 用于顯示圖片 # 圖片顯示,打印圖片大小 image_path = './dog.jpg' image = Image.open(image_path) w, h = image.size resize = transforms.Resize([512, 300]) image1 = resize(image) resize2 = transforms.Resize([h, w]) image2 = resize2(image1) plt.imshow(image2) print(image2.size) plt.show()
圖片大?。?024, 683)
注意這里要使用transforms.Resize([h, w])

3.圖片裁剪
3.1中心裁剪transforms.CenterCrop
作用:中心裁剪圖片
主要參數:size,表示需要裁剪的圖片大小
代碼示例:
from torchvision import transforms
from PIL import Image
import matplotlib.pyplot as plt
transform = transforms.CenterCrop(512)
image_path= "./dog.jpg"
image = Image.open(image_path)
image1 = transform(image)
plt.imshow(image1)
print(image1.size)
plt.show()
image1.save('./dog_clipping.jpg')圖片大小(512, 512)

3.2隨機裁剪transforms.RandomCrop(size,padding=None,pad_if_needed=False,fill=0,padding_mode='constant')
主要參數:
size:為需要裁剪的圖片大小
padding:設置填充大小
大小為a:表示上下左右都填充a個元素
大小為(a, b):表示左右填充a個元素,上下填充b個元素
大小為(a, b, c, d):表示左上右下填充a, b, c, d個元素
pad_if_needed:若圖像小于設定 size,則填充,此時該項需要設置為 True
padding_mode:填充模式,主要有四種
- constant:像素值由 fill 設定。
- edge:像素值由圖像邊緣像素決定。
- reflect:鏡像填充,最后一個像素不鏡像,例如 [1, 2, 3, 4] → [3, 2, 1, 2, 3, 4, 3, 2]。
- symmetric:鏡像填充,最后一個像素鏡像,例如 [1, 2, 3, 4] → [2, 1, 1, 2, 3, 4, 4, 3]。
fill:當填充模式為padding_mode的填充值
代碼示例:
from torchvision import transforms
import matplotlib.pyplot as plt
from PIL import Image
transform = transforms.RandomCrop(size=(512, 512), padding=50, pad_if_needed=True, fill=0,padding_mode="constant")
image_path = "./dog.jpg"
image = Image.open(image_path)
random_crop_image = transform(image)
print(random_crop_image.size)
plt.imshow(random_crop_image)
plt.show()
random_crop_image.save("./random_crop_image.jpg")圖片大小(512, 512)

3.3transforms.RandomResizedCrop
RandomResizedCrop(size,scale=(0.08,1.0),ratio=(3/4,4/3),interpolation)
將給定圖像隨機裁剪為不同的大小和寬高比,然后縮放所裁剪得到的圖像為制定的大??;
主要參數:
size:為最終圖片要resize的大小
scale:為隨機采樣最少要覆蓋原圖的比例,在resize前
ratio:為隨機采樣寬高的比例,也在resize前
interpolation:插值方法
代碼示例:
from torchvision import transforms
import matplotlib.pyplot as plt
from PIL import Image
transform = transforms.RandomResizedCrop(size=(256, 256),
scale=(0.08, 1),
ratio=(3/ 4, 4/3),
interpolation=Image.NEAREST)
image_path = "./dog.jpg"
image = Image.open(image_path)
random_resize_crop_image = transform(image)
print(random_resize_crop_image.size)
plt.imshow(random_resize_crop_image)
plt.show()
random_resize_crop_image.save("./dog_random_resize_crop.jpg")圖片大?。?56, 256)

4.圖片翻轉與旋轉
4.1.transforms.RandomHorizontalFlip(p=0.5)水平翻轉
p為旋轉的概率
代碼示例:
from torchvision import transforms
import matplotlib.pyplot as plt
from PIL import Image
transform = transforms.RandomHorizontalFlip(p=0.7)
image_path = "./dog.jpg"
image = Image.open(image_path)
RandomHorizontalFlip_image = transform(image)
print(RandomHorizontalFlip_image.size)
plt.imshow(RandomHorizontalFlip_image)
plt.show()
RandomHorizontalFlip_image.save("./RandomHorizontalFlip_image.jpg")圖片大?。?024, 683)

4.2transforms.RandomVerticalFlip垂直翻轉
代碼示例
from torchvision import transforms
import matplotlib.pyplot as plt
from PIL import Image
transform = transforms.RandomVerticalFlip(p=0.8)
image_path = "./dog.jpg"
image = Image.open(image_path)
RandomVerticalFlip_image = transform(image)
print(RandomVerticalFlip_image.size)
plt.imshow(RandomVerticalFlip_image)
plt.show()
RandomVerticalFlip_image.save("./RandomVerticalFlip_image.jpg")圖片大小(1024, 683)

4.3旋轉transforms.RandomRotation
RandomRotation(degrees,resample=False,expand=False,center=None)
主要參數:
- degrees:旋轉角度。
當為 a 時,在 (-a, a) 之間隨機選擇旋轉角度。
當為 (a, b) 時,在 (a, b) 之間隨機選擇旋轉角度。
- resample:重采樣方法。
- expand:是否擴大圖片,以保持原圖信息。
- center:旋轉點設置,默認中心旋轉
代碼示例:
from torchvision import transforms
import matplotlib.pyplot as plt
from PIL import Image
transform = transforms.RandomRotation(degrees=90,resample=False, expand=True, center=None, fill=0)
image_path = "./dog.jpg"
image = Image.open(image_path)
RandomRotation_image = transform(image)
print(RandomRotation_image.size)
plt.imshow(RandomRotation_image)
plt.show()
RandomRotation_image.save("./RandomRotation_image.jpg")圖片大小(1214, 1203)

參考博客與資料:
Pytorch transforms.Resize()的簡單用法
PyTorch 08:transforms 數據增強:裁剪、翻轉、旋轉
Pytorch中transforms.RandomResizedCrop()等圖像操作
Illustration of transforms — Torchvision main documentation (pytorch.org)
到此這篇關于pytorch transforms圖像增強的文章就介紹到這了,更多相關pytorch 圖像增強內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

