目标检测:EfficientDet(官方开源版)训练自己的数据

写在前面:

 

本教程将介绍从原始标注数据到训练EfficientDet的全部过程,适合入门级选手,你将得到:

(1)详细的步骤介绍

(2)数据集处理代码

(3)EfficientDet训练示例代码

(4)EfficientDet官方预训练模型(百度网盘,链接在文末)

大家有任何问题可留言交流,必要时进行远程协助~

【EfficientDet系列文章】

Part-1 EfficientDet简介
Part-2 项目实战(训练Pascal VOC 2012)
Part-3 项目实战(训练口罩检测)

目录

1 说明

2 数据准备

2.1 原始标注数据整理

2.2 数据集预处理

2.3 数据集划分

2.4 tfrecord生成

3 训练

附录

预训练模型下载(百度网盘)

问题交流


1 说明

本教程采用的是EfficientDet官方原版开源代码,链接:

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

文末有本教程对应的工程源码、EfficientDet官方预训练模型(百度网网盘下载地址)

推荐环境配置:

  • TensorFlow >= 2.0 (建议采用最新版的TensorFlow)
  • CUDA >= 10.0

EfficientDet对各种Python包依赖不强,环境较为容易配置,主要是TensorFlow

本教程主要介绍如何训练自己的数据,EfficientDet原理不再过多介绍,其实力毋庸置疑,有图为证

COCO test-dev2017 指标(截至2020.08.14)

2 数据准备

数据集处理工具为 data_process_eff

GitHub地址:https://github.com/polar99/Data_Process_of_EfficientDet

2.1 原始标注数据整理

注意:数据集标注采用VOC格式,其他标注格式后续会做兼容

一般来讲,数据集标注后会得到图像和xml两种文件,其中图像是jpg格式。

按照VOC格式要求,图像文件夹命名为JPEGImages,标注文件夹命名为Annotations,目录结构如下:

2.2 数据集预处理

自己标注的数据集中,box的坐标可能存在错误,比如 box的 xmax > img_witdh,因此在正式训练之前,首先使用工程下的 check_xmls.py检查并自动修正错误的标注。

在工程data_process_eff目录下运行:

python check_xmls.py --xml_path=your_data_path/Annotations

2.3 数据集划分

数据集一般划分为

  • 训练集 train
  • 验证集 val
  • 测试集 test

考虑到实际项目中,可能接触不到带有标注的测试集或不具备测试集,本教程介绍将原始数据集划分为 训练集和验证集

Pascal VOC数据集中,使用 ImageSets/Main 文件夹下的 txt文件控制train val数据集的划分。假设原始数据共1000张图像,数据集目录结构如下所示:

在工程data_process_eff目录下运行:

python split_dataset.py --src_path=your_source_data_path --train_ratio=0.9

命令行参数解释:

  • src_path:对应上面的src_path,其中有JPEGImages 和 Annotations 两个文件夹
  • train_ratio:训练集所占的比例,则验证集的比例为(1-train_ratio)

成功运行后会在src_path下生成ImageSets/Main文件夹:

2.4 tfrecord生成

EfficientDet使用tfrecord文件进行训练,tfrecord是一种高效的文件存储结构,有利于加速TensorFlow的训练(相较于本地直接读取图像文件)。

EfficientDet源码文件夹dataset下复制一份create_pascal_tfrecord.py,命名为

my_create_pascal_tfrecord.py

注意:data_process_eff工程下也提供了修改好的my_create_pascal_tfrecord.py,如果不想自己改代码可直接使用该文件,省略前3步,直接进行第四步(4)。

修改my_create_pascal_tfrecord.py

(1)修改YEARS

YEARS = ['VOC2007', 'VOC2012', 'merged']

将YEARS中加入2.3中src_path文件夹名称,本人实验中的是my_set,则

YEARS = ['VOC2007', 'VOC2012', 'merged', 'my_set']

(2)修改pascal_label_map_dict

pascal_label_map_dict = {

'background': 0,

自定义类-1: 1,

自定义类-2: 2,

...

}

本人实验中,类别有2两类,车辆(vehicle)和行人(person),则

pascal_label_map_dict = {

'background': 0,

'vehicle': 1,

'person': 2,

}

(3)修改main()中的代码

去掉‘aeroplane_'+

(4)运行my_create_pascal_tfrecord.py

本人实验时的数据集目录结构

运行需要指定4个参数:

  • data_dir: 数据集根目录
  • set:数据集类型train、val、 test
  • year:数据集名称
  • output_path:tfrecord保存路径

建议使用绝对路径,本人实验时运行的命令:

python my_create_pascal_tfrecord.py \
--data_dir=D:/dataset \
--set=train \
--year=my_set \
--output_path=D:/dataset/my_set

可能出现的错误:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd5 in position 109: invalid continuation byte

这个错误是由dict_to_tf_example()函数引起的,原因是my_create_pascal_tfrecord.py中的代码

img_path = os.path.join(data['folder'], image_subdirectory, data['filename'])

data['folder']路径或data['filename']可能不正确。

问题主要是,自己标注的数据集中的xml内 folder字段,可能与现在数据集文件目录结构不一致导致的。可以通过脚本rectify_xml_folder.py来修改xml内的folder字段:

python rectify_xml_folder.py --src_path=D:/dataset/my_set

接下来重新运行my_create_pascal_tfrecord.py 可以生成关于train的 tfrecord及json文件。再将set改为val:

python my_create_pascal_tfrecord.py \
--data_dir=D:/dataset \
--set=val \
--year=my_set \
--output_path=D:/dataset/my_set

以生成关于val的 tfrecord及json文件。

注意:my_create_pascal_tfrecord.py命令行参数中有一个num_shards,用于指定tfrecord的个数,数据量较小时可以设置为1,即所有的数据集将会被打包到1个tfrecord文件

本人实验时的运行结果:

3 训练

在EfficientDet目录下新建 my_config.yaml文件

输入(本人的数据集分两类person和vehicle)

代码如下:

num_classes: 3

var_freeze_expr: '(efficientnet|fpn_cells|resample_p6)'

label_map: {1: person, 2: vehicle}

运行命令

python main.py --mode=train_and_eval \

--training_file_pattern=D:/dataset/my_set/train*.tfrecord \

--validation_file_pattern=D:/dataset/my_set/val*.tfrecord \

--model_name=efficientdet-d0 \

--model_dir=/tmp/efficientdet-d0-finetune \

--ckpt=efficientdet-d0 \

--train_batch_size=12\

--eval_batch_size=12 --eval_samples=100\

--num_examples_per_epoch=900--num_epochs=50 \

--hparams=my_config.yaml

其中:

  • training_file_pattern和validation_file_pattern为2.4中生产的tfrecord文件,*为通配符。
  • model_dir:训练时得到的ckpt文件存储路径
  • ckpt:预训练模型所在目录(预训练模型可在百度网盘中下载)
  • num_examples_per_epoch:训练集大小(本人的训练集900张图像)
  • eval_samples:验证集大小(本人的验证集100张图像)
  • hparams:自定义的配置文件

注意:以上涉及到路径配置的建议使用绝对路径。如果出现错误,不妨将路径设置为绝对路径再试试

预训练模型下载(百度网盘)

欢迎大家关注微信公众号“CV实战”,回复“effdet预训练模型”,即可获取下载地址

问题交流

大家有任何问题可留言或关注公众号交流,必要时可进行远程协助~

欢迎各位同道提出宝贵意见!

  • 11
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 45
    评论
### 回答1: 要训练自己的数据集,您需要执行以下步骤: 1. 准备数据集:您需要准备自己的数据集,并将其转换为COCO格式。您可以使用开源工具,如labelImg,来标记您的图像。 2. 下载EfficientDet代码:您需要下载EfficientDet的代码,并安装所需的依赖项。 3. 配置训练参数:您需要配置训练参数,例如学习率、批量大小、训练轮数等。 4. 开始训练:运行训练脚本,开始训练您的模型。 5. 评估模型:在训练完成后,您需要评估您的模型,并根据需要进行微调。 6. 导出模型:最后,您需要导出您的模型,以便在生产环境中使用。 以上是训练自己数据集的基本步骤,您可以根据实际情况进行调整和优化。 ### 回答2: EfficientDet 是一种高效的目标检测算法,它在准确性和计算效率方面都有出色的表现。如果想要训练自己的数据,可以按照以下步骤操作: 1.数据准备 首先,需要准备好自己的数据集,包括图像和对应的标注文件,标注文件可以使用常见的格式如VOC、COCO等。 2.安装依赖 EfficientDet 是基于 TensorFlow 实现的,所以需要安装 TensorFlow 环境。在安装完成后,需要安装其他的依赖库,例如 TensorFlow Object Detection API、opencv-python等。 3.转换数据格式 EfficientDet 使用 TFRecord 形式的数据作为输入。因此,需要将自己的数据集转换成 TFRecord 格式。可以使用 TensorFlow Object Detection API 中的脚本来实现。 4.修改配置文件 EfficientDet 使用配置文件来定义模型的超参数和训练参数。可以根据自己的需求来修改配置文件。例如,可以设置训练的 batch size、学习率等参数。 5.训练模型 在准备好数据集和配置文件后,可以开始训练模型了。可以使用 TensorFlow Object Detection API 中的 train.py 脚本来启动训练过程。 6.检验训练结果 训练完成后,可以使用 TensorFlow Object Detection API 中提供的 evaluation.py 脚本来评估模型的性能。可以在自己的数据集上测试模型的准确度、召回率等指标。 以上是训练 EfficientDet 模型的基本流程。在实际操作过程中,还需要注意数据增强、模型调优等方面。需要综合考虑模型准确率和计算效率之间的平衡,以获得更好的检测效果。 ### 回答3: EfficientDet是为了解决对象检测问题而提出的一种强大的神经网络算法。由于EfficientDet网络参数少,计算量小,并且可以实现高质量的对象检测,因此在实际应用中被广泛采用。EfficientDet网络采用了一种先进的特征提取技术和多层次的任务特定网络来进行训练和推理。本文将介绍如何训练自己的数据以构建自己的目标检测模型。 1. 数据集制作 EfficientDet训练的第一步是准备适当的训练数据集。这涉及到的重要方面包括图像的增强、标注和准备。 对于数据增强,可以使用多种技术来增加样本数量。例如,可以随机旋转、缩放、裁剪和翻转图像,或者对图像应用随机颜色变换和噪声。 对于数据标注,可以使用多种工具来标注图像中物体的位置和类别。例如,可以使用labelImg来标注图像中的对象和标签。标注完成后,可以将数据保存为Pascal VOC格式或卡巴斯格式,这些格式是EfficientDet支持的标准数据格式。 2. 模型训练 有了训练数据集之后,就可以开始训练EfficientDet模型了。在本部分中,我们将介绍如何使用TensorFlow进行EfficientDet模型的训练。 首先,需要安装TF2本及以上的TensorFlow,然后下载EfficientDet源码。然后,将自己的数据集导入EfficientDet源码。 接着,在EfficientDet的配置文件中,需要设置模型的参数,例如输入图像大小、批次大小、学习速率等。另外,还需要指定网络模型的类型以及要训练的层数和神经元数量。 训练模型时,需要对模型进行前向传递过程和反向传播过程。这涉及到多种技术,例如优化器和损失函数。对于EfficientDet,可以使用优化器和损失函数进行模型训练。 在训练的过程中,需要监视模型的性能和精度。可以采用多种技术来评估模型的性能,例如计算损失函数、精度等。最终,可以根据模型的性能和精度来调整模型的超参数和参数,以优化模型的性能和精度。 3. 模型评估 在模型训练完成后,需要对模型进行评估以确定其实际精度和性能。可以采用多种技术来评估模型的性能,例如计算准确率、召回率、F1得分等。 评估模型时,需要使用测试数据集对模型进行测试,并计算其准确率、召回率、F1得分等。如果模型的性能和精度较高,则可以将其部署到生产环境中,以用于实时目标检测

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 45
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值