使用Pytorch進行圖像增強的綜合教程
最近,在研究項目中,開始了解圖像增強技術的重要性。該項目的目標是訓練一個能夠重建原始圖像的魯棒生成模型。所解決的問題是異常檢測,這是一個相當具有挑戰性的問題,因為數據量很小,而且模型不足以單獨完成所有工作。
常見的場景是使用可用于訓練的正常圖像訓練網絡模型,并在包含正常圖像和異常圖像的測試集上評估其性能。
最初的假設是,生成模型應該很好地捕捉正態分布,但同時,它應該無法重建異常樣本。如何驗證這一假設?我們可以看到重建誤差,異常圖像的重建誤差應該較高,而正常樣本的重建誤差應該較低。
在這篇文章中,將列出最好的數據增強技術,以增加數據集中圖像的大小和多樣性。其主要目的是提高模型的性能和泛化能力。
我們將探索簡單的變換,如旋轉、裁剪和高斯模糊,以及更復雜的技術,如高斯噪聲和隨機塊。
圖像增強技術:
1、簡單變換
· 調整大小
· 灰度
· 規范化
· 隨機旋轉
· 中心裁剪
· 隨機裁剪
· 高斯模糊
2、更先進的技術
· 高斯噪聲
· 隨機塊
· 中心區域
1、表面裂紋數據集簡介

在本教程中,我們將使用表面裂紋檢測數據集。你可以在此處或Kaggle上下載數據集:

從名稱可以推斷,它提供了有裂紋和無裂紋曲面的圖像。因此,它可以作為異常檢測任務的數據集,其中異常類由有裂紋的圖像表示,而正常類由無裂紋的表面表示。
該數據集包含4000幅有缺陷和無缺陷表面的彩色圖像。這兩個類都有訓練和測試集。此外,以227×227像素的分辨率獲取每個數據集圖像。
2、簡單變換
本節包括torchvision中可用的不同轉換模塊。在深入研究之前,我們從訓練數據集中導入模塊和一個沒有缺陷的圖像。
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.asarray(orig_img).shape #(227, 227, 3)
這意味著我們有一個227x227的圖像,有3個通道。
調整大小
由于圖像具有很高的高度和寬度,因此在將其傳遞給神經網絡之前,需要降低維數。例如,我們可以將227x227圖像調整為32x32和128x128圖像。
resized_imgs = [T.Resize(size=size)(orig_img) for size in [32,128]]
plot(resized_imgs,col_title=["32x32","128x128"])

值得注意的是,當我們獲得一幅32x32的圖像時,我們會失去分辨率,而128x128的尺寸似乎可以保持樣品的高分辨率。
灰度等級
RGB圖像可能很難管理。因此,將圖像轉換為灰度可能很有用:
gray_img = T.Grayscale()(orig_img)
plot([gray_img], cmap='gray', col_title=["Gray"])

規范化
規范化是一種有效的方法,可以加快基于神經網絡結構的模型的計算速度,加快學習速度。規范化圖像有兩個步驟:
· 我們從每個輸入通道中減去通道平均值
· 稍后,我們將其除以通道標準差。
我們可以顯示原始圖像及其規范化版本:
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"])

隨機旋轉
隨機旋轉方法以隨機角度旋轉圖像。
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'])

當圖像的邊界中有一個大背景,而分類任務根本不需要這個背景時,這種轉換非常有用。
隨機裁剪
我們沒有裁剪圖像的中心部分,而是通過T.RandomCrop方法隨機裁剪圖像的一部分,該方法將裁剪的輸出大小作為參數。
random_crops = [T.RandomCrop(size=size)(orig_img) for size in (832,704, 256)]
plot(random_crops,col_title=['832x832','704x704','256x256'])

高斯模糊
我們使用高斯核對圖像進行高斯模糊變換。這種方法有助于降低圖像的清晰度和清晰度,然后將生成的圖像輸入到神經網絡中,神經網絡在樣本的學習模式方面變得更加穩健。
blurred_imgs = [T.GaussianBlur(kernel_size=(51, 91), sigma=sigma)(orig_img) for sigma in (3,7)]
plot(blurred_imgs)

3、更先進的技術
前面展示了PyTorch提供的簡單轉換示例。現在,我們將重點討論從零開始實現的更復雜的技術。
高斯噪聲
高斯噪聲是一種常用的向整個數據集添加噪聲的方法,它迫使模型學習數據中包含的最重要信息。
它包括注入高斯噪聲矩陣,高斯噪聲矩陣是從高斯分布中提取的隨機值矩陣。稍后,我們將在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"])

隨機塊
正方形補丁隨機應用在圖像中。這些補丁的數量越多,神經網絡解決問題的難度就越大。
def add_random_boxes(img,n_k,size=32):
h,w = size,size
img = np.asarray(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.append((x,y,h,w))
img = Image.fromarray(img.astype('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"])

中心區域
這是一種非常簡單的方法,可以使模型更一般化。它包括在圖像的中心區域添加一個補丁塊。
def add_central_region(img,size=32):
h,w = size,size
img = np.asarray(img)
img_size = img.shape[1]
img[int(img_size/2-h):int(img_size/2+h),int(img_size/2-w):int(img_size/2+w)] = 0
img = Image.fromarray(img.astype('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"])

最后的想法:
希望你發現本教程很有用。目的是對基于神經網絡的圖像增強方法進行概述,以解決模型的泛化問題。代碼位于GitHub上:

感謝閱讀!
原文標題 : 使用Pytorch進行圖像增強的綜合教程
請輸入評論內容...
請輸入評論/評論長度6~500個字
最新活動更多
- 1 AI狂歡遇上油價破百,全球股市還能漲多久? | 產聯看全球
- 2 OpenAI深夜王炸!ChatGPT Images 2.0實測:中文穩、細節炸,設計師慌了
- 3 6000億美元估值錨定:字節跳動的“去單一化”突圍與估值重構
- 4 Tesla AI5芯片最新進展總結
- 5 連夜測了一波DeepSeek-V4,我發現它可能只剩“審美”這個短板了
- 6 熱點丨AI“瑜亮之爭”:既生OpenClaw,何生Hermes?
- 7 AI界的殺豬盤:9秒刪庫跑路,全員被封號,還繼續扣錢!
- 8 2026,人形機器人只贏了面子
- 9 DeepSeek降價90%:價格屠夫不是身份,是戰略
- 10 AI Infra產業鏈卡在哪里了?


分享













