专栏首页机器学习AI算法工程EfficientDet训练自己的物体检测数据集

EfficientDet训练自己的物体检测数据集

目标检测能够既准确又快速吗?

我们常常有一个概念,SSD 等单阶段目标检测器很快,但准确性比不上 Mask R-CNN 等两阶段目标检测器,尽管两阶段目标检测推断速度要慢许多。那么有没有一种兼顾两者的目标检测器?设计这样的检测器又会出现什么挑战?这就是该论文作者所关心的。

近年来,在实现更准确的目标检测方面出现了大量进展,然而当前最优目标检测器的成本也越来越高昂。例如,近期提出的基于 AmoebaNet 的 NASFPN 检测器需要 167M 参数和 3045B FLOPS(是 RetinaNet 的 30 倍)才能获得当前最优准确率。大模型规模和昂贵的计算成本阻碍了它们在一些现实世界应用中的部署,例如模型规模和延迟高度受限的机器人、自动驾驶汽车等应用。由于这些现实世界的资源限制,模型效率对于目标检测的重要性越来越高。

已经有很多研究试图开发更高效的检测器架构,如单阶段检测器和 anchor-free 检测器,或者压缩现有模型。尽管这些方法可以实现更优的效率,但这通常是以准确率为代价的。此外,大部分之前研究仅关注某个或某些特定的资源要求,而大量现实应用(从移动设备到数据中心)通常具备不同的资源限制。

那么问题来了:在面对广泛的资源约束时(如 3B 到 300B FLOPS),构建兼具准确率和效率的可扩展检测架构是否可行?

谷歌大脑的这篇论文系统性地研究了多种检测器架构设计,试图解决该问题。基于单阶段检测器范式,研究者查看了主干网络、特征融合和边界框/类别预测网络的设计选择,发现了两大主要挑战:

挑战 1:高效的多尺度特征融合。尽管大部分之前工作融合了不同的输入特征,但它们仅仅是不加区分地将其汇总起来。而由于这些输入特征的分辨率不尽相同,它们对输出特征的贡献也不相等。

挑战 2:模型缩放。尽管之前研究主要依赖大型主干网络或者较大的输入图像规模,但研究者发现,在同时考虑准确率和效率的情况下,扩大特征网络和边界框/类别预测网络非常关键。

针对这两项挑战,研究者提出了应对方法。

挑战 1:高效的多尺度特征融合。研究者提出一种简单高效的加权双向特征金字塔网络(BiFPN),该模型引入了可学习的权重来学习不同输入特征的重要性,同时重复应用自上而下和自下而上的多尺度特征融合。

挑战 2:模型缩放。受近期研究 [31] 的启发,研究者提出一种目标检测器复合缩放方法,即统一扩大所有主干网络、特征网络、边界框/类别预测网络的分辨率/深度/宽度。

最后,研究者观察到,近期出现的 EfficientNets 效率超过之前常用的主干网络。于是研究者将 EfficientNet 主干网络和 BiFPN、复合缩放结合起来,开发出新型目标检测器 EfficientDet,其准确率优于之前的目标检测器,同时参数量和 FLOPS 比它们少了一个数量级。

EfficientDet-D7 在 COCO 数据集上实现了当前最优的 51.0 mAP,准确率超越之前最优检测器(+0.3% mAP),其规模仅为之前最优检测器的 1/4,而后者的 FLOPS 更是 EfficientDet-D7 的 9.3 倍。

Pytoch版的EfficientDet

1、下载Pytoch版的EfficientDet。

https://github.com/zylo117/Yet-Another-EfficientDet-Pytorch

2、制作数据集。

将标注好的:Labelme数据集转为COCO数据集。

参照

https://blog.csdn.net/hhhhhhhhhhwwwwwwwwww/article/details/106255087。

3、下载EfficientNets预训练模型。

b0:

https://github.com/lukemelas/EfficientNet-PyTorch/releases/download/1.0/efficientnet-b0-355c32eb.pth

b1:

https://github.com/lukemelas/EfficientNet-PyTorch/releases/download/1.0/efficientnet-b1-f1951068.pth

b2:

https://github.com/lukemelas/EfficientNet-PyTorch/releases/download/1.0/efficientnet-b2-8bb594d6.pth

b3:

https://github.com/lukemelas/EfficientNet-PyTorch/releases/download/1.0/efficientnet-b3-5fb5a3c3.pth

b4:

https://github.com/lukemelas/EfficientNet-PyTorch/releases/download/1.0/efficientnet-b4-6ed6700e.pth

b5:

https://github.com/lukemelas/EfficientNet-PyTorch/releases/download/1.0/efficientnet-b5-b6417697.pth

b6:

https://github.com/lukemelas/EfficientNet-PyTorch/releases/download/1.0/efficientnet-b6-c76e70fd.pth

b7:

https://github.com/lukemelas/EfficientNet-PyTorch/releases/download/1.0/efficientnet-b7-dcc49843.pth

将预训练模型放到指定的目录下面:

如果可以连接外网可以忽略这个步骤,运行时会自动下载预训练模型。

4、安装模型需要的包

pycocotools

pytorch1.2版本以上(模型用了pytorch的nms,在1.2以上的版本中才包含)

python-opencv(pip install opencv-python)

tensorboardX(pip install tensorboardx)

webcolors(pip install webcolors)

结合本地环境,如果还有缺少的自行下载,唯一要注意的就是pytorch的版本。

修改coco.yml参数。

5、放置数据集

将数据集放到datasets目录下,如下图:

6、修改train.py中的参数

主要需要修改的参数有compound_coef、batch_size、num_epochs、save_interval、lr、data_path、load_weights

compound_coef:0-7,选择EfficientDet的模型,对应d0-d7,同时对应EfficientNet网络的b0-b7。

batch_size:根据显卡显存的大小和类别的多少定义。

epochs:默认为500,一般情况300即可。

save_interval:迭代多少次保存一个模型。

lr:学习率,默认为10-4,这个模型不要用太大的学习率,经测试,学习率太大不收敛。

data_path:数据集的路径,本例放在datasets路径下面,就设置为datasets。

load_weights:加载模型的路径,如果没有一次训练完,再次训练就要用到此参数。

参数配置如下:

测试

修改efficientdet_test.py参数:

compound_coef和训练时设置的参数相对应,比如训练时设置的是0,测试的时候也设置为0

img_path:测试图片的路径。

threshod = 0.2,iou_threshod = 0.35。这两个参数在物体检测中常见,一个过滤分数,一个设置重叠度。

obj_ist =['aircraft', 'oitank']:类别,和训练时的类别顺序一致。

修改完成后运行efficientdet_test.py文件

会在test文件夹下面保存结果的图片,结果如下:

参考地址

https://blog.csdn.net/hhhhhhhhhhwwwwwwwwww/article/details/106722315

https://blog.csdn.net/jy1023408440/article/details/105638482

tensorflow2 的EfficientDet

环境:

v100,cuda10.1,tensorflow2.1.0 ,python3.7.7

(只保证这个版本是可行的,其他尝试了很多,报了各种匪夷所思的bug

我的数据集是iabelme标注的,文件格式是xml,所以要转成tfrecord格式

注:这个是官方版的,不是pytorch的,

https://github.com/google/automl/tree/master/efficientdet

参照:

1.数据集准备

简单来说:就是用dataset下create_pascal_tfrecord.py进行转换,注意修改类名

命令:

PYTHONPATH=".:$PYTHONPATH"

python dataset/create_pascal_tfrecord.py --data_dir=VOCdevkit --year=VOC2012 --output_path=mytfrecord/pascal --set=trainval

2.训练:

还有model_dir前面的 '/'去掉,否则会到根目录,而不是当前目录(感觉有点坑,害的我以为一开始预测没成功)

还有训练不显示loss,需要tensorboard 显示

cd到model_dir文件夹下

tensorboard --logdir=./,这将打开该 *. tfevents文件夹下的文件

3.map测试

python main.py --mode=eval

--num_classes=10 --training_file_pattern=mytfrecord/train*.tfrecord --validation_file_pattern=mytfrecord/val*.tfrecord --val_json_file=mytfrecord/json_val.json --model_name=efficientdet-d3 --model_dir=tmp/efficientdet-d3 --ckpt=/data/test/automl/efficientdet/efficientdet-d3 --train_batch_size=2 --eval_batch_size=2 --eval_samples=1024 --hparams="use_bfloat16=false,num_classes=10,moving_average_decay=0" --use_tpu=False

4.用自己的图片预测

python model_inspect.py --runmode=infer --model_name=efficientdet-d3 --input_image_size=1920 --max_boxes_to_draw=100 --min_score_thresh=0.4 --ckpt_path=tmp/efficientdet-d3 --input_image=testdata/4.jpg --output_image_dir=outimg/ --num_classes=10 --enable_ema=False

一定要加后面两个,别问我为啥,我也不知道,整了好久,issue差点都翻了一遍

好吧你们要的理由:

可参考https://github.com/google/automl/issues/249

哦,对了,预测的时候,请把inference.py的类名改回来。

没什么问题的话,跟上图差不多就预测完成了。

预测的图片在output_image_dir 下一个叫0.jpg的,看名字不开心的自己去改^_^

还有如果是一堆图片的,自己用inference.py改改

参考链接

https://blog.csdn.net/jy1023408440/article/details/105638482

本文分享自微信公众号 - 机器学习AI算法工程(datayx)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-07-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 深度学习项目:歌词的自动生成

    2:加载数据集,整理汉字和id之间的映射。从我们的txt文件中读取歌词,每一行是一首歌,因为我们的部分歌中含有应为,我们这里也做一个小小的处理,那就是将英文占比...

    机器学习AI算法工程
  • 2016-2018年机器学习大赛TOP开源作品汇总

    本次大赛要求参赛者基于提供的讯飞 AI 营销云的海量广告投放数据,通过人工智能技术构建来预测模型预估用户的广告点击概率。比赛提供了 5 类数据,包括基础广告投放...

    机器学习AI算法工程
  • Python+Selenium+PIL+Tesseract真正自动识别验证码进行一键登录

    Python 2.7 IDE Pycharm 5.0.3 Firefox浏览器:47.0.1 PIL : Pillow-3.3.0-cp27-cp27m-...

    机器学习AI算法工程
  • 《Kotlin 反应式编程》使用 RxKotlin 实现一个极简的 http DSL ( Reactive Programming Using Rx Kotlin )《Kotlin 反应式编程》使用

    我们现在已经基本知道 Kotlin 中 DSL 的样子了。但是这些 DSL 都是怎样实现的呢?本节我们就通过实现一个极简的http DSL来学习创建 DSL 背...

    一个会写诗的程序员
  • 二值网络--XNOR-Net: ImageNet Classification Using Binary Convolutional

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.n...

    用户1148525
  • mongoDB入门教程五:搭建一个简单的登陆注册界面

    1:打开一个cmd窗口(右键以管理员身份)来运行mongo.exe。同样打开bin文件,执行mongo.exe

    祈澈菇凉
  • 小鹏汽车再融资!新汽车迎来黄金时代却难掩残酷现实

    前段时间,雷军到广州考察小鹏汽车一天,备受各界关注,当时小鹏汽车被传正在寻求融资,何小鹏在给员工的内部信中提到:“很快会和大家报告下一步的融资信息”。

    罗超频道
  • 最强解析:支付宝系统架构内部剖析

    Metamorphosis (MetaQ) 是一个高性能、高可用、可扩展的分布式消息中间件,类似于LinkedIn的Kafka,具有消息存储顺序写、吞吐量大和支...

    Java团长
  • bilibili(b站)升级到BV号了,还想用av号怎么办?

    就在3月23日b站宣布b站链接由原来的av改为BV了,具体看官方说明【升级公告】AV号全面升级至BV号https://www.bilibili.com/read...

    苏生不惑
  • ELMO/BERT/Transformer笔记 (备用)

    (1)词向量与ELMO模型:https://www.bilibili.com/video/av89296151?p=1

    MachineLP

扫码关注云+社区

领取腾讯云代金券