few shot 目标检测 目标框 目标检测 fcos_人工智能

如网络结构图所示,FCOS由主干网(Backbone) + 特征金字塔(Feature Pyramid)+ 预测三分支(Classification + Center-ness + Regression)三部分组成。

few shot 目标检测 目标框 目标检测 fcos_深度学习_02

(FCOS网络结构图)

01

全卷积单步检测器

网络前向同语义分割网络FCN类似,以像素点为训练样本,每个像素被标上类别或者背景标签,用以分类分支的训练。

few shot 目标检测 目标框 目标检测 fcos_卷积_03

由于没有了Anchor,回归分支便不能使用偏移量作为回归的目标,作者以目标框中每个像素点到目标框四条边的距离作为目标值进行边框回归分支的训练。

因此,网络的输出包含80维(COCO类别数)分类张量px,y 和4维的回归张量tx,y 推理时, px,y > 0.05判别为正样本,将tx,y 逆处理得到目标边框。从以上结构图可以看出,作者在两个分支上分别使用4层CNN进行两个任务的学习。参照RetinaNet,作者运用多个二分类代替了多分类。

损失函数

few shot 目标检测 目标框 目标检测 fcos_深度学习_04

分类损失Lcls采用  Focal Loss,回归损失Lreg  采用 IOU Loss,Npos 表示正样本数量,论文中,回归权重λ值为1。

回归目标

few shot 目标检测 目标框 目标检测 fcos_few shot 目标检测 目标框_05

02

FPN多尺度预测

作者使用了基于FPN的多尺度策略,主要是为了解决由于大步长下采样导致的低召回率的问题。在Anchor-Based方法中,可以通过调整IOU的阈值做到召回率的平衡。

如结构图所示,FCOS算法使用了{P3, P4, P5, P6, P7}这五个尺度的特征映射进行了分类与回归。其中,P3、P4、 P5由backbone不同层特征图 C3、C4、C5经1 * 1卷积和反向链接而得,而P6、P7则是接着P5进行了步长为2的卷积操作得到的(相当于池化),最终P3, P4, P5, P6, P7的步长分别为:8, 16, 32, 64 和 128。

为了更好地利用多尺度特征,每一个尺度的特征层需要回归的边界框范围的都进行了限定,让每个尺度特征各司其职,不同特征层预测不同大小范围的目标。具体地:

a:计算所有层当前层级中的回归目标:l, t, r 、b

b:判断是否满足条件:max(l, t, r, b) > mi 或者 max(l, t, r, b) < mi -1

c:若满足,设为负样本,不对此边界框进行回归预测。

其中,mi是作为第i尺度特征层的最大回归距离,

{m2, m3, m4, m5, m6, m7} 分别对应: {0, 64, 128, 256, 512 , ∞}

通过多尺度预测策略还能够很好地解决不同大小目标重叠的情况,若一个像素点即使通过多尺度预测策略还是被分配到了多个目标框中(同一尺度上),选用区域面积最小的目标进行回归训练。

few shot 目标检测 目标框 目标检测 fcos_few shot 目标检测 目标框_06

利用多尺度策略,不同的特征层需要回归不同的尺寸范围(例如:P3的尺寸范围为[0, 64],P4的尺寸范围为[64,128],因此,不同特征层使用相同的输出激活是不合理的,所以,作者将标准的exp(x)替换为了带有可训练标量si的exp(si,x),通过si来调整第i层指数函数的基数。

03

Center-ness

在分类的分支上引入了center-ness的概念,主要是用来衡量中心点位置的好坏,限制产生一些低质量(偏离目标)的检测框,提升定位的效果。

center-ness的值位于0~1之间,像素点越远离目标中心center-ness值越小,通过交叉熵损失进行训练。测试时,将center-ness得分与对应分类得分相乘,作为最后得分,这样每个位置便有了边框权重的得分,远离目标中心的边框就被削弱了,通过NMS就有效地过滤了低质量的定位边框。

few shot 目标检测 目标框 目标检测 fcos_人工智能_07

few shot 目标检测 目标框 目标检测 fcos_深度学习_08

04

实验

训练数据采用COCO数据集,主干网:ResNet-50(ImageNet预训练),超参数同RetinaNet一致:使用SGD迭代90K次,初始学习率:0.01,batch size为16,迭代60K和80K时,学习率除以10, 权重衰减(Weight decay):0.0001,动量(momentum):0.9,输入图像被缩放到最小边为800,最大边小于等于1333。

同其他模型对比,Anchor-Free思想对小目标仍是有效的。

few shot 目标检测 目标框 目标检测 fcos_卷积_09

(算法实验结果对比)

通过实验结果可以看出,FCOS在各类场景,包括拥挤、遮挡、重叠,大目标和小目标等都有很好的检测效果。

few shot 目标检测 目标框 目标检测 fcos_卷积_10

(可视化实验结果)

few shot 目标检测 目标框 目标检测 fcos_计算机视觉_11

拿code搞事情

few shot 目标检测 目标框 目标检测 fcos_人工智能_12

论文开源了pytorch代码,基于maskrcnn-benchmark进行改进,因此它的安装与原始的Mask R-CNN一致,源码仓库INSTALL.md有详细安装介绍。

配置环境:win10 + Anaconda3 + pytorch1.2.0 pytorch1.1.0+ CUDA10.0

安装依赖库:

pip install ninja yacs cython matplotlib tqdm opencv-python

安装C++编译环境: cl.exe

安装cocoapi

cd $INSTALL_DIR
git clone https://github.com/cocodataset/cocoapi.git
 cd cocoapi/PythonAPI
python setup.py build_ext install # 需要编译
# 失败的话,通过以下方式安装
pip install git+https://github.com/philferriere/cocoapi.git#subdirectory=PythonAPI

进入FCOS目录,编译fcos和fcos_core

python setup.py build develop --no-deps

出现以下错误

few shot 目标检测 目标框 目标检测 fcos_深度学习_13

据说是不支持pytorch1.2.0

few shot 目标检测 目标框 目标检测 fcos_卷积_14

重新配置虚拟环境安装:

# 创建FCOS环境
conda create --name FCOS python=3.6
conda activate FCOS
# 安装pytorch 1.1.0 & torchvision
pip install https://download.pytorch.org/whl/cu100/torch-1.1.0-cp36-cp36m-win_amd64.whl
pip install torchvision==0.2.1
# 重新上述步骤

下载模型,执行demo

# assume that you are under the root directory of this project,
# and you have activated your virtual environment if needed.
wget https://cloudstor.aarnet.edu.au/plus/s/ZSAqNJB96hA71Yf/download -O FCOS_imprv_R_50_FPN_1x.pth
python demo/fcos_demo.py

Bingo,demo检测结果如下:

few shot 目标检测 目标框 目标检测 fcos_计算机视觉_15

few shot 目标检测 目标框 目标检测 fcos_卷积_16

few shot 目标检测 目标框 目标检测 fcos_计算机视觉_17

few shot 目标检测 目标框 目标检测 fcos_few shot 目标检测 目标框_18

few shot 目标检测 目标框 目标检测 fcos_计算机视觉_19