R-CNN网络系列(3)

Fast R-CNN论文简单解读(2)

书接上回

微调

先diss一波SPPnet

R-CNN和SPPnet网络的训练模型时,每个训练样本(即RoI)来自不同的图像,这就是效率低下的根本原因。每个 RoI 可能有一个非常大的、跨越整个输入图像的感受野。由于前向传递必须处理整个感受野,因此训练输入很大(通常是整个图像)

Fast R-CNN提出了一种更有效的训练方法,该方法在训练期间利用特征的共享。 在 Fast RCNN 训练中,随机梯度下降 (SGD) 小批量是分层采样的,首先通过采样 N 个图像,然后通过从每个图像中采样 R/N个RoI, 来自同一图像的 RoI 在前向和后向传递中共享计算和内存。 使 N 变小会减少小批量计算。 例如,当使用 N = 2 和 R = 128 时,所提出的训练方案比从 128 个不同图像中采样一个 RoI 大约快 64 倍(即 R-CNN 和 SPPnet 策略)

因为来自同一图像的 RoI 是相关的,这种策略可能会导致训练收敛缓慢。 但是经过实验发现,这种担忧是不必要的,我们在 N = 2 和 R = 128 时使用比 R-CNN 更少的 SGD 迭代获得了良好的结果。

除了分层采样之外,Fast R-CNN 还使用了一个简化的训练过程,其中一个微调阶段联合优化了 softmax 分类器和边界框回归器,而不是在三个单独的阶段中训练 softmax 分类器、SVM 和回归器 。

多任务损失

Fast R-CNN有两个头,一个用来分类,一个用来回归。

分类头就是一般的图片分类,作用就是给每个RoI打个分,输出是N+1(类别数+背景)

回归器作用是微调边界框,输出形式是t=(x, y, w, h),具体编码的时候,使用了t的参数化表示,每个类别一个框,也就是N个框(实现的时候为了简单,都直接N+1,看自己习惯了)

detectron2框架就是N个框,N+1个分数,最后一个是背景类的分数,链接https://github.com/facebookresearch/detectron2/blob/main/detectron2/modeling/roi_heads/fast_rcnn.py

每个训练 RoI 都会指派一个真实类别 u 和一个真实边界框回归目标 v,损失定义如下:
多任务损失
第一项就是简单的分类损失,使用的log loss
第二项的方括号记号是艾佛森括号,如果真实类别是背景,也就是类别0,则值为0。换言之,如果是背景类,边界框的预测值是没有意义的,我们只计算分类损失。超参数λ是用来平衡这两个损失的,默认为1。

“艾佛森括号”,是一种方括号记号,如果方括号内的条件满足则为1,不满足则为0。

第二项的具体公式如下:
回归损失

smooth L1 损失对异常值不敏感,比R-CNN的L2损失好

通过实验发现,这种联合损失对Fast R-CNN是最好的。

Mini-batch采样策略

在微调过程中,先随机选择N=2个图像,然后从每个图像中采样64个ROI(R=128, 128÷2=64)

正样本:和真实边界框的IoU大于0.5的,取四分之一(这些框基本上一定有我们需要检测的类别)
负样本:从那些和任意真实的边界框的IoU在 [0.1, 0.5) 的区间内的里,再矮个子里面挑将军

为什么这么挑?
因为踩在巨人的肩膀上,参考别人的论文得到的

训练期间唯一的数据增强就是,以 0.5 的概率水平翻转图片。

下面是采样策略部分论文原文:
采样策略

其他的一些超参数

超参数

尺度不变性

多尺度方法通过图像金字塔为网络提供近似的尺度不变性。 在测试时,图像金字塔用于对每个候选区域进行近似尺度归一化。 在多尺度训练期间,每次采样图像时随机采样一个金字塔尺度。

推理(测试)

测试期间,R=2000。也就是一张图片会有2k个候选框,我们对每个类别分别进行最大值抑制,从而筛选出来最后的边界框。

实验结果

一句话,挺好的,就是现在可能大家都用Faster R-CNN了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值