深度学习-计算机视觉--图像增广
圖像增廣
大規(guī)模數(shù)據(jù)集是成功應(yīng)用深度神經(jīng)網(wǎng)絡(luò)的前提。圖像增廣(image augmentation)技術(shù)通過對訓(xùn)練圖像做一系列隨機(jī)改變,來產(chǎn)生相似但又不同的訓(xùn)練樣本,從而擴(kuò)大訓(xùn)練數(shù)據(jù)集的規(guī)模。
圖像增廣的另一種解釋是,隨機(jī)改變訓(xùn)練樣本可以降低模型對某些屬性的依賴,從而提高模型的泛化能力。例如,我們可以對圖像進(jìn)行不同方式的裁剪,使感興趣的物體出現(xiàn)在不同位置,從而減輕模型對物體出現(xiàn)位置的依賴性。我們也可以調(diào)整亮度、色彩等因素來降低模型對色彩的敏感度。可以說,在當(dāng)年AlexNet的成功中,圖像增廣技術(shù)功不可沒。
導(dǎo)入實(shí)驗(yàn)所需的包或模塊。
%matplotlib inline import time import torch from torch import nn, optim from torch.utils.data import Dataset, DataLoader import torchvision from PIL import Image from matplotlib import pyplot as plt from IPython import displaydevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')我們來讀取一張形狀為510×320510\times 320510×320(高和寬分別為500像素和320像素)的圖像作為實(shí)驗(yàn)的樣例。
def use_svg_display():"""Use svg format to display plot in jupyter"""display.set_matplotlib_formats('svg')def set_figsize(figsize=(3.5, 2.5)):use_svg_display()# 設(shè)置圖的尺寸plt.rcParams['figure.figsize'] = figsizeset_figsize() img = Image.open('small_cat.jpg') plt.imshow(img)定義繪圖函數(shù)show_images。
def show_images(imgs, num_rows, num_cols, scale=2):figsize = (num_cols * scale, num_rows * scale)_, axes = plt.subplots(num_rows, num_cols, figsize=figsize)for i in range(num_rows):for j in range(num_cols):axes[i][j].imshow(imgs[i * num_cols + j])axes[i][j].axes.get_xaxis().set_visible(False)axes[i][j].axes.get_yaxis().set_visible(False)return axes大部分圖像增廣方法都有一定的隨機(jī)性。為了方便觀察圖像增廣的效果,接下來我們定義一個(gè)輔助函數(shù)apply。這個(gè)函數(shù)對輸入圖像img多次運(yùn)行圖像增廣方法aug并展示所有的結(jié)果。
def apply(img, aug, num_rows=2, num_cols=4, scale=1.5):Y = [aug(img) for _ in range(num_rows * num_cols)]show_images(Y, num_rows, num_cols, scale)翻轉(zhuǎn)和裁剪
左右翻轉(zhuǎn)圖像通常不改變物體的類別。它是最早也是最廣泛使用的一種圖像增廣方法。下面我們通過torchvision.transforms模塊創(chuàng)建RandomHorizontalFlip實(shí)例來實(shí)現(xiàn)一半概率的圖像水平(左右)翻轉(zhuǎn)。
apply(img, torchvision.transforms.RandomHorizontalFlip()) 上下翻轉(zhuǎn)不如左右翻轉(zhuǎn)通用。但是至少對于樣例圖像,上下翻轉(zhuǎn)不會造成識別障礙。下面我們創(chuàng)建RandomVerticalFlip實(shí)例來實(shí)現(xiàn)一半概率的圖像垂直(上下)翻轉(zhuǎn)。 apply(img, torchvision.transforms.RandomVerticalFlip())在我們使用的樣例圖像里,貓?jiān)趫D像正中間,但一般情況下可能不是這樣。池化層能降低卷積層對目標(biāo)位置的敏感度。除此之外,我們還可以通過對圖像隨機(jī)裁剪來讓物體以不同的比例出現(xiàn)在圖像的不同位置,這同樣能夠降低模型對目標(biāo)位置的敏感性。
在下面的代碼里,我們每次隨機(jī)裁剪出一塊面積為原面積1010% \sim 100%10的區(qū)域,且該區(qū)域的寬和高之比隨機(jī)取自0.5~20.5 \sim 20.5~2,然后再將該區(qū)域的寬和高分別縮放到200像素。若無特殊說明,本節(jié)中aaa和bbb之間的隨機(jī)數(shù)指的是從區(qū)間[a,b][a,b][a,b]中隨機(jī)均勻采樣所得到的連續(xù)值。
shape_aug = torchvision.transforms.RandomResizedCrop(200, scale=(0.1, 1), ratio=(0.5, 2)) apply(img, shape_aug) ### 變化顏色 另一類增廣方法是變化顏色。我們可以從4個(gè)方面改變圖像的顏色:亮度(brightness)、對比度(contrast)、飽和度(saturation)和色調(diào)(hue)。在下面的例子里,我們將圖像的亮度隨機(jī)變化為原圖亮度的$50%$($1-0.5$)$\sim 150%$($1+0.5$)。 apply(img, torchvision.transforms.ColorJitter(brightness=0.5)) 我們也可以隨機(jī)變化圖像的色調(diào)。 apply(img, torchvision.transforms.ColorJitter(hue=0.5))類似地,我們也可以隨機(jī)變化圖像的對比度。
我們也可以同時(shí)設(shè)置如何隨機(jī)變化圖像的亮度(brightness)、對比度(contrast)、飽和度(saturation)和色調(diào)(hue)。
疊加多個(gè)圖像
實(shí)際應(yīng)用中我們會將多個(gè)圖像增廣方法疊加使用。我們可以通過Compose實(shí)例將上面定義的多個(gè)圖像增廣方法疊加起來,再應(yīng)用到每張圖像之上。
augs = torchvision.transforms.Compose([torchvision.transforms.RandomHorizontalFlip(), color_aug, shape_aug]) apply(img, augs)總結(jié)
以上是生活随笔為你收集整理的深度学习-计算机视觉--图像增广的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 研究生培养三部曲
- 下一篇: (pytorch-深度学习系列)pyto