帝國cms怎么做網(wǎng)站谷歌ads
PyTorch深度學(xué)習(xí)實戰(zhàn)(23)——從零開始實現(xiàn)SSD目標(biāo)檢測
- 0. 前言
- 1. SSD 目標(biāo)檢測模型
- 1.1 SSD 網(wǎng)絡(luò)架構(gòu)
- 1.2 利用不同網(wǎng)絡(luò)層執(zhí)行邊界框和類別預(yù)測
- 1.3 不同網(wǎng)絡(luò)層中默認(rèn)框的尺寸和寬高比
- 1.4 數(shù)據(jù)準(zhǔn)備
- 1.5 模型訓(xùn)練
- 2. 實現(xiàn) SSD 目標(biāo)檢測
- 2.1 SSD300 架構(gòu)
- 2.2 MultiBoxLoss
- 2. 訓(xùn)練 SSD
- 小結(jié)
- 系列鏈接
0. 前言
SSD
(Single Shot MultiBox Detector
) 是一種基于單次前向傳遞的實時目標(biāo)檢測算法,它在速度和準(zhǔn)確性之間取得了很好的平衡。與傳統(tǒng)的兩階段目標(biāo)檢測算法(如 Faster R-CNN
)不同,SSD
直接在圖像的多個尺度上進行預(yù)測,無需候選框生成和篩選。SSD
的核心思想是在卷積神經(jīng)網(wǎng)絡(luò)的不同層級上設(shè)置多個特征圖用于預(yù)測目標(biāo)。這些特征圖在空間上具有不同的尺度,可以檢測不同大小的目標(biāo)。每個特征圖上的每個位置都預(yù)測一組邊界框和對應(yīng)的類別概率。在本節(jié)中,將介紹 SSD
的工作原理,然后在自定義數(shù)據(jù)集上訓(xùn)練 SSD
目標(biāo)檢測模型。
1. SSD 目標(biāo)檢測模型
在 R-CNN 和 YOLO 目標(biāo)檢測模型中,通過數(shù)次應(yīng)用卷積和池化預(yù)測目標(biāo)對象類別和邊界框。同時,我們也知道不同的網(wǎng)絡(luò)層對原始圖像具有不同的感受野,初始層相對于最終層具有較小的感受野。在本節(jié)中,我們將學(xué)習(xí) SSD
如何利用這一現(xiàn)象來預(yù)測圖像中目標(biāo)對象的邊界框。
SSD
(Single Shot Multibox Detector
) 使用了多層感受野的特性來解決多尺度目標(biāo)檢測問題,檢測圖像中不同尺度的目標(biāo)對象,具體來說:
- 使用額外的網(wǎng)絡(luò)層擴展預(yù)訓(xùn)練的
VGG
網(wǎng)絡(luò),直到獲得1 x 1
的輸出 - 與僅使用最終層進行邊界框和類別預(yù)測不同,
SSD
利用這些添加的卷積層和池化層檢測大小不同的物體 SSD
使用特定比例和縱橫比的默認(rèn)框來代替錨框,并將這些框與不同特征圖中的不同尺寸的目標(biāo)相對應(yīng)- 與
YOLO
使用錨框預(yù)測類別和偏移量一樣,SSD
通過對每個默認(rèn)框進行類別和偏移量預(yù)測來輸出目標(biāo)檢測結(jié)果
總體而言,SSD
與 YOLO
的主要區(qū)別包括:SSD
中使用默認(rèn)框 (default box
) 替換了 YOLO
中的錨框 (anchor box
),并且 SSD
中使用多層特征圖執(zhí)行預(yù)測,而 YOLO
中使用最終特征層。
1.1 SSD 網(wǎng)絡(luò)架構(gòu)
SSD
的網(wǎng)絡(luò)架構(gòu)如下:
如上圖中所示,將一張尺寸為 300 x 300 x 3
的圖像輸入到預(yù)訓(xùn)練的 VGG-16
網(wǎng)絡(luò)獲得 conv5_3
層的輸出,然后,通過在 conv5_3
后追加更多卷積層來擴展網(wǎng)絡(luò)。
1.2 利用不同網(wǎng)絡(luò)層執(zhí)行邊界框和類別預(yù)測
接下來,針對每個單元格和每個默認(rèn)框獲取邊界框偏移量和類別預(yù)測。conv5_3
輸出的預(yù)測總數(shù)為 38 x 38 x 4
,其中 38 x 38
是 conv5_3
層的輸出形狀,4
是在 conv5_3
層上的默認(rèn)框數(shù)量。以此類推,整個網(wǎng)絡(luò)的參數(shù)總數(shù)如下:
層 | 權(quán)重數(shù) |
---|---|
conv5_3 | 38 x 38 x 4 = 5776 |
FC6 | 19 x 19 x 6 = 2166 |
conv8_2 | 10 x 10 x 6 = 600 |
conv9_2 | 5 x 5 x 6 = 150 |
conv10_2 | 3 x 3 x 4 = 36 |
conv11_2 | 1 x 1 x 4 = 4 |
總計 | 8732 |
可以看到,每個網(wǎng)絡(luò)層中特征圖網(wǎng)格單元上使用的默認(rèn)框數(shù)量并不相同。
1.3 不同網(wǎng)絡(luò)層中默認(rèn)框的尺寸和寬高比
本節(jié)中,我們學(xué)習(xí)如何確定默認(rèn)框的尺寸和寬高比,首先計算默認(rèn)框尺寸。假設(shè)目標(biāo)對象最小尺寸為圖像高度的 20%
、寬度的 20%
,最大尺寸為高度的 90%
、寬度的 90%
。在這種情況下,隨著網(wǎng)絡(luò)層的逐漸增加,圖像大小會顯著縮小:
圖像縮放的公式如下:
l e v e l i n d e x : l = 1 , . . . , L s c a l e o f b o x e s : s l = s m i n + s m a x ? s m i n L ? 1 ( l ? 1 ) level\ index:l=1,...,L \\ scale\ of\ boxes:s_l=s_{min}+\frac{s_{max}-s_{min}}{L-1}(l-1) level?index:l=1,...,Lscale?of?boxes:sl?=smin?+L?1smax??smin??(l?1)
了解了如何計算默認(rèn)框在不同網(wǎng)絡(luò)層的尺寸后,我們繼續(xù)學(xué)習(xí)如何確定默認(rèn)框的寬高比,常用的寬高比如下:
a s p e c t r a t i o : r ∈ 1 , 2 , 3 , 1 / 2 , 1 / 3 aspect\ ratio:r∈{1,2,3,1/2,1/3} aspect?ratio:r∈1,2,3,1/2,1/3
不同網(wǎng)絡(luò)層的默認(rèn)框框的中心坐標(biāo)如下:
c e n t e r l o c a t i o n : ( x l i , y l i ) = ( i + 0.5 m , j + 0.5 n ) center\ location:(x_l^i,y_l^i)=(\frac {i+0.5}{m},\frac{j+0.5}{n}) center?location:(xli?,yli?)=(mi+0.5?,nj+0.5?)
其中,使用 i i i 和 j j j 表示第 l l l 層中的一個單元。
不同寬高比對應(yīng)的寬高計算如下:
w i d t h : w l r = s l r h e i g h t : h l r = s l r width:w_l^r=s_l\sqrt r\\ height:h_l^r=s_l\sqrt r width:wlr?=sl?r?height:hlr?=sl?r?
需要注意的是,我們在不同網(wǎng)絡(luò)層使用了不同數(shù)量的默認(rèn)框( 4
個或 6
個),如果想要使用 4
個默認(rèn)框,刪除縱橫比 {3,1/3}
,否則使用 6
個默認(rèn)框,結(jié)合不同層及其特征圖的比例和長寬比來檢測各種尺寸的對象,第 6
個默認(rèn)框的縱橫比計算方式如下:
a d d i t i o n a l s c a l e : s l ′ = s l s l + 1 w h e n r = 1 additional\ scale:s_l'=\sqrt{s_ls_l+1}\ \ \ \ when\ r=1 additional?scale:sl′?=sl?sl?+1?????when?r=1
獲得了所有可能的默認(rèn)框后,我們繼續(xù)學(xué)習(xí)如何準(zhǔn)備訓(xùn)練數(shù)據(jù)集。
1.4 數(shù)據(jù)準(zhǔn)備
交并比 (Intersection over Union
, IoU
) 大于指定閾值(例如 0.5
) 的默認(rèn)框被視為正匹配,其余為負(fù)匹配。在 SSD
的輸出中,我們預(yù)測默認(rèn)框?qū)儆谀硞€類別(其中第 0
個類別表示背景)的概率,以及默認(rèn)框相對于真實邊界框的偏移量。
最后,我們通過優(yōu)化分類和定位損失值來訓(xùn)練模型。
1.5 模型訓(xùn)練
分類損失:
L c l s = ? ∑ i ∈ p o s l i j k l o g ( c ^ i k ) ? ∑ i ∈ n e g l o g ( c ^ i 0 ) , w h e r e c ^ i k = s o f t m a x ( c i k ) L_{cls}=-\sum_{i∈pos}l_{ij}^klog(\hat c_i^k)-\sum_{i∈neg}log(\hat c_i^0),\ where\ \hat c_i^k\ =\ softmax(c_i^k) Lcls?=?i∈pos∑?lijk?log(c^ik?)?i∈neg∑?log(c^i0?),?where?c^ik??=?softmax(cik?)
其中,pos
表示與真實邊界框高度重疊的默認(rèn)框,而 neg
表示被錯誤分類的默認(rèn)框(模型預(yù)測這些默認(rèn)框中包含某個類別但實際上沒有包含目標(biāo)對象)。最后,需要確保 pos : neg
比率最多為 1:3
,否則會因為背景類別默認(rèn)框過多導(dǎo)致預(yù)測偏差。
定位損失:對于定位,僅在目標(biāo)對象得分大于某個閾值時才計算損失值,定位損失計算如下:
L l o c = ∑ i , j ∑ m ∈ { x , y , w , h } 1 i j m a t c h L 1 s m o o t h ( d m i ? t m j ) 2 L 1 s m o o t h ( x ) = { 0.5 x 2 i f ∣ x ∣ < 1 ∣ x ∣ ? 0.5 o t h e r w i s e t x j = g x i ? p x i p w i t y j = g y i ? p y i p h i t w j = l o g g w i p w i t h j = l o g g h i p h i L_{loc}=\sum_{i,j}\sum_{m∈\{x,y,w,h\}}1_{ij}^{match}L_1^{smooth}(d_m^i-t_m^j)^2\\ L_1^{smooth}(x)=\left\{ \begin{array}{rcl} 0.5x^2 & & {if\ |x|<1}\\ |x|-0.5 & & {otherwise} \end{array} \right.\\ t_x^j=\frac {g_x^i-p_x^i}{p_w^i}\\ t_y^j=\frac {g_y^i-p_y^i}{p_h^i}\\ t_w^j=log\frac {g_w^i}{p_w^i}\\ t_h^j=log\frac {g_h^i}{p_h^i} Lloc?=i,j∑?m∈{x,y,w,h}∑?1ijmatch?L1smooth?(dmi??tmj?)2L1smooth?(x)={0.5x2∣x∣?0.5??if?∣x∣<1otherwise?txj?=pwi?gxi??pxi??tyj?=phi?gyi??pyi??twj?=logpwi?gwi??thj?=logphi?ghi??
其中, t t t 是預(yù)測的偏移量, d d d 是實際的偏移量。了解了如何訓(xùn)練 SSD
后,在下一節(jié)中,我們將使用 PyTorch
從零開始實現(xiàn) SSD
模型用于公共汽車與卡車目標(biāo)檢測任務(wù)。
2. 實現(xiàn) SSD 目標(biāo)檢測
2.1 SSD300 架構(gòu)
SSD300
模型架構(gòu)包含三個子模塊:
class SSD300(nn.Module):...def __init__(self, n_classes, device):...self.base = VGGBase()self.aux_convs = AuxiliaryConvolutions()self.pred_convs = PredictionConvolutions(n_classes)...
首先將圖片輸入到 VGGBase
主干網(wǎng)絡(luò),返回兩個維度為 (N, 512, 38, 38)
和 (N, 1024, 19, 19)
的特征向量。第二個輸出將作為 AuxiliaryConvolutions
的輸入,并返回維度為 (N, 512, 10, 10)
、(N, 256, 5, 5)
、(N, 256, 3, 3)
和 (N, 256, 1, 1)
的輸出特征圖。最后,將 VGGBase
的第一個輸出和 AuxiliaryConvolutions
的四個輸出特征圖輸入到 PredictionConvolutions
,返回 8,732
個默認(rèn)框。
SSD300
類的另一個關(guān)鍵是 create_prior_boxes
方法。對于每個特征圖,都有三個與之相關(guān)的參數(shù):網(wǎng)格大小、網(wǎng)格單元的比例(特征圖的基本默認(rèn)框)以及單元格中所有默認(rèn)框的寬高比。使用這三個配置,代碼使用三重 for 循環(huán)創(chuàng)建一個包含 8732
個默認(rèn)框 (cx, cy, w, h)
的列表。
最后,detect_objects
方法將預(yù)測的默認(rèn)框分類和回歸結(jié)果的張量轉(zhuǎn)換為實際的邊界框坐標(biāo)。
2.2 MultiBoxLoss
對于人類而言,我們只需關(guān)注少數(shù)幾個邊界框。但是對于 SSD
而言,需要比較來自多個特征圖的 8,732
個邊界框,并預(yù)測默認(rèn)框是否包含有價值的信息,使用 MultiBoxLoss
計算模型損失。前向傳播方法 forward
的輸入是模型的默認(rèn)框預(yù)測和真實邊界框。
首先,通過將模型中的每個默認(rèn)框與邊界框進行比較,將真實邊界框轉(zhuǎn)換為一個包含 8732
個默認(rèn)框的列表。如果 IoU
足夠高,那么特定的默認(rèn)框?qū)⒕哂蟹橇愕幕貧w坐標(biāo),并將對象類別作為分類的真實值。然后,計算分類置信度和定位損失,并返回這些損失的總和作為前向傳播的輸出。大多數(shù)默認(rèn)框會被歸類為背景類別,因為它們與真實邊界框的 IoU
非常小(甚至在大多數(shù)情況下為零)。
一旦將真實值轉(zhuǎn)換為包含 8,732
個默認(rèn)框的回歸和分類張量,就可以將它們與模型的預(yù)測進行比較。對回歸張量執(zhí)行 MSE-Loss
,對定位張量執(zhí)行 CrossEntropy-Loss
,并將它們加起來作為最終損失返回。
2. 訓(xùn)練 SSD
在本節(jié)中,我們將使用 PyTorch
實現(xiàn) SSD
模型來檢測圖像中目標(biāo)對象的邊界框,繼續(xù)使用與 R-CNN 一節(jié)中相同的數(shù)據(jù)集。
(1) 加載圖像數(shù)據(jù)集及所需庫:
from torchvision.ops import nms
import torch
import numpy as np
from torch.utils.data import DataLoader, Dataset
from glob import glob
from matplotlib import pyplot as plt
import pandas as pd
import matplotlib.patches as mpatches
from PIL import Image
from torchvision import transformsdevice = 'cuda' if torch.cuda.is_available() else 'cpu'DATA_ROOT = 'open-images-bus-trucks/'
IMAGE_ROOT = f'{DATA_ROOT}/images'
DF_RAW = df = pd.read_csv('open-images-bus-trucks/df.csv')
print(DF_RAW.head())df = df[df['ImageID'].isin(df['ImageID'].unique().tolist())]
label2target = {l:t+1 for t,l in enumerate(DF_RAW['LabelName'].unique())}
label2target['background'] = 0
target2label = {t:l for l,t in label2target.items()}
background_class = label2target['background']
num_classes = len(label2target)
(2) 預(yù)處理數(shù)據(jù):
normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225]
)
denormalize = transforms.Normalize(mean=[-0.485/0.229, -0.456/0.224, -0.406/0.255],std=[1/0.229, 1/0.224, 1/0.255]
)
def preprocess_image(img):img = torch.tensor(img).permute(2,0,1)img = normalize(img)return img.to(device).float()def find(item, original_list):results = []for o_i in original_list:if item in o_i:results.append(o_i)if len(results) == 1:return results[0]else:return results
(3) 定義數(shù)據(jù)集類:
class OpenDataset(torch.utils.data.Dataset):w, h = 300, 300def __init__(self, df, image_dir=IMAGE_ROOT):self.image_dir = image_dirself.files = glob(self.image_dir+'/*')self.df = dfself.image_infos = df.ImageID.unique()def __getitem__(self, ix):# load images and masksimage_id = self.image_infos[ix]img_path = find(image_id, self.files)img = Image.open(img_path).convert("RGB")img = np.array(img.resize((self.w, self.h), resample=Image.BILINEAR))/255.data = df[df['ImageID'] == image_id]labels = data['LabelName'].values.tolist()data = data[['XMin','YMin','XMax','YMax']].valuesdata[:,[0,2]] *= self.wdata[:,[1,3]] *= self.hboxes = data.astype(np.uint32).tolist() # convert to absolute coordinatesreturn img, boxes, labelsdef collate_fn(self, batch):images, boxes, labels = [], [], []for item in batch:img, image_boxes, image_labels = itemimg = preprocess_image(img)[None]images.append(img)boxes.append(torch.tensor(image_boxes).float().to(device)/300.)labels.append(torch.tensor([label2target[c] for c in image_labels]).long().to(device))images = torch.cat(images).to(device)return images, boxes, labelsdef __len__(self):return len(self.image_infos)
(4) 準(zhǔn)備訓(xùn)練和測試數(shù)據(jù)集以及數(shù)據(jù)加載器:
from sklearn.model_selection import train_test_split
trn_ids, val_ids = train_test_split(df.ImageID.unique(), test_size=0.1, random_state=99)
trn_df, val_df = df[df['ImageID'].isin(trn_ids)], df[df['ImageID'].isin(val_ids)]
len(trn_df), len(val_df)train_ds = OpenDataset(trn_df)
test_ds = OpenDataset(val_df)train_loader = DataLoader(train_ds, batch_size=4, collate_fn=train_ds.collate_fn, drop_last=True)
test_loader = DataLoader(test_ds, batch_size=4, collate_fn=test_ds.collate_fn, drop_last=True)
(5) 定義函數(shù)在批數(shù)據(jù)訓(xùn)練模型并計算驗證數(shù)據(jù)的準(zhǔn)確率和損失值:
def train_batch(inputs, model, criterion, optimizer):model.train()N = len(train_loader)images, boxes, labels = inputs_regr, _clss = model(images)loss = criterion(_regr, _clss, boxes, labels)optimizer.zero_grad()loss.backward()optimizer.step()return loss@torch.no_grad()
def validate_batch(inputs, model, criterion):model.eval()images, boxes, labels = inputs_regr, _clss = model(images)loss = criterion(_regr, _clss, boxes, labels)return loss
(6) 初始化模型(模型文件參考 ssd-utils)、優(yōu)化器和損失函數(shù):
from model import SSD300, MultiBoxLoss
from detect import *model = SSD300(num_classes, device)
optimizer = torch.optim.AdamW(model.parameters(), lr=1e-4, weight_decay=1e-5)
criterion = MultiBoxLoss(priors_cxcy=model.priors_cxcy, device=device)
(7) 訓(xùn)練 SSD
模型:
train_loss_epochs = []
val_loss_epochs = []for epoch in range(n_epochs):_n = len(train_loader)trn_loss = []val_loss = []for ix, inputs in enumerate(train_loader):loss = train_batch(inputs, model, criterion, optimizer)pos = (epoch + (ix+1)/_n)trn_loss.append(loss.item())train_loss_epochs.append(np.average(trn_loss))_n = len(test_loader)for ix,inputs in enumerate(test_loader):loss = validate_batch(inputs, model, criterion)pos = (epoch + (ix+1)/_n)val_loss.append(loss.item())
val_loss_epochs.append(np.average(val_loss))epochs = np.arange(n_epochs)+1
plt.plot(epochs, train_loss_epochs, 'bo', label='Training loss')
plt.plot(epochs, val_loss_epochs, 'r', label='Test loss')
plt.title('Training and Test loss over increasing epochs')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.grid('off')
plt.show()
訓(xùn)練和測試損失值隨時間的變化情況如下:
(8) 對測試圖像執(zhí)行預(yù)測。
加載測試圖像:
def show_bbs(im, bbs, clss):fig, ax = plt.subplots(ncols=2, nrows=1, figsize=(6, 6))ax[0].imshow(im)ax[0].grid(False)ax[0].set_title('Original image')if len(bbs) == 0:ax[1].imshow(im)ax[1].set_title('No objects')plt.show()returnax[1].imshow(im)for ix, (xmin, ymin, xmax, ymax) in enumerate(bbs):rect = mpatches.Rectangle((xmin, ymin), xmax-xmin, ymax-ymin, fill=False, edgecolor='red', linewidth=1)ax[1].add_patch(rect)centerx = xmin # + new_w/2centery = ymin + 20# + new_h - 10plt.text(centerx, centery, clss[ix].replace('@', ''),fontsize = 10,color='red')ax[1].grid(False)ax[1].set_title('Predicted bounding box and class')plt.show()from random import choice
image_paths = glob.glob(f'{DATA_ROOT}/images/*')
image_id = choice(test_ds.image_infos)
print(image_id)
img_path = find(image_id, test_ds.files)
original_image = Image.open(img_path, mode='r')
original_image = original_image.convert('RGB')
獲取與圖像中的目標(biāo)對象對應(yīng)的邊界框、標(biāo)簽和置信度分?jǐn)?shù):
image_paths = glob.glob(f'{DATA_ROOT}/images/*')
for _ in range(20):image_id = choice(test_ds.image_infos)img_path = find(image_id, test_ds.files)original_image = Image.open(img_path, mode='r')bbs, labels, scores = detect(original_image, model, min_score=0.9, max_overlap=0.5,top_k=200, device=device)labels = [target2label[c.item()] for c in labels]label_with_conf = [f'{l} @ {s:.2f}' for l,s in zip(labels,scores)]print(bbs, label_with_conf)
在圖像上繪制輸出結(jié)果:
show_bbs(original_image, bbs=bbs, clss=label_with_conf)#, text_sz=10)
小結(jié)
SSD
使用基礎(chǔ)網(wǎng)絡(luò)(如 VGG16
或 ResNet
)提取圖像特征,然后,通過添加額外的卷積層和特征圖金字塔來獲取不同尺度的特征圖。每個特征圖單元預(yù)測固定數(shù)量的邊界框,并預(yù)測每個邊界框?qū)儆诓煌悇e的概率。為了提高檢測的準(zhǔn)確性,SSD
還引入了不同大小的默認(rèn)框,用于與預(yù)測的邊界框進行匹配。本文首先介紹了 SSD
模型的核心思想與目標(biāo)檢測流程,然后使用 PyTorch
從零開始實現(xiàn)了一個基于 SSD
的目標(biāo)檢測模型。
系列鏈接
PyTorch深度學(xué)習(xí)實戰(zhàn)(1)——神經(jīng)網(wǎng)絡(luò)與模型訓(xùn)練過程詳解
PyTorch深度學(xué)習(xí)實戰(zhàn)(2)——PyTorch基礎(chǔ)
PyTorch深度學(xué)習(xí)實戰(zhàn)(3)——使用PyTorch構(gòu)建神經(jīng)網(wǎng)絡(luò)
PyTorch深度學(xué)習(xí)實戰(zhàn)(4)——常用激活函數(shù)和損失函數(shù)詳解
PyTorch深度學(xué)習(xí)實戰(zhàn)(5)——計算機視覺基礎(chǔ)
PyTorch深度學(xué)習(xí)實戰(zhàn)(6)——神經(jīng)網(wǎng)絡(luò)性能優(yōu)化技術(shù)
PyTorch深度學(xué)習(xí)實戰(zhàn)(7)——批大小對神經(jīng)網(wǎng)絡(luò)訓(xùn)練的影響
PyTorch深度學(xué)習(xí)實戰(zhàn)(8)——批歸一化
PyTorch深度學(xué)習(xí)實戰(zhàn)(9)——學(xué)習(xí)率優(yōu)化
PyTorch深度學(xué)習(xí)實戰(zhàn)(10)——過擬合及其解決方法
PyTorch深度學(xué)習(xí)實戰(zhàn)(11)——卷積神經(jīng)網(wǎng)絡(luò)
PyTorch深度學(xué)習(xí)實戰(zhàn)(12)——數(shù)據(jù)增強
PyTorch深度學(xué)習(xí)實戰(zhàn)(13)——可視化神經(jīng)網(wǎng)絡(luò)中間層輸出
PyTorch深度學(xué)習(xí)實戰(zhàn)(14)——類激活圖
PyTorch深度學(xué)習(xí)實戰(zhàn)(15)——遷移學(xué)習(xí)
PyTorch深度學(xué)習(xí)實戰(zhàn)(16)——面部關(guān)鍵點檢測
PyTorch深度學(xué)習(xí)實戰(zhàn)(17)——多任務(wù)學(xué)習(xí)
PyTorch深度學(xué)習(xí)實戰(zhàn)(18)——目標(biāo)檢測基礎(chǔ)
PyTorch深度學(xué)習(xí)實戰(zhàn)(19)——從零開始實現(xiàn)R-CNN目標(biāo)檢測
PyTorch深度學(xué)習(xí)實戰(zhàn)(20)——從零開始實現(xiàn)Fast R-CNN目標(biāo)檢測
PyTorch深度學(xué)習(xí)實戰(zhàn)(21)——從零開始實現(xiàn)Faster R-CNN目標(biāo)檢測
PyTorch深度學(xué)習(xí)實戰(zhàn)(22)——從零開始實現(xiàn)YOLO目標(biāo)檢測
PyTorch深度學(xué)習(xí)實戰(zhàn)(23)——使用U-Net架構(gòu)進行圖像分割
PyTorch深度學(xué)習(xí)實戰(zhàn)(24)——從零開始實現(xiàn)Mask R-CNN實例分割
PyTorch深度學(xué)習(xí)實戰(zhàn)(25)——自編碼器(Autoencoder)
PyTorch深度學(xué)習(xí)實戰(zhàn)(26)——卷積自編碼器(Convolutional Autoencoder)
PyTorch深度學(xué)習(xí)實戰(zhàn)(27)——變分自編碼器(Variational Autoencoder, VAE)
PyTorch深度學(xué)習(xí)實戰(zhàn)(28)——對抗攻擊(Adversarial Attack)
PyTorch深度學(xué)習(xí)實戰(zhàn)(29)——神經(jīng)風(fēng)格遷移
PyTorch深度學(xué)習(xí)實戰(zhàn)(30)——Deepfakes
PyTorch深度學(xué)習(xí)實戰(zhàn)(31)——生成對抗網(wǎng)絡(luò)(Generative Adversarial Network, GAN)
PyTorch深度學(xué)習(xí)實戰(zhàn)(32)——DCGAN詳解與實現(xiàn)
PyTorch深度學(xué)習(xí)實戰(zhàn)(33)——條件生成對抗網(wǎng)絡(luò)(Conditional Generative Adversarial Network, CGAN)
PyTorch深度學(xué)習(xí)實戰(zhàn)(34)——Pix2Pix詳解與實現(xiàn)