用ImageNet预训练的网络做detection,但ImageNet中的目标尺寸分布比较均匀, Median scale的relative size是0.556,占50%左右,但是在检测数据集COCO中,Median scale的relative size只有0.106,甚至90%的目标小于图片的0.472倍,所以说detection数据集中的小物体占大部分, 但仍存在10%的大物体,导致Coco中目标尺度差异较大(小物体多), 所以直接用ImageNet会带来domain-shifting的问题.所以的detection需要应对目标多尺度的问题.
数据库中原图尺寸为640x48, 小物体是小于32x32的物体
实验800all vs 1400all
- 实验设置: 我们选用800x1200和1400x2000两种训练尺度, 分别记作800all和1400all 测试时, 我们都使用1400x2000的尺度.
- 结果比较:
800all | 1400all |
---|---|
19.6 | 19.9 |
* 分析: 正如之前分析的一样, 当训/测尺度一致时, 得到的结果最好. 所以1400all1400all胜出.
* 问题: 但是为什么只超过了一点点呢? 因为在考虑小物体的分类性能而放大图片的同时, 也将中/大尺度的样本放大得太大, 导致无法正确识别.
实验1400all<80pixels
- 实验设置: 用了大图, 却被中/大尺寸的样本破坏了性能, 那么我们就只用小于某阈值的样本进行训练, 即在原图尺寸中>80px>80px的样本直接抛弃, 只保留<80px<80px的样本参与训练.
- 结果比较:
1400<80px1400<80px | 800all800all | 1400all1400all |
---|---|---|
16.4 | 19.6 | 19.9 |
* 分析问题: 跟预想的不一样, 为什么性能下降这么多? 其根本原因是因为这种做法抛去了太多的样本(~30%), 导致训练集丰富性下降, 尤其是抛弃的那个尺度的样本.
多尺度训练(MST)
- 实验设置: 多尺度训练保证了各个尺度的样本, 都有机会被缩放到合理的尺度区间参与训练.
- 结果比较:
1400<80px1400<80px | 800all800all | 1400all1400all | MSTMST |
---|---|---|---|
16.4 | 19.6 | 19.9 | 19.5 |
* 分析问题: 其最终性能跟800all800all 没太大差别, 主要原因和”实验800all800all vs 1400all1400all类似, 因为这一次引入了极大/极小的训练样本.
结论:最好不要引入极大极小样本, 最好对应尺度训练和测试
Scale Normalization for Image Pyramids (SNIP)
思想: 不同分辨率的图片负责检测不同大小的目标; SNIP是MST的升级版. 只有当这个 物体的尺度 与 预训练数据集的尺度 (通常224x224)接近时, 我们才把它用来做检测器的训练样本.- 用所有的GroundTruth给Anchors分配好+/-标签
- 根据第ii个尺度下的valid range: [si,ei][si,ei], 将GroundTruth根据是否落在范围内分为Valid/Invalid GT
- 去除那些IoU(anchors|InvalidGT)>0.3IoU(anchors|InvalidGT)>0.3的Anchors
- 用所有的GroundTruth给ProposalRoIs分配好类别标签
- 弃用不在[si,ei][si,ei]范围内的GT和Proposals
- 全被剔除了的处理:
If there are no ground truth boxes within the valid range at a particular resolution in an image, that image- resolution pair is ignored during training
- 用多尺度正常进行测试
- 在合并多尺度Detection之前, 只在各个尺度留下满足其条件的Detection
- Soft-NMS合并 (对比的其他模型有没有soft-nms?)
Sub-Image采样
考虑到GPU显存, 需要crop图片来满足显存局限.
* 用最少数量的1000x1000的chips来囊括所有的小物体. 如果没有小物体的话, 这个区域就不需要进行任何计算, 加速训练.
* 操作:
只对1400x2000的图片进行采样. 800x1200/480x640/图片无小物体时, 不进行采样
问题根源:
本质上,这是因为CNN网络没有尺度不变形,没有把scale这个隐藏变量学习到的机制,只能通过大量参数来强行记忆不同scale的物体。而下面部分谈到的方法也很可能只是治标不治本,关键还是怎么把scale这个隐藏变量抽离出来,甚至可以直接学习;或者直接赋予网络学习scale的能力。
MST---randomly sampled images at multiple resolutions during training 暴力扩充多尺度的样本.Multi-scale的做法扩充了不同scale样本的数目,但是仍然要求CNN去fit所有scale的物体。通过这样的一个对比实验,SNIP非常solid地证明了就算是数据相对充足的情况下,CNN仍然很难使用所有scale的物体。个人猜测由于CNN中没有对于scale invariant的结构,CNN能检测不同scale的“假象”,更多是通过CNN来通过capacity来强行memorize不同scale的物体来达到的,这其实浪费了大量的capacity.
SNIP----- training is only performed on objects that fall in the desired scale range and the remainder are simply ignored during back-propagation.只学习同样的scale可以保障有限的capacity用于学习语义信息。将尺度这个隐藏变量分离开来了.