一. 多尺度目标检测
import torch
import d2l.torch
img = d2l.torch.plt.imread('../images/catdog.jpg')
h,w = img.shape[:2]
h,w
fig = d2l.torch.plt.imshow(img)
fig
def display_anchors(fmap_w,fmap_h,sizes):
d2l.torch.set_figsize()
# 前两个维度上的值不影响输出
data = torch.zeros((1,10,fmap_h,fmap_w))
#multibox_prior()函数生成的是所有像素的锚框,返回值是所有锚框的左上右下坐标
anchors = d2l.torch.multibox_prior(data,sizes,ratios=[1,2,0.5])
bbox_scale = torch.tensor((w,h,w,h))
d2l.torch.show_bboxes(d2l.torch.plt.imshow(img).axes,bboxes=anchors[0]*bbox_scale)
display_anchors(fmap_w=4,fmap_h=4,sizes=[0.15])
4. 然后,将特征图的高度和宽度减小一半,然后使用较大的锚框来检测较大的目标,当尺度设置为0.4时,一些锚框将彼此重叠,如下图所示。
display_anchors(fmap_w=2,fmap_h=2,sizes=[0.4])
5. 最后进一步将特征图的高度和宽度减小一半,然后将锚框的尺度增加到0.8, 此时锚框的中心即是图像的中心,如下图所示。
display_anchors(fmap_w=1,fmap_h=1,sizes=[0.8])
在某种规模上,假设有 张形状为 ℎ× 的特征图,因此生成了 ℎ 组锚框,其中每组都有 个中心相同的锚框。 例如,给定10个(通道数量) 4×4 的特征图,我们生成了16组锚框,每组包含3个中心相同的锚框。 接下来,每个锚框都根据真实值边界框来标记了类和偏移量。 在当前尺度下,目标检测模型需要预测输入图像上 ℎ 组锚框类别和偏移量,其中不同组锚框具有不同的中心。
假设此处的 张特征图是CNN基于输入图像的正向传播算法获得的中间输出。 既然每张特征图上都有 ℎ 个不同的空间位置,那么相同空间位置可以看作含有 个单元。 根据感受野的定义,特征图在相同空间位置的 个单元在输入图像上的感受野相同: 它们表征了同一感受野内的输入图像信息,因此可以将特征图在同一空间位置的 个单元变换为使用此空间位置生成的 个锚框类别和偏移量。 本质上,用输入图像在某个感受野区域内的信息,来预测输入图像上与该区域位置相近的锚框类别和偏移量。
当不同层的特征图在输入图像上分别拥有不同大小的感受野时,它们可以用于检测不同大小的目标。 设计一个神经网络,其中靠近输出层的特征图单元具有更宽的感受野,这样它们就可以从输入图像中检测到较大的目标。
简言之,利用深层神经网络在多个层次上对图像进行分层表示,从而实现多尺度目标检测。
1.在多个尺度下,可以生成不同尺寸的锚框来检测不同尺寸的目标。
2. 通过定义特征图的形状,可以决定任何图像上均匀采样的锚框的中心。
3. 使用输入图像在某个感受野区域内的信息,来预测输入图像上与该区域位置相近的锚框类别和偏移量。
4. 通过深度学习,在多个层次上的图像分层表示进行多尺度目标检测。
import torch
import d2l.torch
img = d2l.torch.plt.imread('../images/catdog.jpg')
h, w = img.shape[:2]
h, w
fig = d2l.torch.plt.imshow(img)
fig
def display_anchors(fmap_w, fmap_h, sizes):
d2l.torch.set_figsize()
data = torch.zeros((1, 10, fmap_h, fmap_w))
anchors = d2l.torch.multibox_prior(data, sizes, ratios=[1, 2, 0.5])
bbox_scale = torch.tensor((w, h, w, h))
d2l.torch.show_bboxes(d2l.torch.plt.imshow(img).axes, bboxes=anchors[0] * bbox_scale)
display_anchors(fmap_w=4, fmap_h=4, sizes=[0.15])
display_anchors(fmap_w=2, fmap_h=2, sizes=[0.4])
display_anchors(fmap_w=1, fmap_h=1, sizes=[0.8])