手把手教物体检测——EfficientDet

2023-05-16

目录

摘要

训练数据

1、下载Pytoch版的EfficientDet。

2、制作数据集。

3、下载EfficientNets预训练模型。

4、安装模型需要的包

5、放置数据集

6、修改train.py中的参数

测试

注意


摘要

谷歌大脑团队 Quoc V. Le 等人系统研究了多种目标检测神经网络架构设计,提出了能够提升模型效率的几项关键优化。首先,他们提出加权双向特征金字塔网络(weighted bi-directional feature pyramid network,BiFPN),从而轻松、快速地实现多尺度特征融合;其次,他们提出一种复合缩放(compound scaling)方法,同时对所有主干网络、特征网络和边界框/类别预测网络的分辨率、深度和宽度执行统一缩放。基于这些优化,研究者开发了新型目标检测器 EfficientDet。模型结构如下:

EfficientDet的特点:

  1. 使用EfficientNet网格作为主干网络。
  2. 提出BiFPN,使模型实现高效的双向跨尺度连接和加权特征融合。下图是集中常见的FPN结构图:

aFPN 使用自上而下的路径来融合多尺度特征 level 3-7P3 - P7);bPANet FPN 的基础上额外添加了自下而上的路径;cNAS-FPN 使用神经架构搜索找出不规则特征网络拓扑;(d)-(f) 展示了该论文研究的三种替代方法。d 在所有输入特征和输出特征之间添加成本高昂的连接;e 移除只有一个输入边的节点,从而简化 PANetf 是兼顾准确和效率的 BiFPN

  1. 模型缩放。提出一种目标检测器复合缩放方法,即统一扩大所有主干网络、特征网络、边界框/类别预测网络的分辨率/深度/宽度。

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

论文地址:https://arxiv.org/abs/1911.09070

训练数据

1、下载Pytoch版的EfficientDet。

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

2、制作数据集。

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

参照https://blog.csdn.net/hhhhhhhhhhwwwwwwwwww/article/details/106255087

本例用的数据集:https://download.csdn.net/download/hhhhhhhhhhwwwwwwwwww/14003627

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、安装模型需要的包

  1. pycocotools
  2. pytorch1.2版本以上(模型用了pytorch的nms,在1.2以上的版本中才包含)
  3. python-opencv(pip install opencv-python)
  4. tensorboardX(pip install tensorboardx)
  5. webcolors(pip install webcolors)

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

  1. 修改coco.yml参数。

project_name: coco  # also the folder name of the dataset that under data_path folder
train_set: train2017#注意和COCO转化时,选择的年份一致。
val_set: val2017
num_gpus: 1

# mean and std in RGB order, actually this part should remain unchanged as long as your dataset is similar to coco.
mean: [0.485, 0.456, 0.406]
std: [0.229, 0.224, 0.225]

# this is coco anchors, change it if necessary
anchors_scales: '[2 ** 0, 2 ** (1.0 / 3.0), 2 ** (2.0 / 3.0)]'
anchors_ratios: '[(1.0, 1.0), (1.4, 0.7), (0.7, 1.4)]'

# must match your dataset's category_id.
# category_id is one_indexed,
# for example, index of 'car' here is 2, while category_id of is 3

obj_list: ['aircraft', 'oiltank'] #类别顺序和转化COCO时候的类别顺序一致。COCO中设置'aircraft':1, 'oiltank':2

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:加载模型的路径,如果没有一次训练完,再次训练就要用到此参数。
参数配置如下:
def get_args():

    parser = argparse.ArgumentParser('Yet Another EfficientDet Pytorch: SOTA object detection network - Zylo117')

    parser.add_argument('-p', '--project', type=str, default='coco', help='project file that contains parameters')

    parser.add_argument('-c', '--compound_coef', type=int, default=4, help='coefficients of efficientdet')

    parser.add_argument('-n', '--num_workers', type=int, default=2, help='num_workers of dataloader')

    parser.add_argument('--batch_size', type=int, default=2, help='The number of images per batch among all devices')

    parser.add_argument('--head_only', type=boolean_string, default=False,

                        help='whether finetunes only the regressor and the classifier, '

                             'useful in early stage convergence or small/easy dataset')

    parser.add_argument('--lr', type=float, default=1e-4)

    parser.add_argument('--optim', type=str, default='adamw', help='select optimizer for training, '

                                                                   'suggest using \'admaw\' until the'

                                                                   ' very final stage then switch to \'sgd\'')

    parser.add_argument('--num_epochs', type=int, default=300)

    parser.add_argument('--val_interval', type=int, default=1, help='Number of epoches between valing phases')

    parser.add_argument('--save_interval', type=int, default=11970, help='Number of steps between saving')

    parser.add_argument('--es_min_delta', type=float, default=0.0,

                        help='Early stopping\'s parameter: minimum change loss to qualify as an improvement')

    parser.add_argument('--es_patience', type=int, default=0,

                        help='Early stopping\'s parameter: number of epochs with no improvement after which training will be stopped. Set to 0 to disable this technique.')

    parser.add_argument('--data_path', type=str, default='datasets', help='the root folder of dataset')

    parser.add_argument('--log_path', type=str, default='logs/')

    parser.add_argument('-w', '--load_weights', type=str, default=None,

                        help='whether to load weights from a checkpoint, set None to initialize, set \'last\' to load last checkpoint')

    parser.add_argument('--saved_path', type=str, default='logs/')

    parser.add_argument('--debug', type=boolean_string, default=False, help='whether visualize the predicted boxes of trainging, '

                                                                  'the output images will be in test/')
运行效果如下:

 

测试

修改efficientdet_test.py参数:
  1. compound_coef和训练时设置的参数相对应,比如训练时设置的是0,测试的时候也设置为0
  2. img_path:测试图片的路径。
  3. threshod = 0.2iou_threshod = 0.35。这两个参数在物体检测中常见,一个过滤分数,一个设置重叠度。
  4. obj_ist =['aircraft', 'oitank']:类别,和训练时的类别顺序一致。
修改完成后运行efficientdet_test.py文件
会在test文件夹下面保存结果的图片,结果如下:

 
运行coco_eval.py,会生成,测试模型得分。在这里注意numpy的版本。如果太高会报一个不兼容的错误,需要降到17版本。我用的版本是1.17.4,结果如下:
 

注意

1、这个模型使用时,compound_coef在训练集和测试集相对应,如果不仔细容易出现错乱。

2、在使用COCO数据集时,注意类别的顺序,如果出现错乱会导致得分很低甚至为零。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

手把手教物体检测——EfficientDet 的相关文章

随机推荐

  • STM32——ST-Link v2调试下载器的连接方法【详解】

    硬件电路 在网上购买了STM32F103C8T6的最小系统开发板 xff0c 由于手头上没有官方的STM32调试器 xff0c 所以也同时购买了一个便宜的st link v2下载调试器 这种下载器和STM32的最小系统板之间完成调试通信需要
  • Linux/Centos Makefile 使用总结

    1 Makefile 简介 Makefile 是和 make 命令一起配合使用的 很多大型项目的编译都是通过 Makefile 来组织的 如果没有 Makefile 那很多项目中各种库和代码之间的依赖关系不知会多复杂 Makefile的组织
  • 深入理解SQLite3之sqlite3_exec及回调函数

    sqlite3的C C 43 43 接口API主要有3个重要函数 xff0c 分别为 1 sqlite3 open const char filename sqlite3 ppDb 2 int sqlite3 exec sqlite3 An
  • 5G:三大场景--- eMBB、URLLC、mMTC

    背景 xff1a 很多人认为 5G 确实是未来的发展方向 xff0c 但具体到哪些落地 xff0c 又说不清楚 xff0c 甚至于认为 5G 只比 4G 多了一个G 而已 xff0c 但笔者认为 xff1a 5G 在移动通信领域绝对是革命性
  • Linux:lspci命令介绍

    lspci xff0c 是一个用来显示系统中所有PCI总线设备或连接到该总线上的所有设备的工具 pci是一种总线 xff0c 而通过pci总线连接的设备就是pci设备了 如今 xff0c 我们常用的设备很多都是采用pci总线了 xff0c
  • iperf详细使用方法

    Iperf 是一个网络性能测试工具 Iperf可以测试TCP和UDP带宽质量 Iperf可以测量最大TCP带宽 xff0c 具有多种参数和UDP特性 Iperf可以报告带宽 xff0c 延迟抖动和数据包丢失 Iperf使用方法与参数说明 参
  • IPSec浅见

    1 IPSEC协议簇安全框架 a IPSec简介 IPSec xff08 Internet Protocol Security xff09 xff1a 是一组基于网络层的 xff0c 应用密码学的安全通信协议族 IPSec不是具体指哪个协议
  • IPsec:strongswan与vpp实现ipsec

    1 strongswan 43 vpp简介 strongswan与vpp如何结合 本次实验使用的是VPP 20 01 版本 43 strongswan 5 9 6版本 目前strongSwan 43 vpp的方案主要是使用strongswa
  • Linux:启动sshd服务的时候提示错误Unsupported option UsePAM

    问题 分析 默认的configure 没有启用 with pam选项 xff0c 如果在sshd config配置文件里加入UsePAM no 就会导致上面的错误提示 UsePAM与ssh密码认证相关 xff0c 但公司服务器禁止通过密码认
  • Ubuntu: ssh升级后服务不稳定不断重启,查看sshd服务状态为activating(start)的解决办法

    现象 xff1a Ubuntu20 04 升级ssh7 4到8 1版本后 xff0c ssh连接不稳定 xff0c 时断时续 xff0c systemctl status sshd查看服务状态为activating start xff0c
  • Linux:grep命令检索文件内容详解

    前言 Linux系统中搜索 查找文件中的内容 xff0c 一般最常用的是grep命令 xff0c 另外还有egrep命令 xff0c 同时vi命令也支持文件内容检索 下面来一起看看Linux利用grep命令检索文件内容的详细介绍 方法如下
  • stm32零基础应该怎么入门?

    单片机 xff08 microcontrollers xff09 是一种集成电路芯片 xff0c 是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU 多种I O口和中断系统 定时器 计数器等功能集成到一块硅片上构成的一个小而完善
  • Linux:CPU频率调节模式以及降频方法简介

    概述 cpufreq的核心功能 xff0c 是通过调整CPU的电压和频率 xff0c 来兼顾系统的性能和功耗 在不需要高性能时 xff0c 降低电压和频率 xff0c 以降低功耗 xff1b 在需要高性能时 xff0c 提高电压和频率 xf
  • Linux:rsyslog 日志丢失 messages lost due to rate-limiting

    系统日志显示 cat var log messages Apr 7 16 20 01 ngnodeb rsyslogd imjournal 154664 messages lost due to rate limiting 解决方法 修改配
  • Linux:shell 中的单行注释和多行注释

    关于 shell 中的单行注释和多行注释 单行注释 众所周知 xff0c 使用 比如想要注释 echo 34 Hello World 34 root 64 test vim test sh echo 34 Hello World 34 多行
  • Shell三剑客之sed:修改 xml

    修改前 vim config xml lt config input type verify 61 34 bool 34 name 61 34 flow bypass class 34 visible 61 34 true 34 gt fa
  • STM32串口通信

    STM32串口通信 一 基于寄存器与基于固件库编写的差异二 stm32串口通信实战1 烧录方式2 代码及效果图 三 C语言程序里全局变量 局部变量 堆 栈等概念四 stm32的堆 栈 全局变量的分配地址 一 基于寄存器与基于固件库编写的差异
  • keil下的FreeRtos多任务程序

    keil下的Freertos多任务程序 1 手动移植FreeRtos xff08 以STM32F103为例 xff09 2 直接使用野火的模板 1 手动移植FreeRtos xff08 以STM32F103为例 xff09 用该链接下载Fr
  • 随笔小记(二十七)

    神经网络中Epoch Iteration Batchsize相关理解和说明 batchsize xff1a 中文翻译为批大小 xff08 批尺寸 xff09 简单点说 xff0c 批量大小将决定我们一次训练的样本数目 batch size将
  • 手把手教物体检测——EfficientDet

    目录 摘要 训练数据 1 下载Pytoch版的EfficientDet 2 制作数据集 3 下载EfficientNets预训练模型 4 安装模型需要的包 5 放置数据集 6 修改train py中的参数 测试 注意 摘要 谷歌大脑团队 Q