计算机视觉基础知识归纳(三)-目标检测
在目标检测中我们把大致分为三个模块:backbone,neck,head
backbone
在我们的目标检测网络中,backbone是初步的特征提取,随后将这些提取到的特征图送入head里面
常见的backbone有vgg ,Alexnet,googlenet,resnet,等等
不同的网络有着不同的特征与特点 常用的就是vgg与resnet
backbone的作用
- 不同的特征图在原图上的表达能力是不一样的(其实就是对应的感受野)
- 不同的backbone学到的语义信息直接决定了分类的准确性
- 下采样率决定了感受野的密度,同时野决定了, 要适应多大的目标(多尺度问题:只有感受野中学在目标上才能取得比较好的效果)
- backbone可以为检测提供若干种感受野大小与中心步长组合来满足对不同尺度和类别的目标检测
neck
neck接受来自backbone的若干个特征图,好的neck可以有效的提升精度
- 无neck
- FPN以及FPN的各类变种(绝大多数的工作都是基于FPN进行展开的)
- neck的第一件事情就是特征融合(不同感受野大小的特征图进行了融合)增强了特征图的表达能力
- 将网络多尺度学习的负担分散到了各个特征上
head
有无anchor,有无quality分支
head部分一般是对目标进行分类与回归的预测部分,两个分支不共享权重
有些head会有质量评价分支,这个分支与分类分支共享权重
一套head来输出所有的特征图结果
目标检测中FPN与FCN
FPN就是一个由最深特征图进行上采样随后进行卷积并于平行的特征图进行横向连接
FCN就是SSD一样直接进行多尺度预测
- 精度上 FPN>FCN
- 速度,内存消耗 FCN>FPN
算力没有限制,延迟也没有限制,直接采用FPN
需要更快的算法,可以忽视部分精度的损失,直接采用FCN
目标尺度与图像分辨率的关系
任何检测器的范围都是有限的
检测器只关心检测范围内的物体,无论他们出现出现在多少分辨率图像中
head参数为何可以共享及其核心逻辑
- 不同层级上可学习样本数量不平衡问题(避免了某个head因为样本不充分而导致学习的参数不对的情况)
- 多尺度语义不变性使共享head可行
- 减少参数提升精度
为什么共享head无法使用BN层
正则化方法
BN LN IN GN
batch_size 比较小,均值方差统计不准确,不适合从0开始更新参数
在训练阶段前传时
共享bn在训练和推断时的行为时不一致的
GN没有上述问题可以在共享head时使用