#深度学习# #人工智能# #神经网络# #计算机视觉# #python#
计算机视觉
13.7 单发多框检测(SSD)
SSD模型主要由基础网络组成,其后是几个多尺度特征块。
SSD通过单神经网络来检测模型,以每个像素为中心的产生多个锚框,在多个段的输出上进行多尺度的检测。
##
补充YOLO:
##
SSD实现:
类别预测层:
我们定义了这样一个类别预测层,通过参数num_anchors
和num_classes
分别指定了𝑎和𝑞。 该图层使用填充为1的3×33×3的卷积层。此卷积层的输入和输出的宽度和高度保持不变。
%matplotlib inline
import torch
import torchvision
from torch import nn
from torch.nn import functional as F
from d2l import torch as d2l
def cls_predictor(num_inputs, num_anchors, num_classes):
return nn.Conv2d(num_inputs, num_anchors * (num_classes + 1),
kernel_size=3, padding=1)
边界框预测层:
边界框预测层的设计与类别预测层的设计类似。 唯一不同的是,这里需要为每个锚框预测4个偏移量,而不是𝑞+1个类别。
def bbox_predictor(num_inputs, num_anchors):
return nn.Conv2d(num_inputs, num_anchors * 4, kernel_size=3, padding=1)
连结多尺度的预测:
单发多框检测使用多尺度特征图来生成锚框并预测其类别和偏移量。 在不同的尺度下,特征图的形状或以同一单元为中心的锚框的数量可能会有所不同。 因此,不同尺度下预测输出的形状可能会有所不同。验证如下:
def forward(x, block):
return block(x)
Y1 = forward(torch.zeros((2, 8, 20, 20)), cls_predictor(8, 5, 10))
Y2 = forward(torch.zeros((2, 16, 10, 10)), cls_predictor(16, 3, 10))
Y1.shape, Y2.shape
结果输出:
除了批量大小这一维度外,其他三个维度都具有不同的尺寸。为了将这两个预测输出链接起来以提高计算效率,我们将把这些张量转换为更一致的格式。通道维包含中心相同的锚框的预测结果。我们首先将通道维移到最后一维。 因为不同尺度下批量大小仍保持不变,我们可以将预测结果转成二维的(批量大小,高××宽××通道数)的格式,以方便之后在维度11上的连结。
def flatten_pred(pred):
return torch.flatten(pred.permute(0, 2, 3, 1), start_dim=1)
def concat_preds(preds):
return torch.cat([flatten_pred(p) for p in preds], dim=1)
现,尽管Y1
和Y2
在通道数、高度和宽度方面具有不同的大小,我们仍然可以在同一个小批量的两个不同尺度上连接这两个预测输出。
concat_preds([Y1, Y2]).shape
结果输出:
高和宽减半块:
定义了高和宽减半块down_sample_blk
,该模块将输入特征图的高度和宽度减半。