【深度學習筆記】計算機視覺——圖像增廣

圖像增廣

sec_alexnet提到過大型數據集是成功應用深度神經網絡的先決條件。
圖像增廣在對訓練圖像進行一系列的隨機變化之后,生成相似但不同的訓練樣本,從而擴大了訓練集的規模。
此外,應用圖像增廣的原因是,隨機改變訓練樣本可以減少模型對某些屬性的依賴,從而提高模型的泛化能力。
例如,我們可以以不同的方式裁剪圖像,使感興趣的對象出現在不同的位置,減少模型對于對象出現位置的依賴。
我們還可以調整亮度、顏色等因素來降低模型對顏色的敏感度。
可以說,圖像增廣技術對于AlexNet的成功是必不可少的。本節將討論這項廣泛應用于計算機視覺的技術。

%matplotlib inline
import torch
import torchvision
from torch import nn
from d2l import torch as d2l

常用的圖像增廣方法

在對常用圖像增廣方法的探索時,我們將使用下面這個尺寸為 400 × 500 400\times 500 400×500的圖像作為示例。

d2l.set_figsize()
img = d2l.Image.open('../img/cat1.jpg')
d2l.plt.imshow(img);

?
在這里插入圖片描述

?

大多數圖像增廣方法都具有一定的隨機性。為了便于觀察圖像增廣的效果,我們下面定義輔助函數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)]d2l.show_images(Y, num_rows, num_cols, scale=scale)

翻轉和裁剪

[左右翻轉圖像]通常不會改變對象的類別。這是最早且最廣泛使用的圖像增廣方法之一。
接下來,我們使用transforms模塊來創建RandomFlipLeftRight實例,這樣就各有50%的幾率使圖像向左或向右翻轉。

apply(img, torchvision.transforms.RandomHorizontalFlip())

?
在這里插入圖片描述

?

[上下翻轉圖像]不如左右圖像翻轉那樣常用。但是,至少對于這個示例圖像,上下翻轉不會妨礙識別。接下來,我們創建一個RandomFlipTopBottom實例,使圖像各有50%的幾率向上或向下翻轉。

apply(img, torchvision.transforms.RandomVerticalFlip())

?
在這里插入圖片描述

?

在我們使用的示例圖像中,貓位于圖像的中間,但并非所有圖像都是這樣。
sec_pooling中,我們解釋了匯聚層可以降低卷積層對目標位置的敏感性。
另外,我們可以通過對圖像進行隨機裁剪,使物體以不同的比例出現在圖像的不同位置。
這也可以降低模型對目標位置的敏感性。

下面的代碼將[隨機裁剪]一個面積為原始面積10%到100%的區域,該區域的寬高比從0.5~2之間隨機取值。
然后,區域的寬度和高度都被縮放到200像素。
在本節中(除非另有說明), a a a b b b之間的隨機數指的是在區間 [ a , b ] [a, b] [a,b]中通過均勻采樣獲得的連續值。

shape_aug = torchvision.transforms.RandomResizedCrop((200, 200), scale=(0.1, 1), ratio=(0.5, 2))
apply(img, shape_aug)

?
在這里插入圖片描述

?

改變顏色

另一種增廣方法是改變顏色。
我們可以改變圖像顏色的四個方面:亮度、對比度、飽和度和色調。
在下面的示例中,我們[隨機更改圖像的亮度],隨機值為原始圖像的50%( 1 ? 0.5 1-0.5 1?0.5)到150%( 1 + 0.5 1+0.5 1+0.5)之間。

apply(img, torchvision.transforms.ColorJitter(brightness=0.5, contrast=0, saturation=0, hue=0))

?
在這里插入圖片描述

?

同樣,我們可以[隨機更改圖像的色調]。

apply(img, torchvision.transforms.ColorJitter(brightness=0, contrast=0, saturation=0, hue=0.5))

?
在這里插入圖片描述

?

我們還可以創建一個RandomColorJitter實例,并設置如何同時[隨機更改圖像的亮度(brightness)、對比度(contrast)、飽和度(saturation)和色調(hue]。

color_aug = torchvision.transforms.ColorJitter(brightness=0.5, contrast=0.5, saturation=0.5, hue=0.5)
apply(img, color_aug)

?
在這里插入圖片描述

?

[結合多種圖像增廣方法]

在實踐中,我們將結合多種圖像增廣方法。比如,我們可以通過使用一個Compose實例來綜合上面定義的不同的圖像增廣方法,并將它們應用到每個圖像。

augs = torchvision.transforms.Compose([torchvision.transforms.RandomHorizontalFlip(), color_aug, shape_aug])
apply(img, augs)

?
在這里插入圖片描述

?

[使用圖像增廣進行訓練]

讓我們使用圖像增廣來訓練模型。
這里,我們使用CIFAR-10數據集,而不是我們之前使用的Fashion-MNIST數據集。
這是因為Fashion-MNIST數據集中對象的位置和大小已被規范化,而CIFAR-10數據集中對象的顏色和大小差異更明顯。
CIFAR-10數據集中的前32個訓練圖像如下所示。

all_images = torchvision.datasets.CIFAR10(train=True, root="../data",download=True)
d2l.show_images([all_images[i][0] for i in range(32)], 4, 8, scale=0.8);
Downloading https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz to ../data/cifar-10-python.tar.gz0%|          | 0/170498071 [00:00<?, ?it/s]Extracting ../data/cifar-10-python.tar.gz to ../data

在這里插入圖片描述

為了在預測過程中得到確切的結果,我們通常對訓練樣本只進行圖像增廣,且在預測過程中不使用隨機操作的圖像增廣。
在這里,我們[只使用最簡單的隨機左右翻轉]。
此外,我們使用ToTensor實例將一批圖像轉換為深度學習框架所要求的格式,即形狀為(批量大小,通道數,高度,寬度)的32位浮點數,取值范圍為0~1。

train_augs = torchvision.transforms.Compose([torchvision.transforms.RandomHorizontalFlip(),torchvision.transforms.ToTensor()])test_augs = torchvision.transforms.Compose([torchvision.transforms.ToTensor()])

接下來,我們[定義一個輔助函數,以便于讀取圖像和應用圖像增廣]。PyTorch數據集提供的transform參數應用圖像增廣來轉化圖像。有關DataLoader的詳細介紹,請參閱 :numref:sec_fashion_mnist

def load_cifar10(is_train, augs, batch_size):dataset = torchvision.datasets.CIFAR10(root="../data", train=is_train,transform=augs, download=True)dataloader = torch.utils.data.DataLoader(dataset, batch_size=batch_size,shuffle=is_train, num_workers=d2l.get_dataloader_workers())return dataloader

多GPU訓練

我們在CIFAR-10數據集上訓練 :numref:sec_resnet中的ResNet-18模型。
回想一下 :numref:sec_multi_gpu_concise中對多GPU訓練的介紹。
接下來,我們[定義一個函數,使用多GPU對模型進行訓練和評估]。

#@save
def train_batch_ch13(net, X, y, loss, trainer, devices):"""用多GPU進行小批量訓練"""if isinstance(X, list):# 微調BERT中所需X = [x.to(devices[0]) for x in X]else:X = X.to(devices[0])y = y.to(devices[0])net.train()trainer.zero_grad()pred = net(X)l = loss(pred, y)l.sum().backward()trainer.step()train_loss_sum = l.sum()train_acc_sum = d2l.accuracy(pred, y)return train_loss_sum, train_acc_sum
#@save
def train_ch13(net, train_iter, test_iter, loss, trainer, num_epochs,devices=d2l.try_all_gpus()):"""用多GPU進行模型訓練"""timer, num_batches = d2l.Timer(), len(train_iter)animator = d2l.Animator(xlabel='epoch', xlim=[1, num_epochs], ylim=[0, 1],legend=['train loss', 'train acc', 'test acc'])net = nn.DataParallel(net, device_ids=devices).to(devices[0])for epoch in range(num_epochs):# 4個維度:儲存訓練損失,訓練準確度,實例數,特點數metric = d2l.Accumulator(4)for i, (features, labels) in enumerate(train_iter):timer.start()l, acc = train_batch_ch13(net, features, labels, loss, trainer, devices)metric.add(l, acc, labels.shape[0], labels.numel())timer.stop()if (i + 1) % (num_batches // 5) == 0 or i == num_batches - 1:animator.add(epoch + (i + 1) / num_batches,(metric[0] / metric[2], metric[1] / metric[3],None))test_acc = d2l.evaluate_accuracy_gpu(net, test_iter)animator.add(epoch + 1, (None, None, test_acc))print(f'loss {metric[0] / metric[2]:.3f}, train acc 'f'{metric[1] / metric[3]:.3f}, test acc {test_acc:.3f}')print(f'{metric[2] * num_epochs / timer.sum():.1f} examples/sec on 'f'{str(devices)}')

現在,我們可以[定義train_with_data_aug函數,使用圖像增廣來訓練模型]。該函數獲取所有的GPU,并使用Adam作為訓練的優化算法,將圖像增廣應用于訓練集,最后調用剛剛定義的用于訓練和評估模型的train_ch13函數。

batch_size, devices, net = 256, d2l.try_all_gpus(), d2l.resnet18(10, 3)def init_weights(m):if type(m) in [nn.Linear, nn.Conv2d]:nn.init.xavier_uniform_(m.weight)net.apply(init_weights)def train_with_data_aug(train_augs, test_augs, net, lr=0.001):train_iter = load_cifar10(True, train_augs, batch_size)test_iter = load_cifar10(False, test_augs, batch_size)loss = nn.CrossEntropyLoss(reduction="none")trainer = torch.optim.Adam(net.parameters(), lr=lr)train_ch13(net, train_iter, test_iter, loss, trainer, 10, devices)

讓我們使用基于隨機左右翻轉的圖像增廣來[訓練模型]。

train_with_data_aug(train_augs, test_augs, net)
loss 0.173, train acc 0.941, test acc 0.854
4183.9 examples/sec on [device(type='cuda', index=0), device(type='cuda', index=1)]

在這里插入圖片描述

小結

  • 圖像增廣基于現有的訓練數據生成隨機圖像,來提高模型的泛化能力。
  • 為了在預測過程中得到確切的結果,我們通常對訓練樣本只進行圖像增廣,而在預測過程中不使用帶隨機操作的圖像增廣。
  • 深度學習框架提供了許多不同的圖像增廣方法,這些方法可以被同時應用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/714925.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/714925.shtml
英文地址,請注明出處:http://en.pswp.cn/news/714925.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python + Selenium —— 下拉菜單處理!

傳統的下拉菜單 Select 元素&#xff0c;由一個 Select 一系列的 option 元素構成。 <select id"source" name"source"><option value"">--請選擇--</option><option value"1001">網絡營銷</option>&…

3.3 序列式容器-deque、stack、queue、heap、priority_queue

deque 3.1定義 std::deque&#xff08;雙端隊列&#xff09;是C標準模板庫&#xff08;STL&#xff09;中的一種容器&#xff0c;表示雙端隊列數據結構。它提供了在兩端高效地進行插入和刪除操作的能力。與vector的連續線性空間類似&#xff0c;但有所不同&#xff0c;deque動…

基于ssm旅社客房收費管理系統+vue

目 錄 目 錄 I 摘 要 III ABSTRACT IV 1 緒論 1 1.1 課題背景 1 1.2 研究現狀 1 1.3 研究內容 2 2 系統開發環境 3 2.1 vue技術 3 2.2 JAVA技術 3 2.3 MYSQL數據庫 3 2.4 B/S結構 4 2.5 SSM框架技術 4 3 系統分析 5 3.1 可行性分析 5 3.1.1 技術可行性 5 3.1.2 操作可行性 5 3…

STM32使用FlyMcu串口下載程序與STLink Utility下載程序

文章目錄 前言軟件鏈接一、FlyMcu串口下載程序原理優化手動修改跳線帽選項字節其他功能 二、STLink Utility下載程序下載程序選項字節固件更新 前言 本文主要講解使用FlyMcu配合USART串口為STM32下載程序、使用STLink Utility配合STLink為STM32下載程序&#xff0c;以及這兩個…

代碼隨想錄算法訓練營第62/63天| 503.下一個更大元素II、42. 接雨水、84.柱狀圖中最大的矩形

文章目錄 503.下一個更大元素II思路代碼 42. 接雨水思路代碼 84.柱狀圖中最大的矩形思路代碼 503.下一個更大元素II 題目鏈接&#xff1a;503.下一個更大元素II 文章講解&#xff1a;代碼隨想錄|503.下一個更大元素II 思路 和739. 每日溫度 (opens new window)也幾乎如出一轍&…

C++/數據結構:AVL樹

目錄 一、AVL樹的概念 二、AVL樹的實現 2.1節點定義 2.2節點插入 三、AVL樹的旋轉 3.1新節點插入較高左子樹的左側&#xff1a;右單旋 3.2新節點插入較高右子樹的右側&#xff1a;左單旋 3.3新節點插入較高左子樹的右側---左右&#xff1a;先左單旋再右單旋 3.4新節點插…

Rocky Linux 運維工具 Systemd

一、Systemd 的簡介 Systemd是一個用于管理Linux系統啟動進程和服務的系統和服務管理器&#xff0c;取代了傳統的init系統。它提供了并行啟動、依賴關系管理、動態加載服務文件等功能&#xff0c;成為現代Linux發行版中主流的初始化系統。 二、Systemd 的參數說明 [Unit] Des…

SLAM基礎知識-卡爾曼濾波

前言&#xff1a; 在SLAM系統中&#xff0c;后端優化部分有兩大流派。一派是基于馬爾科夫性假設的濾波器方法&#xff0c;認為當前時刻的狀態只與上一時刻的狀態有關。另一派是非線性優化方法&#xff0c;認為當前時刻狀態應該結合之前所有時刻的狀態一起考慮。 卡爾曼濾波是…

SD NAND:為車載顯示器注入智能與安全的心臟

SD NAND 在車載顯示器的應用 在車載顯示器上&#xff0c;SD NAND&#xff08;Secure Digital NAND&#xff09;可以有多種應用&#xff0c;其中一些可能包括&#xff1a; 導航數據存儲&#xff1a; SD NAND 可以用于存儲地圖數據、導航軟件以及車載系統的相關信息。這有助于提…

微服務day03-Nacos配置管理與Nacos集群搭建

一.Nacos配置管理 Nacos不僅可以作為注冊中心&#xff0c;可以進行配置管理 1.1 統一配置管理 統一配置管理可以實現配置的熱更新&#xff08;即不用重啟當服務發生變更時也可以直接更新&#xff09; dataId格式&#xff1a;服務名-環境名.yaml&#xff0c;分組一般使用默認…

InnoDB高級特性篇(5)-使用InnoDB的全文索引

InnoDB是MySQL數據庫的一個關系型存儲引擎。它提供了很多強大的功能&#xff0c;其中一個重要的功能是全文索引。全文索引允許我們在文本數據中進行高效的搜索&#xff0c;以找到包含特定關鍵詞的記錄。在本文中&#xff0c;我們將詳細介紹如何在InnoDB中使用全文索引。 首先&…

藍橋杯備戰刷題two(自用)

1.楊輝三角形 #include<iostream> using namespace std; #define ll long long const int N2e510; int a[N]; //1 0 0 0 0 0 0 //1 1 0 0 0 0 0 //1 2 1 0 0 0 0 //1 3 3 1 0 0 0 //1 4 6 4 1 0 0 //1 5 10 10 5 1 //前綴和思想 //第一列全為1,第二列為從0開始遞增1的序…

信息檢索(七):Transformer Memory as a Differentiable Search Index

Transformer Memory as a Differentiable Search Index 摘要1. 引言2. 相關工作3. 可微搜索索引3.1 索引策略3.1.1 索引方法3.1.2 文檔表示策略 3.2 用于檢索的 Docids 表示3.3 訓練和優化 4. 實驗4.1 基線4.2 實驗結果 5. 結論參考資料 原文鏈接&#xff1a;https://proceedin…

Revit-二開之創建線性尺寸標注-(5)

創建線性尺寸標注 對應的Revit界面的按鈕 線性尺寸標注源碼 本篇文章實現的邏輯是從rvt文章中拾取一面墻,然后對墻添加再水平方向上的線性尺寸標注 protected override Result OnExecute(ExternalCommandData commandData, ref string message, ElementSet elements

LeetCode 刷題 [C++] 第55題.跳躍游戲

題目描述 給你一個非負整數數組 nums &#xff0c;你最初位于數組的 第一個下標 。數組中的每個元素代表你在該位置可以跳躍的最大長度。 判斷你是否能夠到達最后一個下標&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否則&#xff0c;返回 false 題目分析 題目中…

2.1 mov、add和sub加減指令實操體驗

匯編語言 1. mov操作 1.1 mov移動值 mov指令把右邊的值移動到左邊 mount c d:masm c: debug r ax 0034 r 073f:0100 mov ax,7t1.2 mov移動寄存器的值 把右邊寄存器的值賦值給左邊的寄存器 a 073f:0105 mov bx,axt1.3 mov高八位&#xff08;high&#xff09;和低八位&am…

設計模式——中介者模式(mediator pattern)

概述 如果在一個系統中對象之間的聯系呈現為網狀結構&#xff0c;如下圖所示。對象之間存在大量的多對多聯系&#xff0c;將導致系統非常復雜&#xff0c;這些對象既會影響別的對象&#xff0c;也會被別的對象所影響&#xff0c;這些對象稱為同事對象&#xff0c;它們之間通過彼…

json---->如何把對象以json的形式傳遞給后端?

把對象以json的形式傳遞有很多種&#xff0c;先寫一種&#xff0c;后期再補充 &#x1f64c;&#x1f64c;&#x1f64c;&#x1f64c;&#x1f64c;&#x1f64c;&#x1f64c;&#x1f64c;&#x1f64c;&#x1f64c;&#x1f64c;&#x1f64c;&#x1f64c;&#x1f64c;&…

?用細節去解釋,如何打造一款行政旗艦車型

高山行政加長版應該是這個級別里最大的幾款 MPV 之一了&#xff0c;對于一款較大的車型&#xff0c;其最重要的是解決行駛的便利性。 這次我們就試試魏牌高山行政加長版&#xff0c;從產品本身出發看幾個緯度的細節&#xff1a; 行政該如何定義加長后產品的功能變化加長之后到…

Ladder類創建梯形對象共享一個下底

package Absent;public class Chapter5 {public static void main(String[] args) {Ladder.bottom100;Ladder ladderOnenew Ladder();Ladder ladderTwonew Ladder();ladderOne.top23;ladderTwo.top34;System.out.println("ladderOne的上底&#xff1a;"ladderOne.get…