Objection Detection 手记
目标检测实现图像中目标的分类任务和bounding box位置框检测任务。
本文分享了整理的目标检测经典算法的关键步骤和实现需要注意的地方。包括
- Faster R-CNN
- FPN
- SSD
- RetinaNet
1. Faster R-CNN
Faster R-CNN是经典的two-stage的目标检测算法。
Faster R-CNN是一个看似是end-to-end的过程, 由3个部分组成
- 特征提取层CNN: 通常是vgg16, resnet也是可以
- RPN:region proposal network, 候选框生成
- RoI Pooling + Classifier, 分类和bbox回归
1.1 特征提取层CNN
- 可以看出对于输入图像PxQ, 需要缩放至固定大小MxN,然后将MxN图像送入网络
- CNN的conv层需要保持feature map大小为MxN,只在pooling层进行下采样,这样保证可以最后一个conv层的feature map的每个点可以完美映射到原图中(M/16,N/16)
1.2 RPN: 候选框生成
RPN网络是feature Map后加一个3x3 filter(vgg)的卷积层,在输出的512的feature Map(原文是256,主要看特征提取feature Map的大小),分别加一个分类层和bbox回归层。
- anchor boxes:3x3 filter(vgg)的卷积层后的每一个点可以映射到原图中的k种不同尺度类型box候选框。 默认是3个尺度:128/156/512, 3个长宽比:1:1/1:2/2:1, 9个anchor boxes, k=9;以vgg(512)为例, 在原图会生成约4600个候选框。不同的任务这个可以进行调整修改
- 分类: 这里采用是1x1的卷积,输出是k个不同尺度类型的二分类结果(前景和背景)
- box位置回归:同样是1x1的卷积,输出是k个不同尺度类型的位置(x,y, w, h)
需要注意的是3x3卷积的输出也要保证输出feature map channels大小和特征提取的feature map channels大小一致,这样才可以映射会原图。
关于训练:
- 对原图进行类别和位置打标,得到k中不同尺度的类别和位置信息。
- 其中前景和背景类别,通过计算与groud truth的bbox的iou,通过阈值来判断前景和背景
- 位置信息记录的是偏移信息
- 因为背景和前景类型不平衡,论文采用随机采用256个样本(前景:背景=1:1)进入RPN训练
1.3 RoI Pooling + Classifier
RPN之后得到候选的框,需要进行refine;
- RoI pooling: RPN之后得到的候选框,进行挑选后(阈值和极大值抑制操作等)roi区域,resize到pooling size后,形成固定程度的特征
- 之后若干dense层后接一个分类层和bbox回归层
1.4 小结
faster rcnn 之所以是两阶段的,是因为先要进程RPN的网络,然后RPN的网络的结果在进入最终的ROI pooling的分类回归层。训练的每一个batch的都要经过两个网络,特别是RPN之后需要对batch进行预测,然后进行调整roi等操作。
https://github.com/moyiliyi/keras-faster-rcnn/blob/master/train_frcnn.py
2. FPN
FPN从高层携带信息传给低层,再分层预测,本文作者的创新之处就在于既使用了特征金字塔,又搞了分层预测。
高层到低层的融合,在feature map的叠加,为了保证feature map大小一致, 高层需要上采样,同时低层进行一次1x1 卷积后相加。
FPN在faster R-CNN的应用,在特征金字塔上的每个特征进行单一尺度候选框选择。 这样也可以实现不同尺度的候选框的选择,同时对小物体的检测有一定的鲁棒性,因为有在低层特征进行候选框选择。
3. SSD
SSD的核心是在不同尺度的特征特征图上采用卷积核来预测一系Default Bounding Boxes的类别、坐标偏移
4. RetinaNet
RetinaNet主要是为了Focal loss设计的one-stage的目标检测结构。总体结构上还是采用FPN的样式,只是再各个尺度上接了分类和bbox回归的子网络,注意两个子网络是独立的,不共享参数。
备注下,focal loss 主要是在交叉熵loss中加了系数控制,使得网络能更加关注困难样本。针对目标检测任务而言,背景样本非常多,前景样本相对少; 交叉熵loss在背景样本的loss往往不会为0,大量非0 loss叠加导致总体loss也会很大,这样总体loss中的前景样本的比重就变得微弱,梯度下降不会太关注前景样本的。focal loss 使得简单样本分对情况下,loss接近于0,总体loss更加关注那些分错的样本。
那么关键是RetinaNet如何进行候选框选择呢?
p3到p7,对应的尺度32到512, 和原来FPN不同的p3到p5对应的是c3到c5, p6和p7分别是c5再两次下采样的得到的。