多尺度目标检测 Multiscale Object Detection

多尺度目标检测 Multiscale Object Detection

我们在输入图像的每个像素上生成多个锚框。这些定位框用于对输入图像的不同区域进行采样。但是,如果锚定框是以图像的每个像素为中心生成的,很快就会有太多的锚框供我们计算。例如,我们假设输入图像的高度和宽度分别为561和728像素。如果以每个像素为中心生成五个不同形状的锚框,则超过两百万个锚框(561×728×5)需要在图像上进行预测和标记。

减少锚箱数量并不困难。一种简单的方法是对输入图像中的一小部分像素进行均匀采样,并生成以采样像素为中心的锚框。此外,我们可以在多个尺度上生成不同数量和尺寸的锚箱。请注意,较小的对象比较大的对象更有可能定位在图像上。这里,我们将使用一个简单的示例:

具有1×1, 1×2,和2×2在具有形状的图像上可能有4、2和1可能的位置2×2。 因此,当使用较小的锚定框来检测较小的对象时,我们可以采样更多的区域;当使用较大的锚框检测较大的对象时,我们可以采样较少的区域。

为了演示如何在多个比例上生成锚框,让我们先读一个图像。它的高度和宽度561×728像素。

%matplotlib inline

from d2l import mxnet as d2l

from mxnet import image, np, npx

npx.set_np()

img = image.imread(’…/img/catdog.jpg’)

h, w = img.shape[0:2]

h, w

(561, 728)

卷积神经网络(CNN)的二维阵列输出称为特征映射。通过定义特征映射的形状,可以确定任意图像上均匀采样的锚盒的中点。

函数display_anchors定义如下。我们将在特征地图fmap上的每个单元(像素)上生成锚定框。因为坐标轴x和y在锚定框中,锚定被特征地图fmap的宽度和高度分割,0到1之间的值可以用来表示锚定框在特征地图中的相对位置。由于锚框锚定点的中点与特征地图fmap上的所有单元重叠,因此锚定点在任何图像上的相对空间位置必须具有均匀的分布。具体来说,当特征图的宽度和高度分别设置为fmap_w和fmap_h时,该函数将对fmap_h行和fmap_w列进行统一采样,并将它们作为中点生成大小为s(我们假设列表s的长度为1)和不同纵横比(比率)的锚框。

def display_anchors(fmap_w, fmap_h, s):

d2l.set_figsize((3.5, 2.5))

# The values from the first two dimensions will not affect the output

fmap = np.zeros((1, 10, fmap_w, fmap_h))

anchors = npx.multibox_prior(fmap, sizes=s, ratios=[1, 2, 0.5])

bbox_scale = np.array((w, h, w, h))

d2l.show_bboxes(d2l.plt.imshow(img.asnumpy()).axes,

                anchors[0] * bbox_scale)

我们首先将重点放在小物体的探测上。为了便于在显示时进行区分,此处具有不同中点的锚定框不重叠。我们假设锚框的大小为0.15,特征映射的高度和宽度为4。我们可以看到图片上4行4列的锚框中点分布均匀。

display_anchors(fmap_w=4, fmap_h=4, s=[0.15])
在这里插入图片描述
把特征地图的高度和宽度减少一半,并使用一个更大的定位框来检测更大的物体。当“大小”设置为0.4时,某些锚框的区域之间将发生重叠。

display_anchors(fmap_w=2, fmap_h=2, s=[0.4])
在这里插入图片描述
最后,我们将把特征图的高度和宽度减少一半,并将锚框大小增加到0.8。现在锚框的中点就是图像的中心。

display_anchors(fmap_w=1, fmap_h=1, s=[0.8])
在这里插入图片描述
由于我们已经在多个尺度上生成了不同大小的锚盒,因此我们将使用它们来检测不同尺度下不同大小的对象。现在我们将介绍一种基于卷积神经网络(CNNs)的方法。

在一定的范围内,假设我们产生高×宽具有不同中点的锚定框集基于ci,带形状的特征地图高×宽,每组锚箱数量为a。

例如,对于第一个比例的实验,我们基于10个(通道数)特征映射生成16组具有不同中点的锚盒,形状为4×4个,每套含3个锚箱。

根据地面真实边界框的分类和位置,为每个锚框标记一个类别和偏移量。在当前尺度下,目标检测模型需要预测目标的类别和偏移量高×宽,基于输入图像具有不同中点的定位框集。

我们假设ci特征图是CNN基于输入图像的中间输出。因为每个特征地图都有高×宽不同的空间位置,相同的位置会有ci单位。根据感受野的定义,ci同一空间位置的特征图单元在输入图像上具有相同的感受野。因此,它们表示输入图像在同一感受野中的信息。

因此,我们可以改变ci,在同一空间位置的要素映射单位生成一个定位框。不难看出,本质上,我们利用输入图像在某个接收野的信息来预测输入图像上靠近场的锚盒的种类和偏移量。

当不同层次的特征映射在输入图像上有不同大小的接收野时,它们被用来检测不同大小的目标。例如,我们可以在一个更大的图像接收层设计一个更大的图像接收层。

Summary

We can generate anchor boxes with different numbers and sizes on
multiple scales to detect objects of different sizes on multiple
scales.
The shape of the feature map can be used to determine the midpoint of the anchor boxes that uniformly sample any image.
We use the information for the input image from a certain receptive
field to predict the category and offset of the anchor boxes close to
that field on the image.

已标记关键词 清除标记
Linux创始人Linus Torvalds有一句名言:Talk is cheap, Show me the code.(冗谈不够,放码过来!)。 代码阅读是从入门到提高的必由之路。尤其对深度学习,许多框架隐藏了神经网络底层的实现,只能在上层调包使用,对其内部原理很难认识清晰,不利于进一步优化和创新。   YOLOv3是一种基于深度学习的端到端实时目标检测方法,以速度快见长。 YOLOv3的实现Darknet是使用C语言开发的轻型开源深度学习框架,依赖少,可移植性好,可以作为很好的代码阅读案例,让我们深入探究其实现原理。   本课程将解析YOLOv3的实现原理和源码,具体内容包括:      YOLO目标检测原理       神经网络及Darknet的C语言实现,尤其是反向传播的梯度求解和误差计算       代码阅读工具及方法       深度学习计算的利器:BLAS和GEMM       GPU的CUDA编程方法及在Darknet的应用       YOLOv3的程序流程及各层的源码解析   本课程将提供注释后的Darknet的源码程序文件。   除本课程《YOLOv3目标检测:原理与源码解析》外,本人推出了有关YOLOv3目标检测的系列课程,包括:   《YOLOv3目标检测实战:训练自己的数据集》   《YOLOv3目标检测实战:交通标志识别》   《YOLOv3目标检测:原理与源码解析》   《YOLOv3目标检测:网络模型改进方法》   建议先学习课程《YOLOv3目标检测实战:训练自己的数据集》或课程《YOLOv3目标检测实战:交通标志识别》,对YOLOv3的使用方法了解以后再学习本课程。
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页