本文转自:https://zhuanlan.zhihu.com/p/49605144
本文主要将目标检测网络分为了若干个模块,并对每一块进行了概述,这样方便将各种不同网络的相同模块部分做比较,以获得对于不同部分更深刻的理解。本文可以看做一篇提纲,后续将不断丰满每一模块的内容。
目标检测分为两个阶段:
- 训练
- 测试
训练阶段重要的部分是:
- data
- 对于神经网络而言,所需要的不变性一般都会encode到数据中,比如需要神经网络对图像色彩畸变具有不变性,那么就要对图像做色彩畸变增强;需要神经网络对尺度具有不变性,那么就要对图像做尺度增强。
- data是神经网络的练习题,不合理的练习题不利于神经网络学习,因此需要对练习题进行筛选,去掉不合理的数据。
- network
- network分为backbone和head。backbone用来学习图像特征,一般复用图像分类网络;head从图像特征中学习检测目标,例如框的坐标、类别等。
- loss
- 这里的loss是广义的,包括整个梯度回传的过程。
测试阶段重要的部分是:
- postprocess
- 即从head输出的特征图中获取最终输出框的过程。
综上,整个目标检测有四个重要的部分:
- data
- network
- loss
- postprocess
data
- 数据增强
- 图像色彩增强
- 饱和度
- 色相
- 明度
- random crop
- 缩放
- 随机翻转
- random erase
- 等等
- 图像色彩增强
- 数据选择
- 每个检测网络所能检测物体的尺度是范围的,超过这个范围的框,检测网络便无能无力,例如太大、太小。对于检测网络无能为力的框,喂给检测网络学习,不仅不能无助于检测网络的学习,还会适得其反,因此需要将超过检测网络能力范围的框丢弃。
#faceboxes
network
- backbone
- VGG
- darknet
- Resnet
- inception
- xception
- mobilenet
- 等等
- head
- 单尺度head
- SSD head
- FPN head
检测网络可以看作一条网路,信息在其中流动,检测网络的表达能力就像带宽一样,而带宽由网路中带宽最小的地方决定。检测网络也类似,backbone和head的带宽应该匹配,不然大带宽的部分便只能白白浪费资源。
从资源利用率的角度来看,backbone和head带宽匹配会提高资源利用率。例如backbone表达能力很强,但是head表达能力很弱,那么整体检测网络表现会受head的表达能力所限,backbone大于head表达能力的部分便被浪费掉;或者backbone表达能力很弱,但是head表达能力很强,那么整体检测网络表现会被backbone限制住,head大于backbone表达能力的部分便被浪费掉。
从检测网络整体表达能力的角度来看,backbone和head带宽匹配才能最大化整个检测网络的表达能力。比如,为了增强检测网络的表达能力,只是提高backbone的表达能力有时候并不会奏效,这个时候从head下手也许会事半功倍。
#DSSD
loss
- anchor和gt的匹配策略
- faster rcnn系列
- yolo系列
- loss函数的选择
- 例如SmoothL1Loss函数用来计算坐标loss会比较稳定
- 不平衡问题
- loss之间不平衡
- loss加权
- loss内不平衡
- 样本重采样
- 样本加权
- OHEM
- focal loss
- loss之间不平衡
#light head
postprocess
- 取框的策略
- 即从检测网络输出的特征图中decode出检测框。
- 之前优化pytorch版本的yolov2时,发现取框策略对mAP有一些影响。
- 检测框去重
- 经过上一步取框后,图像上一个目标上会有N个框,我们需要去掉重复的框
- nms、soft nms、softer nms、iou-net、fitness nms、relation network