pytorch?transforms圖像增強(qiáng)實(shí)現(xiàn)方法
一、前言
在學(xué)習(xí)自己的項(xiàng)目發(fā)現(xiàn)自己有很多基礎(chǔ)知識(shí)不牢,對(duì)于圖像處理有點(diǎn)不太清楚,因此寫(xiě)下來(lái)作為自己的筆記,主要是我想自己動(dòng)手寫(xiě)一下每一句代碼到底做了什么,而不是單純的我看了知道了它做了什么,說(shuō)白了,不想停在看,而是要真正自己敲。
本文基于的是pytorch2.7.1
二、圖像處理
深度學(xué)習(xí)是由數(shù)據(jù)驅(qū)動(dòng)的,而數(shù)據(jù)的數(shù)量和分布對(duì)于模型的優(yōu)劣具有決定性作用,所以我們需要對(duì)數(shù)據(jù)進(jìn)行一定的預(yù)處理以及數(shù)據(jù)增強(qiáng),用于提升模型的泛化能力。
一般來(lái)說(shuō)深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)訓(xùn)練前都需要做數(shù)據(jù)增強(qiáng) (Data Augmentation) 又稱(chēng)為數(shù)據(jù)增廣、數(shù)據(jù)擴(kuò)增,它是對(duì) 訓(xùn)練集 進(jìn)行變換,使訓(xùn)練集更豐富,從而讓模型更具 泛化能力。
下面為常見(jiàn)的圖像變換
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.調(diào)整圖片大小transforms.Resize
2.1.transforms.Resize(x)
主要用于調(diào)整PILImage對(duì)象的尺寸大小,圖片短邊縮放至x,長(zhǎng)寬比保持不變
將圖片短邊縮放至x,長(zhǎng)寬比保持不變,上述圖片執(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])
同時(shí)指定圖片長(zhǎng)寬,這樣會(huì)改變長(zhǎng)寬比例但是不是裁剪,可以恢復(fù)
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()
圖片大?。?12, 300)
2.3關(guān)于圖片的恢復(fù)
測(cè)試代碼
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
作用:中心裁剪圖片
主要參數(shù):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隨機(jī)裁剪transforms.RandomCrop(size,padding=None,pad_if_needed=False,fill=0,padding_mode='constant')
主要參數(shù):
size:為需要裁剪的圖片大小
padding:設(shè)置填充大小
大小為a:表示上下左右都填充a個(gè)元素
大小為(a, b):表示左右填充a個(gè)元素,上下填充b個(gè)元素
大小為(a, b, c, d):表示左上右下填充a, b, c, d個(gè)元素
pad_if_needed:若圖像小于設(shè)定 size,則填充,此時(shí)該項(xiàng)需要設(shè)置為 True
padding_mode:填充模式,主要有四種
- constant:像素值由 fill 設(shè)定。
- edge:像素值由圖像邊緣像素決定。
- reflect:鏡像填充,最后一個(gè)像素不鏡像,例如 [1, 2, 3, 4] → [3, 2, 1, 2, 3, 4, 3, 2]。
- symmetric:鏡像填充,最后一個(gè)像素鏡像,例如 [1, 2, 3, 4] → [2, 1, 1, 2, 3, 4, 4, 3]。
fill:當(dāng)填充模式為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")
圖片大?。?12, 512)
3.3transforms.RandomResizedCrop
RandomResizedCrop(size,scale=(0.08,1.0),ratio=(3/4,4/3),interpolation)
將給定圖像隨機(jī)裁剪為不同的大小和寬高比,然后縮放所裁剪得到的圖像為制定的大小;
主要參數(shù):
size:為最終圖片要resize的大小
scale:為隨機(jī)采樣最少要覆蓋原圖的比例,在resize前
ratio:為隨機(jī)采樣寬高的比例,也在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")
圖片大小(256, 256)
4.圖片翻轉(zhuǎn)與旋轉(zhuǎn)
4.1.transforms.RandomHorizontalFlip(p=0.5)水平翻轉(zhuǎn)
p為旋轉(zhuǎn)的概率
代碼示例:
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垂直翻轉(zhuǎn)
代碼示例
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旋轉(zhuǎn)transforms.RandomRotation
RandomRotation(degrees,resample=False,expand=False,center=None)
主要參數(shù):
- degrees:旋轉(zhuǎn)角度。
當(dāng)為 a 時(shí),在 (-a, a) 之間隨機(jī)選擇旋轉(zhuǎn)角度。
當(dāng)為 (a, b) 時(shí),在 (a, b) 之間隨機(jī)選擇旋轉(zhuǎn)角度。
- resample:重采樣方法。
- expand:是否擴(kuò)大圖片,以保持原圖信息。
- center:旋轉(zhuǎn)點(diǎn)設(shè)置,默認(rèn)中心旋轉(zhuǎn)
代碼示例:
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()的簡(jiǎn)單用法
PyTorch 08:transforms 數(shù)據(jù)增強(qiáng):裁剪、翻轉(zhuǎn)、旋轉(zhuǎn)
Pytorch中transforms.RandomResizedCrop()等圖像操作
Illustration of transforms — Torchvision main documentation (pytorch.org)
到此這篇關(guān)于pytorch transforms圖像增強(qiáng)的文章就介紹到這了,更多相關(guān)pytorch 圖像增強(qiáng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python實(shí)現(xiàn)一次性封裝多條sql語(yǔ)句(begin end)
這篇文章主要介紹了python實(shí)現(xiàn)一次性封裝多條sql語(yǔ)句(begin end),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06python中用Scrapy實(shí)現(xiàn)定時(shí)爬蟲(chóng)的實(shí)例講解
在本篇文章里小編給大家整理的是一篇關(guān)于python中用Scrapy實(shí)現(xiàn)定時(shí)爬蟲(chóng)的實(shí)例講解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-01-01Python?GUI利用tkinter皮膚ttkbootstrap實(shí)現(xiàn)好看的窗口
這篇文章主要介紹了Python?GUI利用tkinter皮膚ttkbootstrap實(shí)現(xiàn)好看的窗口,文章基于python的相關(guān)資料展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下2022-06-06教你用scrapy框架爬取豆瓣讀書(shū)Top250的書(shū)類(lèi)信息
這篇文章主要介紹了教你用scrapy框架爬取豆瓣讀書(shū)Top250的書(shū)類(lèi)信息,文中提供了解決思路和部分實(shí)現(xiàn)代碼,需要的朋友可以參考下2023-03-03python使用os.listdir和os.walk獲得文件的路徑的方法
本篇文章主要介紹了python使用os.listdir和os.walk獲得文件的路徑的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-12-12Python多進(jìn)程multiprocessing、進(jìn)程池用法實(shí)例分析
這篇文章主要介紹了Python多進(jìn)程multiprocessing、進(jìn)程池用法,結(jié)合實(shí)例形式分析了Python多進(jìn)程multiprocessing、進(jìn)程池相關(guān)概念、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下2020-03-03python自定義函數(shù)中的return和print使用及說(shuō)明
這篇文章主要介紹了python自定義函數(shù)中的return和print使用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01