提交 5bbf9259 编写于 作者: M muli

add yolo and mask rcnn

上级 7997dee9
......@@ -15,7 +15,15 @@
但也看到物体检测跟图片分类有类似之处,都是对一块图片区域判断其包含的主要物体。因此可以想象我们在前面介绍的基于卷积神经网络的图片分类可以被应用到这里。
这一章我们将介绍数个基于卷积神经网络的物体检测算法的思想。
这一章我们将介绍数个基于卷积神经网络的物体检测算法的思想:
- R-CNN: https://arxiv.org/abs/1311.2524
- Fast R-CNN: https://arxiv.org/abs/1504.08083
- Faster R-CNN: https://arxiv.org/abs/1506.01497
- Mask R-CNN: https://arxiv.org/abs/1703.06870
- SSD: https://arxiv.org/abs/1512.02325
- YOLO: https://arxiv.org/abs/1506.02640
- YOLOv2: https://arxiv.org/abs/1612.08242
## R-CNN:区域卷积神经网络
......@@ -77,5 +85,54 @@ Fast R-CNN沿用了R-CNN的选择性搜索方法来选择区域。这个通常
虽然看上有些复杂,但RPN思想非常直观。首先提议预先配置好的一些区域,然后通过神经网络来判断这些区域是不是感兴趣的,如果是,那么再预测一个更加准备的边框。这样我们能有效降低搜索任何形状的边框的代价。
## Mask R-CNN
Mask R-CNN在Faster R-CNN上加入了一个新的像素级别的预测层,它不仅对一个锚框预测它对应的类和真实的边框,而且它会判断这个锚框类每个像素对应的哪个物体还是只是背景。后者是语义分割要解决的问题。Mask R-CNN使用了之后我们将介绍的[全连接卷积网络(FCN)](./fcn.md)来完成这个预测。当然这也意味这训练数据必须有像素级别的标注,而不是简单的边框。
![Mask R-CNN](../img/mask-rcnn.svg)
因为FCN会精确预测每个像素的类别,就是输入图片中的每个像素都会在标注中对应一个类别。对于输入图片中的一个锚框,我们可以精确的匹配到像素标注中对应的区域。但是PoI池化是作用在卷积之后的特征上,其默认是将锚框做了定点化。例如假设选择的锚框是$(x,y,w,h)$,且特征抽取将图片变小了16倍,就是如果原始图片是$256\times 256$,那么特征大小就是$16\times 16$。这时候在特征上对应的锚框就是变成了$(\lfloor x/16 \rfloor, \lfloor y/16 \rfloor, \lfloor w/16 \rfloor, \lfloor h/16 \rfloor)$。如果$x,y,w,h$中有任何一个不被16整除,那么就可能发生错位。同样道理,在上面的样例中我们看到,如果锚框的长宽不被池化大小整除,那么同样会定电话,从而带来错位。
通常这样的错位只是在几个像素之间,对于分类和边框预测影响不大。但对于像素级别的预测,这样的错位可能会带来大问题。Mask R-CNN提出一个RoI Align层,它类似于RoI池化层,但是去除掉了定点话步骤,就是移除了所有$\lfloor \cdot \rfloor$。如果计算得到的表框不是刚好在像素之间,那么我们就用四周的像素来线性插值得到这个点上的值。
对于一维情况,假设我们要计算$x$点的值$f(x)$,那么我们可以用$x$左右的整点的值来插值:
$$f(x) = (\lfloor x \rfloor + 1-x)f(\lfloor x \rfloor) + (x-\lfloor x \rfloor)f(\lfloor x \rfloor + 1)$$
我们实际要使用的是二维差值来估计$f(x,y)$,我们首先在$x$轴上差值得到$f(x,\lfloor y \rfloor)$和$f(x,\lfloor y \rfloor+1)$,然后根据这两个值来差值得到$f(x, y)$.
## SSD: 单发多框检测器
在R-CNN系列模型里。区域提议和分类是分作两块来进行的。SSD则将其统一成一个步骤来使得模型更加简单并且速度更快,这也是为什么它被称之为**单发**的原因。
它跟Faster R-CNN主要有两点不一样
1. 对于锚框,我们不再首先判断它是不是含有感兴趣物体,再将正类锚框放入真正物体分类。SSD里我们直接使用一个`num_class+1`类分类器来判断它对应的是哪类物体,还是只是背景。我们也不再有额外的回归器对边框再进一步预测,而是直接使用单个回归器来预测真实边框。
1. SSD不只是对卷积神经网络输出的特征做预测,它会进一步将特征通过卷积和池化层变小来做预测。这样达到多尺度预测的效果。
![SSD](../img/ssd.svg)
SSD的具体实现将在[下一章](./ssd.md)详细阐述。
## YOLO:只需要看一遍
不管是Faster R-CNN还是SSD,它们生成的锚框仍然有大量是相互重叠的,从而导致仍然有大量的区域被重复计算了。YOLO试图来解决这个问题。它将图片特征均匀的切成 $S\times S$ 块,每一块当做一个锚框。每个锚框预测$B$个边框,以及这个锚框主要包含哪个物体。
![Yolo](../img/yolo.svg)
## YOLO v2:更好,更块,更强
YOLO v2对YOLO进行一些地方的改进,其主要包括:
1. 使用更好的卷积神经网络来做特征提取,使用更大输入图片$448\times 448$使得特征输出大小增大到$13\times 13$
1. 不再使用均匀切来的锚框,而是对训练数据里的真实锚框做聚类,然后使用聚类中心作为锚框。相对于SSD和Faster R-CNN来说可以大幅降低锚框的个数。
1. 不再使用YOLO的全连接层来预测,而是同SSD一样使用卷积。例如假设使用5个锚框(聚类为5类),那么物体分类使用通道数是`5*(1+num_classes)`的$1\times 1$卷积,边框回归使用通道数`4*5`.
## 总结
我们描述了基于卷积神经网络的几个物体检测算法。他们之间的共同点在于首先提出锚框,使用卷积神经网络抽取特征后来预测其包含的主要物体和更准确的边框。但他们在锚框的选择和预测上各有不同,导致他们在计算实际和精度上也各有权衡。
**吐槽和讨论欢迎点**[这里](https://discuss.gluon.ai/t/topic/2510)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册