导读:特征学习表示是计算机视觉中的基本问题,许多目标检测方法中的检测器使用的是多尺度特征学习的金字塔特征网络(a feature pyramid network, FPN)。为发现更好的FPN,论文提出了使用神经架构搜索(Neural Architecture Search, NAS)来进一步优化用于目标检测的特征金字塔网络的设计过程。
论文的贡献:论文中提出的神经架构搜索(Neural Architecture Search, NAS),用于发现更优更好的特征金字塔网络结构。NAS-FPN应用在RetinaNet框架中的多种backbone models(骨干模型),都有很好的准确性。在移动检测 (320x320) 比赛中,轻量版NAS-FPN+MobileNet2的移动检测精度比最好的SSDLite更好,而且所用的时间还更短。
具体细节:
1.所用的方法
为了寻找到更优的FPN,论文中提出了利用神经架构搜索(NAS),NAS在给定的搜索空间中选择最佳的模型结构训练控制器。这个过程使用的了强化学习技术,控制器用子模型在搜索空间中的精度作为奖励信号来更新参数。因此通过反复试验,控制器不断的学习,最终会生成更好的结构。
在研究1,2,3中所指出的,搜索空间对架构搜索的成功起着非常重要的作用,作者们设计了一个搜索空间来生成特征金字塔表示。
2.搜索空间
在设计的搜索空间中,特征金字塔网络由多个”合并单元(merging cells)”组成,那如何合并呢?步骤如下:
第一步:从输入中选一个特征层;
第二步:从输入中再选一个特征层;
第三步:选择输出的特征分辨率;
第四步:选择一种二进制运算,将第一步和第二步中选择的特征层(用第三步中选择的分辨率)合并起来。
第四步中所提到的二进制操作,作者们主要设计了两种sum和global pooling, 这两种操作简单高效且不添加任何额外的可训练参数。如下图:
3.网络结构
大约跑了8000步后,NAS-FPN中发现的金字塔网络架构,有5个输入层(黄色)和5个特征输出层(蓝色)
FPN以及NAS-FPN的结构形图:
每个点代表一个feature layer,同一行中的每个feature layer具有相同的分辨率,分辨率自下而上不断降低
箭头代表的是内部之间的连接;
输入层在左侧,用绿色圆圈表示输入,红色圆圈表示输出。
传统FPN结构:
图(b-f)为NAS通过RNN控制器在训练过程中发现的NAS-FPN架构,从图中可以看出,随着任务奖励(AP)的不断改善,体系架构逐渐趋于一致。(论文中使用的是图f中的NAS-FPN)
方法效果
基于NAS-FPN的RetinaNet网络模型与其他流行的模型在数据集COCO上的对比:
从上面的对比数据可以看出,大神提出的方法得到了48.3AP远好于YOLOv3,而且也优于MaskR-CNN。
算法训练教程
环境要求:
1、python3.5 (anaconda recommend)
2、cuda9.0 (If you want to use cuda8, please set CUDA9 = False in the cfgs.py file.)
3、opencv(cv2)
4、tfplot (optional)
5、tensorflow == 1.12
1)只想用已有的模型:
预训练参数
1.请下载预训练模型 resnet50_v1, resnet101_v1,并将其放入到以下目录中:data/pretrained_weights.
2.或者选择更好的网络模型 backbone: gluon2TF
resnet50_v1下载地址:
http://download.tensorflow.org/models/resnet_v1_50_2016_08_28.tar.gz
resnet101_v1下载地址:
http://download.tensorflow.org/models/resnet_v1_101_2016_08_28.tar.gz
gluon2TF地址:
https://github.com/yangJirui/gluon2TF
训练权重
在文件夹($path_root/libs/configs/)中选择一个配置文件,并将其内容复制到cfgs.py中,然后下载相应的权重weights。
准备编译环境:
cd $PATH_ROOT/libs/box_utils/cython_utils
python setup.py build_ext --inplace
2)训练:
(1) Modify parameters (such as CLASS_NUM, DATASET_NAME, VERSION, etc.) in $PATH_ROOT/libs/configs/cfgs.py
(2) Add category information in $PATH_ROOT/libs/label_name_dict/lable_dict.py
(3) Add data_name to $PATH_ROOT/data/io/read_tfrecord.py
2.make tfrecord
cd $PATH_ROOT/data/io/
python convert_data_to_tfrecord_coco.py --VOC_dir='/PATH/TO/JSON/FILE/'
--save_name='train'
--dataset='coco'
3、multi-gpu train
cd $PATH_ROOT/tools
python multi_gpu_train.py
验证:
cd $PATH_ROOT/tools
python eval_coco.py --eval_data='/PATH/TO/IMAGES/'
--eval_gt='/PATH/TO/TEST/ANNOTATION/'
--GPU='0'
Tensorboard展示
cd $PATH_ROOT/output/summary
tensorboard --logdir=.
论文地址:https://arxiv.org/abs/1904.07392
代码地址:https://github.com/DetectionTeamUCAS/NAS_FPN_Tensorflow
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。