2018/12/13
论文:https://arxiv.org/abs/1805.09300
代码:https://github.com/MahyarNajibi/SNIPER
参考:https://arleyzhang.github.io/articles/f0c1556d/
https://blog.csdn.net/Gentleman_Qin/article/details/84797882
SNIPER介绍了一种新颖的解决图像多尺度的方法。
这里有一个概念叫chips,类似于滑窗(sliding windows)。尺寸固定(处理coco数据时取512×512),以恒定距离(d pixels)排布,在图像上进行截取对应大小区域。
对图像会进行缩放,假设有n个scale,{s1,s2,…,si,…sn},每个scale的大小为 Wi×Hi ,将原图缩放至对应比例后,K×K 大小的chip(对于COCO数据集,论文用的512×512)以等间隔(d pixels)的方式排布,注意是每个scale都会生成这些chips,而且chip的大小是固定的,变化的是图片的尺寸。这跟anchor的思想刚好相反,因为anchor中,不变的是feature map,变化的是anchor。
实际上这篇论文输进网络用于训练的是这些chip,每个chip都是原图的一部分,包含了若干个目标。
一张图的每个scale,会生成若干个Positive Chips 和 若干个 Negative Chips 。每个Positive Chip都包含若干个ground truth boxes,所有的Positive Chips则覆盖全部有效的ground truth boxes。每个 Negative Chips 则包含若干个 false positive cases。这些在下面详细讲解。
获取正样本(Positive Chip Selection):
每个scale,都会有个area range Ri=[rimin,rimax],i∈[1,n] ,这个范围决定了这个scale上哪些ground truth box是用来训练的。所有ground truth box中落在 Ri 范围内的ground truth box 称为有效的(对某个scale来说),其余为无效的,有效的gt box集合表示为 Gi 。从所有chips中选取包含(完全包含)有效 gt box最多的chip,作为Positive Chip,其集合称为 Cipos ,每一个gt box都会有chip包含它。因为 Ri 的区间会有重叠,所以一个gt box可能会被不同scale的多个chip包含,也有可能被同一个scale的多个chip包含。被割裂的gt box(也就是部分包含)则保持残留的部分。
如下图,左侧是将gt box和不同scale上的 chip都呈现在了原图上,这里为了展示,将不同scale的图片缩放回原图大小,所以chip才有大有小,它们是属于不同scale的。右侧才是训练时真正使用的chips,它们的大小是固定的。可以看出这张图片包含了三个scale,所以存在三种chip,chip中包含有效的gt box(绿色)和无效的gt box(红色)。
从原图也可以看出,原图中有一大部分的背景区域(没被postive chip覆盖的区域)被丢弃了,而且实际上网络真正输入的是chip(比原图分辨率小很多),这对于减少计算量来说很重要。
SNIPER 只用了4张低分辨率的chips 就完成了所有objects的全覆盖和multi-scale的训练方式。
这个地方很巧妙,在不同的scale上截取相同大小的chip,而且包含的是不完全相同的目标。对较小的目标起到一种 zoom in 的作用,而对较大的目标起到一种 zoom out的作用。而对于网络来说,输入的还是固定大小的chip,这样的结构更加接近于分类问题网络的拓扑。
获取负样本(Negative Chip Selection):
如果至包含上述的 postive chip那么由于还是有大部分的区域背景,所以对背景的识别效果不好,导致假正例率比较高。因此需要生成 negative chip,来提高网络对背景的识别效果。现在的目标检测算法因为在multi-scale训练时,所有的像素都参与了计算,所以假正例率的问题相对这个算法没那么严重(但是计算量大),但是这里因为抛弃了很多背景,所以会使假正例率增加。为了降低假正例率和维持计算量不至于上涨太多,一个简单的解决办法就是使用一个精度不是很高的rpn生成一些不太准确的proposals,这些proposals中肯定有一大部分都是假正例。连这个精度不是很高的rpn都没有生成proposals的地方则有很大可能是背景区域,那么训练时把这一部分抛弃即可。
negative chip 的生成是这样的:首先使用训练集训练一个不是很精确的RPN,生成一系列 proposals,对每个scale i,移除那些被 positive chip 所覆盖的proposals,因为这部分proposal与gt box重合在一起了。选取包含至少M个在 Ri 范围内的proposals的所有chips作为 negative chip,其集合称为 Cineg 。
训练时,每张图片在每个epoch中只从 negative chip 池中选择固定数量的 negative chip。这个地方训练时怎么弄的,文章解释不是很清楚,恐怕得看代码才能明白。
如下图是 negative chip 的生成示例:
训练和预测
sniper取得了不错的效果。较小的图像输入和较大的batch使得训练速度明显增快。
总结
(1)许多网络为了增加精度,会使用image pyramid而且会使用较高分辨率的图片,SNIPER 则摆脱了对较高分辨率图像的依赖,训练时使用的是较低分辨率的chip,所以batch也可以调大,节省了内存,使得SNIP的思想可以落地,即所谓标题中的“实战版本”。
(2)生成 positive/negative chip的过程算是一个预处理过程,不算这一部分,即文章中所谓的端到端的训练。回归时标签的赋值与 Faster R-CNN是类似,其他的设置基本跟 Faster R-CNN 差别不大,只是正样本比例啊,OHEM啊,损失函数等有所不同。
(3)文章的 multi-scale 训练方式有创意,但是可能在实现上会有点复杂 ,得编程实现。
网友评论