使用Pytorch進(jìn)行圖像增強(qiáng)的綜合教程
最近,在研究項(xiàng)目中,開始了解圖像增強(qiáng)技術(shù)的重要性。該項(xiàng)目的目標(biāo)是訓(xùn)練一個(gè)能夠重建原始圖像的魯棒生成模型。所解決的問題是異常檢測,這是一個(gè)相當(dāng)具有挑戰(zhàn)性的問題,因?yàn)閿?shù)據(jù)量很小,而且模型不足以單獨(dú)完成所有工作。
常見的場景是使用可用于訓(xùn)練的正常圖像訓(xùn)練網(wǎng)絡(luò)模型,并在包含正常圖像和異常圖像的測試集上評估其性能。
最初的假設(shè)是,生成模型應(yīng)該很好地捕捉正態(tài)分布,但同時(shí),它應(yīng)該無法重建異常樣本。如何驗(yàn)證這一假設(shè)?我們可以看到重建誤差,異常圖像的重建誤差應(yīng)該較高,而正常樣本的重建誤差應(yīng)該較低。
在這篇文章中,將列出最好的數(shù)據(jù)增強(qiáng)技術(shù),以增加數(shù)據(jù)集中圖像的大小和多樣性。其主要目的是提高模型的性能和泛化能力。
我們將探索簡單的變換,如旋轉(zhuǎn)、裁剪和高斯模糊,以及更復(fù)雜的技術(shù),如高斯噪聲和隨機(jī)塊。
圖像增強(qiáng)技術(shù):
1、簡單變換
· 調(diào)整大小
· 灰度
· 規(guī)范化
· 隨機(jī)旋轉(zhuǎn)
· 中心裁剪
· 隨機(jī)裁剪
· 高斯模糊
2、更先進(jìn)的技術(shù)
· 高斯噪聲
· 隨機(jī)塊
· 中心區(qū)域
1、表面裂紋數(shù)據(jù)集簡介
在本教程中,我們將使用表面裂紋檢測數(shù)據(jù)集。你可以在此處或Kaggle上下載數(shù)據(jù)集:
從名稱可以推斷,它提供了有裂紋和無裂紋曲面的圖像。因此,它可以作為異常檢測任務(wù)的數(shù)據(jù)集,其中異常類由有裂紋的圖像表示,而正常類由無裂紋的表面表示。
該數(shù)據(jù)集包含4000幅有缺陷和無缺陷表面的彩色圖像。這兩個(gè)類都有訓(xùn)練和測試集。此外,以227×227像素的分辨率獲取每個(gè)數(shù)據(jù)集圖像。
2、簡單變換
本節(jié)包括torchvision中可用的不同轉(zhuǎn)換模塊。在深入研究之前,我們從訓(xùn)練數(shù)據(jù)集中導(dǎo)入模塊和一個(gè)沒有缺陷的圖像。
from PIL import Image
from pathlib import Path
import matplotlib.pyplot as plt
import numpy as np
import sys
import torch
import numpy as np
import torchvision.transforms as T
plt.rcParams["savefig.bbox"] = 'tight'
orig_img = Image.open(Path('../input/surface-crack-detection/Negative/00026.jpg'))
torch.manual_seed(0)
data_path = '../input/surface-crack-detection/'
diz_class = {'Positive':'Crack','Negative':'No crack'}
讓我們顯示圖像的尺寸:
np.a(chǎn)sarray(orig_img).shape #(227, 227, 3)
這意味著我們有一個(gè)227x227的圖像,有3個(gè)通道。
調(diào)整大小
由于圖像具有很高的高度和寬度,因此在將其傳遞給神經(jīng)網(wǎng)絡(luò)之前,需要降低維數(shù)。例如,我們可以將227x227圖像調(diào)整為32x32和128x128圖像。
resized_imgs = [T.Resize(size=size)(orig_img) for size in [32,128]]
plot(resized_imgs,col_title=["32x32","128x128"])
值得注意的是,當(dāng)我們獲得一幅32x32的圖像時(shí),我們會失去分辨率,而128x128的尺寸似乎可以保持樣品的高分辨率。
灰度等級
RGB圖像可能很難管理。因此,將圖像轉(zhuǎn)換為灰度可能很有用:
gray_img = T.Grayscale()(orig_img)
plot([gray_img], cmap='gray', col_title=["Gray"])
規(guī)范化
規(guī)范化是一種有效的方法,可以加快基于神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)的模型的計(jì)算速度,加快學(xué)習(xí)速度。規(guī)范化圖像有兩個(gè)步驟:
· 我們從每個(gè)輸入通道中減去通道平均值
· 稍后,我們將其除以通道標(biāo)準(zhǔn)差。
我們可以顯示原始圖像及其規(guī)范化版本:
normalized_img = T.Normalize(mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5))(T.ToTensor()(orig_img))
normalized_img = [T.ToPILImage()(normalized_img)]
plot(normalized_img, col_title=["Standard normalize"])
隨機(jī)旋轉(zhuǎn)
隨機(jī)旋轉(zhuǎn)方法以隨機(jī)角度旋轉(zhuǎn)圖像。
rotated_imgs = [T.RandomRotation(degrees=d)(orig_img) for d in range(50,151,50)]
plot(rotated_imgs, col_title=["Rotation 50","Rotation 100","Rotation 150"])
中心裁剪
我們使用T.CenterCrop方法裁剪圖像的中心部分,其中需要指定裁剪大小。
center_crops = [T.CenterCrop(size=size)(orig_img) for size in (128,64, 32)]
plot(center_crops,col_title=['128x128','64x64','32x32'])
當(dāng)圖像的邊界中有一個(gè)大背景,而分類任務(wù)根本不需要這個(gè)背景時(shí),這種轉(zhuǎn)換非常有用。
隨機(jī)裁剪
我們沒有裁剪圖像的中心部分,而是通過T.RandomCrop方法隨機(jī)裁剪圖像的一部分,該方法將裁剪的輸出大小作為參數(shù)。
random_crops = [T.RandomCrop(size=size)(orig_img) for size in (832,704, 256)]
plot(random_crops,col_title=['832x832','704x704','256x256'])
高斯模糊
我們使用高斯核對圖像進(jìn)行高斯模糊變換。這種方法有助于降低圖像的清晰度和清晰度,然后將生成的圖像輸入到神經(jīng)網(wǎng)絡(luò)中,神經(jīng)網(wǎng)絡(luò)在樣本的學(xué)習(xí)模式方面變得更加穩(wěn)健。
blurred_imgs = [T.GaussianBlur(kernel_size=(51, 91), sigma=sigma)(orig_img) for sigma in (3,7)]
plot(blurred_imgs)
3、更先進(jìn)的技術(shù)
前面展示了PyTorch提供的簡單轉(zhuǎn)換示例,F(xiàn)在,我們將重點(diǎn)討論從零開始實(shí)現(xiàn)的更復(fù)雜的技術(shù)。
高斯噪聲
高斯噪聲是一種常用的向整個(gè)數(shù)據(jù)集添加噪聲的方法,它迫使模型學(xué)習(xí)數(shù)據(jù)中包含的最重要信息。
它包括注入高斯噪聲矩陣,高斯噪聲矩陣是從高斯分布中提取的隨機(jī)值矩陣。稍后,我們將在0和1之間剪裁樣本。噪聲因子越高,圖像的噪聲越大。
def add_noise(inputs,noise_factor=0.3):
noisy = inputs+torch.randn_like(inputs) * noise_factor
noisy = torch.clip(noisy,0.,1.)
return noisy
noise_imgs = [add_noise(T.ToTensor()(orig_img),noise_factor) for noise_factor in (0.3,0.6,0.9)]
noise_imgs = [T.ToPILImage()(noise_img) for noise_img in noise_imgs]
plot(noise_imgs, col_title=["noise_factor=0.3","noise_factor=0.6","noise_factor=0.9"])
隨機(jī)塊
正方形補(bǔ)丁隨機(jī)應(yīng)用在圖像中。這些補(bǔ)丁的數(shù)量越多,神經(jīng)網(wǎng)絡(luò)解決問題的難度就越大。
def add_random_boxes(img,n_k,size=32):
h,w = size,size
img = np.a(chǎn)sarray(img)
img_size = img.shape[1]
boxes = []
for k in range(n_k):
y,x = np.random.randint(0,img_size-w,(2,))
img[y:y+h,x:x+w] = 0
boxes.a(chǎn)ppend((x,y,h,w))
img = Image.fromarray(img.a(chǎn)stype('uint8'), 'RGB')
return img
blocks_imgs = [add_random_boxes(orig_img,n_k=i) for i in (10,20)]
plot(blocks_imgs,col_title=["10 black boxes","20 black boxes"])
中心區(qū)域
這是一種非常簡單的方法,可以使模型更一般化。它包括在圖像的中心區(qū)域添加一個(gè)補(bǔ)丁塊。
def add_central_region(img,size=32):
h,w = size,size
img = np.a(chǎn)sarray(img)
img_size = img.shape[1]
img[int(img_size/2-h(huán)):int(img_size/2+h),int(img_size/2-w):int(img_size/2+w)] = 0
img = Image.fromarray(img.a(chǎn)stype('uint8'), 'RGB')
return img
central_imgs = [add_central_region(orig_img,size=s) for s in (32,64)]
plot(central_imgs,col_title=["32","64"])
最后的想法:
希望你發(fā)現(xiàn)本教程很有用。目的是對基于神經(jīng)網(wǎng)絡(luò)的圖像增強(qiáng)方法進(jìn)行概述,以解決模型的泛化問題。代碼位于GitHub上:
感謝閱讀!
原文標(biāo)題 : 使用Pytorch進(jìn)行圖像增強(qiáng)的綜合教程
請輸入評論內(nèi)容...
請輸入評論/評論長度6~500個(gè)字
最新活動(dòng)更多
-
10月31日立即下載>> 【限時(shí)免費(fèi)下載】TE暖通空調(diào)系統(tǒng)高效可靠的組件解決方案
-
即日-11.13立即報(bào)名>>> 【在線會議】多物理場仿真助跑新能源汽車
-
11月28日立即報(bào)名>>> 2024工程師系列—工業(yè)電子技術(shù)在線會議
-
12月19日立即報(bào)名>> 【線下會議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會
-
即日-12.26火熱報(bào)名中>> OFweek2024中國智造CIO在線峰會
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍(lán)皮書》
推薦專題
- 1 【一周車話】沒有方向盤和踏板的車,你敢坐嗎?
- 2 特斯拉發(fā)布無人駕駛車,還未迎來“Chatgpt時(shí)刻”
- 3 特斯拉股價(jià)大跌15%:Robotaxi離落地還差一個(gè)蘿卜快跑
- 4 馬斯克給的“驚喜”夠嗎?
- 5 大模型“新星”開啟變現(xiàn)競速
- 6 海信給AI電視打樣,12大AI智能體全面升級大屏體驗(yàn)
- 7 打完“價(jià)格戰(zhàn)”,大模型還要比什么?
- 8 馬斯克致敬“國產(chǎn)蘿卜”?
- 9 神經(jīng)網(wǎng)絡(luò),誰是盈利最強(qiáng)企業(yè)?
- 10 比蘋果偉大100倍!真正改寫人類歷史的智能產(chǎn)品降臨
- 高級軟件工程師 廣東省/深圳市
- 自動(dòng)化高級工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市