訂閱
糾錯
加入自媒體

使用Pytorch進行圖像增強的綜合教程

最近,在研究項目中,開始了解圖像增強技術(shù)的重要性。該項目的目標是訓(xùn)練一個能夠重建原始圖像的魯棒生成模型。所解決的問題是異常檢測,這是一個相當具有挑戰(zhàn)性的問題,因為數(shù)據(jù)量很小,而且模型不足以單獨完成所有工作。

常見的場景是使用可用于訓(xùn)練的正常圖像訓(xùn)練網(wǎng)絡(luò)模型,并在包含正常圖像和異常圖像的測試集上評估其性能。

最初的假設(shè)是,生成模型應(yīng)該很好地捕捉正態(tài)分布,但同時,它應(yīng)該無法重建異常樣本。如何驗證這一假設(shè)?我們可以看到重建誤差,異常圖像的重建誤差應(yīng)該較高,而正常樣本的重建誤差應(yīng)該較低。

在這篇文章中,將列出最好的數(shù)據(jù)增強技術(shù),以增加數(shù)據(jù)集中圖像的大小和多樣性。其主要目的是提高模型的性能和泛化能力。

我們將探索簡單的變換,如旋轉(zhuǎn)、裁剪和高斯模糊,以及更復(fù)雜的技術(shù),如高斯噪聲和隨機塊。

圖像增強技術(shù):

1、簡單變換

· 調(diào)整大小

· 灰度

· 規(guī)范化

· 隨機旋轉(zhuǎn)

· 中心裁剪

· 隨機裁剪

· 高斯模糊

2、更先進的技術(shù)

· 高斯噪聲

· 隨機塊

· 中心區(qū)域

1、表面裂紋數(shù)據(jù)集簡介

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

image.png

從名稱可以推斷,它提供了有裂紋和無裂紋曲面的圖像。因此,它可以作為異常檢測任務(wù)的數(shù)據(jù)集,其中異常類由有裂紋的圖像表示,而正常類由無裂紋的表面表示。

該數(shù)據(jù)集包含4000幅有缺陷和無缺陷表面的彩色圖像。這兩個類都有訓(xùn)練和測試集。此外,以227×227像素的分辨率獲取每個數(shù)據(jù)集圖像。

2、簡單變換

本節(jié)包括torchvision中可用的不同轉(zhuǎn)換模塊。在深入研究之前,我們從訓(xùn)練數(shù)據(jù)集中導(dǎo)入模塊和一個沒有缺陷的圖像。

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)

這意味著我們有一個227x227的圖像,有3個通道。

調(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"])

值得注意的是,當我們獲得一幅32x32的圖像時,我們會失去分辨率,而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)的模型的計算速度,加快學(xué)習(xí)速度。規(guī)范化圖像有兩個步驟:

· 我們從每個輸入通道中減去通道平均值

· 稍后,我們將其除以通道標準差。

我們可以顯示原始圖像及其規(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"])

隨機旋轉(zhuǎn)

隨機旋轉(zhuǎn)方法以隨機角度旋轉(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'])

當圖像的邊界中有一個大背景,而分類任務(wù)根本不需要這個背景時,這種轉(zhuǎn)換非常有用。

隨機裁剪

我們沒有裁剪圖像的中心部分,而是通過T.RandomCrop方法隨機裁剪圖像的一部分,該方法將裁剪的輸出大小作為參數(shù)。

random_crops = [T.RandomCrop(size=size)(orig_img) for size in (832,704, 256)]

plot(random_crops,col_title=['832x832','704x704','256x256'])

高斯模糊

我們使用高斯核對圖像進行高斯模糊變換。這種方法有助于降低圖像的清晰度和清晰度,然后將生成的圖像輸入到神經(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、更先進的技術(shù)

前面展示了PyTorch提供的簡單轉(zhuǎn)換示例,F(xiàn)在,我們將重點討論從零開始實現(xiàn)的更復(fù)雜的技術(shù)。

高斯噪聲

高斯噪聲是一種常用的向整個數(shù)據(jù)集添加噪聲的方法,它迫使模型學(xué)習(xí)數(shù)據(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"])

隨機塊

正方形補丁隨機應(yīng)用在圖像中。這些補丁的數(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ū)域添加一個補丁塊。

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ò)的圖像增強方法進行概述,以解決模型的泛化問題。代碼位于GitHub上:

image.png

感謝閱讀!

       原文標題 : 使用Pytorch進行圖像增強的綜合教程

聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權(quán)或其他問題,請聯(lián)系舉報。

發(fā)表評論

0條評論,0人參與

請輸入評論內(nèi)容...

請輸入評論/評論長度6~500個字

您提交的評論過于頻繁,請輸入驗證碼繼續(xù)

暫無評論

暫無評論

人工智能 獵頭職位 更多
掃碼關(guān)注公眾號
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容
文章糾錯
x
*文字標題:
*糾錯內(nèi)容:
聯(lián)系郵箱:
*驗 證 碼:

粵公網(wǎng)安備 44030502002758號