同样的青春,每个人有着不同的经历。
但在被誉为技术界“奥斯卡”之称的百度之星大赛上,有一群年轻人却有着同样的故事,不管是身在象牙塔,还是已位于科研前线,在开发赛道上表现出的技术实力,让他们闪耀四方。
今年百度之星的赛题是打造一款轻量级的目标检测模型。这也是计算机视觉技术中最基本的任务之一,比如在关键点检测、实例分割等方面都会在此基础上进行,应用前景十分广泛。
“此次比赛不仅需要考虑mAP,同时考虑了Madds,兼顾精度与速度的要求。”刚刚结束的2019百度之星开发者大赛中获得第一名的Litchll队长张鹏松这样看待本次的赛题。由于兼顾速度与精度,所以模型会非常适合嵌入式设备和手机,在此类设备中达到实时处理。在生活中也有很大的应用前景,比如可以在手机中部署实现图片识别、检测、甚至美颜等;航拍无人机的图像进行自动跟随、障碍物识别等。
他的团队分工明确:文献查阅与赛题分析、基础模型复现和模型整体架构构建及训练三个部分。在文献查阅与赛题分析方面,主要的目的是分析赛题,根据评测指标去查阅最新的模型,并且统计下来各论文模型的数据,按照赛题的评分标准去计算论文级别的理论成绩,最后从中选取比较好的模型。模型选取之后就要将基础模型复现,这部分需要从选中的模型里,按照论文数据或者开放出来的其它框架的代码,利用飞桨去复现backbone或者整体模型,对于为backbone的在imagenet上进行预训练或者从其它框架里转换预训练模型;模型整体架构的构建和训练是最为费时的一个,因为其需要负责整个代码的框架制定训练策略、数据增广策略以及各种训练调参。
“本次比赛主非常考验目标检测相关知识,比如常见的单阶段目标检测方法:SSD、Yolov3、Centernet等,双阶段目标检测方法:Faster RCNN、ThunderNet等。”张鹏松说起比赛仍很激动,他为了提高模型的泛化能力还做一些数据增广,例如旋转、镜像、对比度、亮度等。为了与更多飞桨开发者分享本次百度之星比赛的收获,他将比赛代码进行了开源并上传至AI Studio中。
项目地址:
https://aistudio.baidu.com/aistudio/projectDetail/189267
01
简介
Single Shot MultiBox Detector (SSD) 是一种单阶段的目标检测器。与两阶段的检测方法不同,单阶段目标检测并不进行区域推荐,而是直接从特征图回归出目标的边界框和分类概率。SSD 运用了这种单阶段检测的思想,并且对其进行改进:在不同尺度的特征图上检测对应尺度的目标。如下图所示,SSD 在六个尺度的特征图上进行了不同层级的预测。每个层级由两个3x3卷积分别对目标类别和边界框偏移进行回归。因此对于每个类别,SSD 的六个层级一共会产生 38x38x4 + 19x19x6 + 10x10x6 + 5x5x6 + 3x3x4 + 1x1x4 = 8732 个检测结果。
SSD 可以方便地插入到任何一种标准卷积网络中,比如 VGG、ResNet 或者 MobileNet,这些网络被称作检测器的基网络。在这个示例中我们使用 shufflenet。
在训练时还会对图片进行数据增强,包括随机扰动、扩张、翻转和裁剪:
-
扰动: 扰动图片亮度、对比度、饱和度和色相。
-
扩张: 将原始图片放进一张使用像素均值填充(随后会在减均值操作中减掉)的扩张图中,再对此图进行裁剪、缩放和翻转。
-
翻转: 水平翻转。
-
裁剪: 根据缩放比例、长宽比例两个参数生成若干候选框,再依据这些候选框和标注框的面积交并比(IoU)挑选出符合要求的裁剪结果。
也可以采用一些其他数据增广方法:
InstaBoost:
论文:https://arxiv.org/abs/1908.07801
代码:https://github.com/GothicAi/InstaBoost
RandAugment:
https://arxiv.org/pdf/1909.13719.pdf
https://github.com/tensorflow/tpu/blob/master/models/official/efficientnet/autoaugment.py
目录:
| work
|-- astar2019
|-- score.py
|-- ...
|-- ssd
|-- train.py
|-- mobilenet_ssd.py
|-- ...
|-- coco
|-- train2017
|-- val2017
|-- test2017
|-- ...
02
解压数据集
get_ipython().system('unzip -qo -d work/coco/ data/data7122/train2017.zip')
get_ipython().system('unzip -qo -d work/coco/ data/data7122/val2017.zip')
get_ipython().system('unzip -qo -d work/coco/ data/data7122/test2017.zip')
get_ipython().system('unzip -qo -d work/coco/ data/data7122/annotations_trainval2017.zip')
get_ipython().system('unzip -qo -d work/coco/ data/data7122/image_info_test2017.zip')
03
安装相关依赖库
get_ipython().system('pip install pycocotools')
get_ipython().system('pip install ujson')
飞桨已发布了图像分类模型库:
https://github.com/PaddlePaddle/models/tree/develop/PaddleCV/image_classification
用户可以参照work/ssd/中的mobilenet_ssd、shufflenetv2_ssd.py、mobilenetv2_ssd.py等添加自己的backbone。
04
开始训练
训练策略采用了warmup,优化器采用的Momentum,用户也可以自己更改优化器,保存的预测模型会以图片的height_width_xxx来命名:
get_ipython().system('python3 work/ssd/train.py --learning_rate 0.00001 --data_dir work/coco --epoc_num 220 --batch_size 32')
执行score
score模型的名字需要是height_width_xxx,默认300x300,--model_dir 为预测模型地址:
get_ipython().system('python3 work/astar2019/score.py --model_dir model_snet/300_300_inference')
05
量化训练
此部分用的是main_quant.py里的量化方法,也可以用PaddleSlim里的方法,详见work/paddleslim,同时PaddleSlim也可以进行剪枝等操作:
get_ipython().system('python work/ssd/main_quant.py --init_model model_snet/best_model --model_save_dir model_snet/snet_int8 --mode train')
执行量化后的评测:
get_ipython().system('python3 work/astar2019/score.py --model_dir model_snet/snet_int8/300_300_int8_inference')
赛以致用,将比赛代码开源,将比赛成果逐步落地,是飞桨参赛者的心愿。
杀入决赛的Seigato队长顾竟潇认为,此次的比赛作品可以快速落地并移植到特定嵌入式终端。而且由于计算量小,采用了8比特量化,也可以应用到车辆行车记录仪、安防监控等低功耗产品中。wildkid1024队长刘澍波则更看重数据,此次赛题中需要对小目标进行数据增强,通过调整图片的色调、随机裁剪放缩都是很好的方式。在比赛开始前,他对飞桨框架的上手难度有过怀疑,但是通过比赛他发现,完全是多虑了。飞桨的设计理念有点类似于C++,需要先定义好参数和运算,然后通过编译的方式生成计算图,最后实际运行的时候再把数据提供出来,这种设计会非常方便于部署。
自2005年到现在,百度之星已经走过了15年。一批批的参赛选手,他们或身居校园,憧憬着自身的发展;或已经投身一线,在业务领域有了一番作为。但无论是哪一种,他们是年轻的,就像年轻的飞桨一样,开放、兼容、自主、创新。一场比赛或许不能让世界有所改变,但孜孜不倦、矢志不渝的坚持,一定能够让更多的人能够享受到AI发展的红利,也能让中国的AI技术人才找到自己的舞台。
这样的未来,必然会更加精彩。
>> 访问 PaddlePaddle 官网,了解更多相关内容。
下载安装命令 ## CPU版本安装命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle ## GPU版本安装命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu