pytorch实现:https://github.com/kuangliu/pytorch-retinanet
Detectron:https://github.com/facebookresearch/Detectron
一、要解决的问题
- 提高检测器的速度。
- 提高检测器密集目标检测能力。
二、摘要部分知识提取
- 二阶和一阶检测器的差异
R-CNN系列,分类器应用在一系列稀疏的候选检测框位置,一阶是对可能的目标位置进行规则的,密集采样
。一阶精度较低。 - 作者发现,在训练密集检测器时,前景类别严重的不均衡是造成一阶精度较低的中心原因。
- 作者更改了传统的交叉熵损失,让分类很好的样本损失降低。称为Focal Loss。该损失让检测器在训练阶段聚焦于稀疏分布的少量困难样本,防止大量的简单的负样本将检测器带偏了。
- 作者训练了RetinaNet,又快又好。
三、介绍
- RetinaNet是一阶检测器,第一次在COCO数据集上挑战二阶检测器,比如FPN,Mask-RCNN。为了实现这一结果,我们将训练期间的类不平衡认为为阻碍一阶探测器实现最先进精度的主要障碍,并提出消除这种障碍的新的损失函数Focal Loss。
- RCNN-Like检测器通过两阶段级联和启发式的采样解决类别不均衡的问题。提案阶段(例如,选择性搜索[35],EdgeBoxes [39],DeepMask [24,25],RPN [28])迅速缩小了候选对象位置的数量为少数(例如,1-2k),过滤掉大多数背景样本,SSD的检测框数量为8K+。在第二阶段-分类阶段中,采用启发式采样算法,固定正负样本比(比如为1:3),或采取OHEM策略,以期获得一个合适的前景和背景比例。
- 一阶算法候选框太多,在特征图上均匀的采样,还要照顾不同尺寸和不同比例。
- bootstrapping,OHEM可以解决类别不均衡问题,本文提出Focal Loss来解决。这个策略更高效。实验表明这个策略比OHEM,启发式采样效果更好。
- RetinaNet具有金字塔结果,使用anchor box。
四、类别不均衡
大量的候选框,仅很少的一部分框有物体。(前景和背景类不均衡)
导致的问题:
1)训练是不高效的,因为很多框是是简单的负样本,对于任务学习来讲没有帮助。
2)大量简单的负样本可以主导训练,导致模型性能下降。
目前解决方法:hard negative mining,ampling,reweighing schemes
五、Focal Loss
传统的CE曲线(蓝色) VS Focal Loss
曲线针对的是正样本的损失,pt为预测为正类的概率
CE缺点:在预测概率很大的时候(简单样本),loss的值也比较大。(大量的简单样本损失的累加就会对整个检测任务的损失造成巨大的影响)
Focal Loss
y(gamma)作为调节系数,论文中说y=2时,效果最好。在 [0:5; 5]区间比较稳定,
下面这个效果会更好一些
附录中讨论了这些参数的选取,结果是大家都差不多
每张图片的loss根据匹配的anchors数目做了归一化(在focal loss下,简单负样本的损失可以忽略不计)
The total focal loss of an image is computed as the sum of the focal loss over all ∼100k anchors ???
focal loss对图片的所有anchors都计算loss,
局限:
- 仅解决的是分类任务上的Loss
- 将正类和负类同等对待,正类的简单,困难,与负类的简单与困难重要性一致。
五、RetinaNet
总:
RetinaNet有anchors(RPN),features pyramids(SSD,FPN)。(结构上没创新,重点在Focal Loss)。结构如下:
共5层特征图。
P3-P5是从ResNet中的残差单元C3到C5得到的,P6是在C5之后,接一个3x3,步长为2的卷积得到,P7是在P6之后接一个Relu,然后接一个3x3,步长为2的卷积得到。
P6不是下采样,是通过有步长的卷积实现。
P7是为了提升大目标的检测能力。
只有P3-P5用了FPN结构,P6和P7是从C5依次接一个3x3,stride=2的conv得到的,没有把P6和P7加入FPN,所以图片的边长是32的倍数即可
分类子网络
- 全卷积网络结构
- 所有金字塔尺度下的参数是相同的
- 输入是C通道的特征图,然后接4个3x3卷积层,每个卷积层C个滤波器,每个卷积后接ReLU激活,然后接着是一个有KA个滤波器的3x3卷积层。最后,接一个sigmoid激活函数,每个位置输出KA个二分类的预测。
- 与FPN比较,分类子网络更深,只使用3x3的卷积,且不与框回归子网络共享参数。
检测子网络
- 结构同分类子网络,只是输出为4A个线性输出,这些输出预测anchor和groundtruth box的相对位置。
- 与SSD,YOLO不同是,这里对检测框位置的预测是不考虑类别的。class-agnostic bounding box regressor 。(作者做了实验,表面两者效果是相同的)
- smooth L1 loss
区别
1. 检测和分类子网络更深,不仅仅是一层,且全为3x3的卷积
2. 这里检测子网络和分类子网络只是共享相同的结构,但是是独立的参数
下图是SSD中的检测模块,分类和检测共享相同的参数。
模型训练
- 在早期训练阶段,模型在每一类的输出概率都相同。可能刚开始某些类别样本经常出现,导致loss崩掉。
基网络
ResNet,pyramid level从P3到P7(5个等级),每一层有256个通道。?
Anchors
固定尺寸:3232,6464,128128,256256,512*512
比例(所有层共享):1:2; 1:1, 2:1
每层anchor尺寸(所有层共享):2^0 ; 2^(1/3) ; 2^(2/3)
每层9个anchors
anchor匹配策略(assignment rule)
Each anchor is assigned a length K one-hot vector of classification targets。每一个anchor匹配一个长度为K的one-hot向量。
- 不同于RPN,这里anchor匹配到具体某一类。
- anchor 与 groud truth的IOU大于0.5,则与某类物体匹配。一个anchor只能匹配一个物体。As each anchor is assigned to at most one object box, we set the corresponding entry in its length K label vector to 1 and all other entries to 0.
- IOU介于[0,0.4)之间则被认为是背景类。
- IOU在[0.4,0.5)
前向推理
- RetinaNet整个结构就是一个FCN,包含一个backbone,分类子网络和检测回归子网络。
- 设置confidence阈值为0.05,然后只对top 1k的检测框进行编码(将检测输出的偏移量恢复到正常的格式,whxy等)。
3.不同level的检测框被合并,然后设定NMS阈值为0.5