论文:RepPoints: Point Set Representation for Object Detection (ICCV 2019)速达>>
代码:https://github.com/microsoft/RepPoints
Anchor based
使用Anchor的前提是假设Anchor基本覆盖了目标框可能的位置及宽高比例
为什么Anchor based会流行?
- 容易标注,简单实用
- 用矩形的特征区域进行训练
- 许多目标检测的通用指标都是基于框
- 用Anchor的效果足够好
- 从滑窗法开始就是用矩形patch训练网络
Anchor based缺点:
- 当初始框与目标间的距离较大时,效果不佳
- 需要平衡 ∆ x ∆x ∆x, ∆ y ∆y ∆y和 ∆ w ∆w ∆w, ∆ h ∆h ∆h损失权重以达到最佳性能
- 目标几何信息粗糙,没有区别对待目标的不同形状和姿态,可能影响特征提取效果
- proposal含较多背景信息,提取的特征质量可能受影响
center point based
与Anchor based方法相比, center point based 的优点在于:
- 其假设空间更小 x,y 两个维度即可表示位置,而前者还要加上长宽共四个维度
center point based 会遇到同一中心位置有多个目标的问题,使用FPN明显减少了其中心位置在特征图上同位置的机会,COCO数据集中只有1.1%的对象存在该问题,因为:
- FPN将不同尺度的物体分配到不同的图像特征层中,这些特征层覆盖了不同尺度的物体和相同中心点的位置
- FPN为小物体提供了高分辨率的特征图,这也减少了两个物体的中心位于同一特征位置的几率
Reppoints
每个中心点通过deformable convolution 学习 N (9)个偏移量来表示预测目标,需将Reppoints转换成伪框后才能计算损失,从而指导训练,转换成伪框文中给出了三种:
- Min-max function
- Partial min-max function
- Moment-based function
根据伪框和标注框左上顶点、右下点间的距离计算 Smooth L1损失无需调整损失权重
识别反馈可以指导定位训练
RepPoint的学习由支路驱动:
- 定位支路:根据伪框和标注框左上顶点、右下点间的距离计算 Smooth L1损失,定位支路还有个Refine阶段
- 分类支路:对目标分类在第一组RepPoint上进行,还可以反过来地指导定位训练,分类损失为 focal loss
RepPointsHead 结构(RepPointsHead代码实现)
网络整体架构
model = dict(
type='RepPointsDetector',
pretrained='torchvision://resnet50',
backbone=dict(
type='ResNet',
depth=50,
num_stages=4,
out_indices=(0, 1, 2, 3),
frozen_stages=1,
norm_cfg=dict(type='BN', requires_grad=True),
norm_eval=True,
style='pytorch'),
neck=dict(
type='FPN',
in_channels=[256, 512, 1024, 2048],
out_channels=256,
start_level=1,
add_extra_convs='on_input',
num_outs=5),
bbox_head=dict(
type='RepPointsHead',
num_classes=80,
in_channels=256,
feat_channels=256,
point_feat_channels=256,
stacked_convs=3,
num_points=9,
gradient_mul=0.1,
point_strides=[8, 16, 32, 64, 128],
point_base_scale=4,
loss_cls=dict(
type='FocalLoss',
use_sigmoid=True,
gamma=2.0,
alpha=0.25,
loss_weight=1.0),
loss_bbox_init=dict(type='SmoothL1Loss', beta=0.11, loss_weight=0.5),
loss_bbox_refine=dict(type='SmoothL1Loss', beta=0.11, loss_weight=1.0),
transform_method='moment')) # transform_method 为points转换成框的方法
# training and testing settings
train_cfg = dict(
init=dict(
assigner=dict(type='PointAssigner', scale=4, pos_num=1),
allowed_border=-1,
pos_weight=-1,
debug=False),
refine=dict(
assigner=dict(
type='MaxIoUAssigner',
pos_iou_thr=0.5,
neg_iou_thr=0.4,
min_pos_iou=0,
ignore_iof_thr=-1),
allowed_border=-1,
pos_weight=-1,
debug=False))
test_cfg = dict(
nms_pre=1000,
min_bbox_size=0,
score_thr=0.05,
nms=dict(type='nms', iou_threshold=0.5),
max_per_img=100)
optimizer = dict(lr=0.01)
相关实验
参考文献
【1】目标检测论文阅读:RepPoints(Anchor Free)
【2】如何评价北大、清华、微软联合提出的RepPoints呢?
【3】ICCV 2019丨 RepPoints: 替代边界框,基于点集的物体表示新方法