深度学习-计算机视觉--图像增广
圖像增廣
大規模數據集是成功應用深度神經網絡的前提。圖像增廣(image augmentation)技術通過對訓練圖像做一系列隨機改變,來產生相似但又不同的訓練樣本,從而擴大訓練數據集的規模。
圖像增廣的另一種解釋是,隨機改變訓練樣本可以降低模型對某些屬性的依賴,從而提高模型的泛化能力。例如,我們可以對圖像進行不同方式的裁剪,使感興趣的物體出現在不同位置,從而減輕模型對物體出現位置的依賴性。我們也可以調整亮度、色彩等因素來降低模型對色彩的敏感度。可以說,在當年AlexNet的成功中,圖像增廣技術功不可沒。
導入實驗所需的包或模塊。
%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像素)的圖像作為實驗的樣例。
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()# 設置圖的尺寸plt.rcParams['figure.figsize'] = figsizeset_figsize() img = Image.open('small_cat.jpg') plt.imshow(img)定義繪圖函數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大部分圖像增廣方法都有一定的隨機性。為了方便觀察圖像增廣的效果,接下來我們定義一個輔助函數apply。這個函數對輸入圖像img多次運行圖像增廣方法aug并展示所有的結果。
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)翻轉和裁剪
左右翻轉圖像通常不改變物體的類別。它是最早也是最廣泛使用的一種圖像增廣方法。下面我們通過torchvision.transforms模塊創建RandomHorizontalFlip實例來實現一半概率的圖像水平(左右)翻轉。
apply(img, torchvision.transforms.RandomHorizontalFlip()) 上下翻轉不如左右翻轉通用。但是至少對于樣例圖像,上下翻轉不會造成識別障礙。下面我們創建RandomVerticalFlip實例來實現一半概率的圖像垂直(上下)翻轉。 apply(img, torchvision.transforms.RandomVerticalFlip())在我們使用的樣例圖像里,貓在圖像正中間,但一般情況下可能不是這樣。池化層能降低卷積層對目標位置的敏感度。除此之外,我們還可以通過對圖像隨機裁剪來讓物體以不同的比例出現在圖像的不同位置,這同樣能夠降低模型對目標位置的敏感性。
在下面的代碼里,我們每次隨機裁剪出一塊面積為原面積1010% \sim 100%10的區域,且該區域的寬和高之比隨機取自0.5~20.5 \sim 20.5~2,然后再將該區域的寬和高分別縮放到200像素。若無特殊說明,本節中aaa和bbb之間的隨機數指的是從區間[a,b][a,b][a,b]中隨機均勻采樣所得到的連續值。
shape_aug = torchvision.transforms.RandomResizedCrop(200, scale=(0.1, 1), ratio=(0.5, 2)) apply(img, shape_aug) ### 變化顏色 另一類增廣方法是變化顏色。我們可以從4個方面改變圖像的顏色:亮度(brightness)、對比度(contrast)、飽和度(saturation)和色調(hue)。在下面的例子里,我們將圖像的亮度隨機變化為原圖亮度的$50%$($1-0.5$)$\sim 150%$($1+0.5$)。 apply(img, torchvision.transforms.ColorJitter(brightness=0.5)) 我們也可以隨機變化圖像的色調。 apply(img, torchvision.transforms.ColorJitter(hue=0.5))類似地,我們也可以隨機變化圖像的對比度。
我們也可以同時設置如何隨機變化圖像的亮度(brightness)、對比度(contrast)、飽和度(saturation)和色調(hue)。
疊加多個圖像
實際應用中我們會將多個圖像增廣方法疊加使用。我們可以通過Compose實例將上面定義的多個圖像增廣方法疊加起來,再應用到每張圖像之上。
augs = torchvision.transforms.Compose([torchvision.transforms.RandomHorizontalFlip(), color_aug, shape_aug]) apply(img, augs)總結
以上是生活随笔為你收集整理的深度学习-计算机视觉--图像增广的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 研究生培养三部曲
- 下一篇: 梳理百年深度学习发展史-七月在线机器学习