3 计算机视觉-阅读笔记(2)

作者: 深度学习模型优化 | 来源:发表于2019-04-24 05:45 被阅读6次

3.2.2 Fast R-CNN

Fast R-CNN是在R-CNN的基础上发展而来的,总结R-CNN的缺点:

  • 训练过于复杂。训练需要很多步骤,从卷积网络到SVM再到Bounding box回归,整个Pipeline过于复杂。
  • SVM分类器的缺点。训练需要大量时间和空间 我们需要为每个类别都训练一个二分类的SVM,而且由于SVM的特征来自于卷积网络的全连接层,这两个模型不好集成,因此需要把卷积网络的特征写到磁盘上,这要占用大量磁盘空间和IO时间。
  • R-CNN的预测时间长。预测的速度慢,对于每个候选区域,我们都要用卷积网络提取特征(基本相对于一次forward计算),即使有一个GPU,预测一个图片平均都需要47s的时间。

针对以上问题,进行了一定程度的优化,于是有了Fast R-CNN。Fast R-CNN主要是改进了R-CNN的一个缺点(其需要对每个ROI做CNN,这样做了大量重复性的工作,导致R-CNN速度很慢)。

图1 Fast R-CNN架构

Fast R-CNN的改进方法是:

  • S1:根据输入图片和CNN计算得到一些特征图;
  • S2:然后对于每个ROI,从这些特征图中得到对应的区域;
  • S3:使用这些区域pooling计算得到固定大小的特征;
  • S4:把这些特征输入全连接层;
  • S5:全连接层分出两个分支,一个用于softmax进行分类,另一个分支直接输出4个数值,表示Bounding Box的位置。
  1. ROI Pooling

主要解决的问题是,在不同大小的ROI尺寸上,得到相同大小的特征图(7, 7),这样就可以检查不同大小的目标对象。进行目标分类和bounding box回归。

  1. 预训练
  • 使用图片分类的数据来进行预训练;
  • 完成预训练后再fine-tuning;
  • 把最后一层pooling层换成RoI层,把1000类的softmax换成N+1的类别和背景分类器。
  • 另外预测4个Bounding Box的输出。

这里的分类和回归是两个目标函数,分别对应RoI区域的类别和Bounding Box框4个参数值。

  1. 多任务损失
    Fast R-CNN的损失函数为:
    L(p, u, t^u, v) = L_{cls}(p, u) + \lambda|u \geq 1| L_{loc}(t^u, v)
    其中
  • u表示候选区域的真实类别
  • t^u表示真实bounding box的4个参数值
  • p = (p_0, p_1, \cdots, p_K)表示模型预测的分类概率
  • v表示模型预测的bounding box的4个参数值
  • \lambda|u \geq 1|表示如果真实分类是背景,那么它的值就是零,也就不要考虑Bounding box预测的损失了
  • 这里的L_{cls}L_{loc}分别表示分类和回归损失,具体形式为
    L_{loc}(t^u, v) = \sum_{i \in (x, y, w,h)} smooth_{L_1}(t_i^u - v_i)

smooth_{L_1} = \begin{cases} 0.5 x^2 & if \ |x| < 1 \\ |x| - 0.5 & otherwise \end{cases}

分类损失交叉熵喽!这是最常见的了。

  1. 改进效果
    下图是效果比对,和R-CNN比对。
图2 Fast R-CNN和R-CNN效果比对

3.2.3 Faster R-CNN

Fast R-CNN主要优化了识别和回归效果。Faster R-CNN在此基础上改进了Selective Search。

  1. Faster R-CNN的架构

用RPN来替换selective search预选框。

  • 首先用一些卷积池化层得到一些feature map
  • 然后使用一个单独的RPN(Region Proposal Network)来生成候选区域和Bounding Box回归
  • 最后通过RoI Pooling得到的特征训练卷积网络来判断物体的类别(包括不是目标的背景类别)
图3 Faster R-CNN的架构 图4 Faster R-CNN的架构
  1. RPN

RPN模块的输入输出:

  • 输入:是一张图片
  • 输出:是一些矩形区域,每个区域都有一个类别得分。
    RPN会把输出中一些得分比较高的区域交给Fast R-CNN来判断是属于哪一类。

RPN的算法流程:

  • S1:使用3\times 3 \times 128来得到一些列特征图
  • S2:使用全连接层将这些特征图降维到d(256)
  • S3:这个d(256)维的向量被输入到两个网络中:一个网络用来做区域的proposal;另一个区域用来判断这个候选区域是否是我们关注的目标物体。

anchor:

  • 提出anchor的目的是为了解决一个CNN卷积输出的特征图中(228 \times 228)有多个物体存在的情况下如何处理的问题?
  • 这里提出了9个候选框(都是经验得到的),有两个参数scale和area ratio。这9个候选框由三个scale(64、128, 256)和area ratio(1:1, 1:2, 2:1)来组合而得到。这些滑动窗口的中心和原始候选框的中心是重合的。
图5 滑动窗口和anchor 图6 某个滑动窗口和anchor 图7 ZF Net不同anchor平均的候选区域大小

可以看到最后学习出来的区域与原来的区域不同,所以这里给出的anchor只是给出了一个目标轮廓的大概,在做bbox回归的时候,会对anchor的尺寸进行纠正。

  1. 损失函数

训练RPN的数据获取,通过IoU来得到。IoU的正样本的阈值为0.7,IoU的负样本的阈值为0.3。当然这个阈值也是可以根据经验和任务属性进行修改的。

RPN损失函数:
\cal L (\{p_i\}, \{t_i\}) = \frac{1}{N_{cls}} \sum_i \cal L_{cls}(p_i, p_i^*) + \frac{\lambda}{N_{box}} \sum_i p_i^* \cdot L_1^{smooth}(t_i - t_i^*)
上式中p_i是这个anchor被预测的分类,p_i^*是真实的分类,\cal L_{cls}是交叉熵,如下:
\cal L_{cls}(p_i, p_i^*) = -p_i^* \log p_i - (1 - p_i^*) \log (1 - p_i)

L_1^{smooth}是bbox位置的预测值和真实值的距离。t_i集合为{t_x, t_y, t_w, t_h},t_i^*集合为{t_x^*, t_y^*, t_w^*, t_h^*}。{t_x, t_y, t_w, t_h}和{t_x^*, t_y^*, t_w^*, t_h^*}分别表示bbox的(x, y, w, h)和真实bbox的(x, y, w, h)
t_x = (x - x_a)/w_a, t_y = (y-y_a)/w_a
t_w = \log(w/w_a), t_h = \log(h/h_a)
t_x^* = (x^* - x_a)/w_a, t_y^* = (y^* - y_a)/w_a
t_w^* = \log(w^* / w_a), t_h^* = \log(h^* / h_a)
上式中x_a, y_a, w_a, h_a分别是anchor的中心点x,y坐标和宽度高度。

相关文章

网友评论

    本文标题:3 计算机视觉-阅读笔记(2)

    本文链接:https://www.haomeiwen.com/subject/fzpmgqtx.html