Google版EfficientDet训练自己的数据集

2024-03-18 12:38

本文主要是介绍Google版EfficientDet训练自己的数据集,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Ubuntu 20.04,cuda10.1,TensorFlow2.1.0,python3.6.9环境,使用Google版efficientDet训练自己的数据集,预测图片,并将结果写入txt


0.项目地址

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


1.项目部署

使用docker部署环境

Ubuntu 20.04,使用TensorFlow官方提供的docker镜像部署

拉取镜像

docker pull tensorflow/tensorflow:2.1.0-gpu-py3

包含cuda10.1,TensorFlow2.1.0,python3.6.9

拉取镜像后建立容器,设置使用宿主机的gpu,并挂载目录

docker run -it  --gpus all  -v 宿主机目录:容器中的目录 tensorflow/tensorflow:2.1.0-gpu-py3  /bin/bash

下载代码

git clone https://github.com/google/automl.git

安装依赖

项目github页面中写通过pip install -r requirements.txt安装依赖,但博主安装似乎出了点问题,于是手动pip install其中的python依赖包:

absl-py>=0.7.1
matplotlib>=3.0.3
numpy>=1.16.4
Pillow>=6.0.0
PyYAML>=5.1
six>=1.12.0
tensorflow>=2.1.0
tensorflow-addons>=0.9.1
tensorflow-probability>=0.9.0

以及安装coco api的python分支:
安装coco api(https://github.com/cocodataset/cocoapi),在当前环境下编译,并将编译后PythonAPI文件夹中的内容(pycocotools等)拷贝至efficientdet目录下
目录结构为automl-master/efficientdet/pycocotools


2.数据集准备

VOC2007格式数据集

数据集制作成VOC2007格式,目录结构如下
放在efficientdet目录下,目录结构为automl-master/efficientdet/VOCdevkit2007
在这里插入图片描述

数据集转换为tfrecord格式

*制作tfrecord格式的数据集前,先在dataset/create_pascal_tfrecord.py中,将pascal_label_map_dict修改为自己的类名

制作tfrecord格式数据集

PYTHONPATH=".:$PYTHONPATH"  python dataset/create_pascal_tfrecord.py \
--data_dir=VOCdevkit2007 \
--year=VOC2007  \
--output_path=mytfrecord/pascal  \
--set=trainval

制作完成后,在文件夹下生成100个tfrecord文件和1个json文件


3.预训练模型准备

下载预训练模型,解压到efficientdet目录下
博主使用efficientdet-d2模型,目录结构形如automl-master/efficientdet/efficientdet-d2


4.训练

训练

python main.py \
--mode=train_and_eval \
--training_file_pattern=mytfrecord/*.tfrecord \
--validation_file_pattern=mytfrecord/*.tfrecord \
--val_json_file=mytfrecord/json_pascal.json \
--model_name=efficientdet-d2 \
--model_dir=tmp/efficientdet-d2  \
--ckpt=efficientdet-d2  \
--train_batch_size=4 \
--eval_batch_size=1 \
--eval_samples=512 \
--hparams="num_classes=3 " 

其中num_classes为自己数据集的类数+1,model_name等根据自己使用的模型修改
训练生成的模型存放在automl-master/efficientdet/tmp/efficientdet-d2


5.预测

计算AP

制作test集的tfrecord文件
生成的文件在mytfrecord_test文件夹下

PYTHONPATH=".:$PYTHONPATH"  python dataset/create_pascal_tfrecord.py \
--data_dir=VOCdevkit2007 \
--year=VOC2007  \
--output_path=mytfrecord_test/pascal  \
--set=test 

计算AP

python main.py --mode=eval  \
--model_name=efficientdet-d2   --model_dir=tmp/efficientdet-d2  \
--validation_file_pattern=mytfrecord_test/pascal*  \
--testdev_dir='testdev_output'  \
--hparams="num_classes=3 " 

num_classes为自己数据集类数+1

预测自己的图片

*预测前,先将inference.py中的coco_id_mapping修改为自己数据集的类名
预测

python model_inspect.py \
--runmode=infer \
--model_name=efficientdet-d2 \
--max_boxes_to_draw=100  \
--min_score_thresh=0.7  \
--ckpt_path=tmp/efficientdet-d2  \
--input_image=VOCdevkit2007/demo/*.jpg \
--output_image_dir=res_img \
--hparams="num_classes=3 "

其中input_image为待检测图片存放路径,output_image_dir为检测结果图片输出路径,num_classes为自己数据集类数+1

远程查看tensorboard

cd至tmp/efficientdet-d2目录下
打开tensorboard

tensorboard  --logdir=. --port=6006

由于博主是在远程服务器上训练,要在本地查看远程服务器上的tensorboard,可以在Xshell中进行如下的ssh隧道设置
在这里插入图片描述
设置后,重新连接并启动tensorboard,即可在本地浏览器用http://127.0.1.1:6006/访问服务器上的tensorboard

预测结果写入txt

百度网盘链接:https://pan.baidu.com/s/1NjjIr9n63n65enF5rTWhZA
提取码:icgg
↑提供博主修改的一个可以将检测结果按类别写入txt的inference.py文件,写入的格式为每一行:文件名 置信度 xmin ymin xmax ymax
如:000174 0.967 278 337 327 358
使用时直接替换原inference.py,并将coco_id_mapping修改为自己数据集的类名,使用和上面相同的预测命令可以同时输出预测后的图片和txt
输出的txt存放在efficientdet目录下,文件名为类别


6.可能出现的问题

1)预测时,出现形如这样的错误↓

tensorflow.python.framework.errors_impl.InvalidArgumentError: 2 root error(s) found.(0) Invalid argument: Input to reshape is a tensor with 884736 values, but the requested shape requires a multiple of 90[[{{node Reshape}}]][[cond_88/while/Identity/_7860]](1) Invalid argument: Input to reshape is a tensor with 884736 values, but the requested shape requires a multiple of 90[[{{node Reshape}}]]
0 successful operations.
0 derived errors ignored.

在issues218中翻到类似问题,说是在预测时加上参数--enable_ema=False解决,但尝试后发现目前版本(2020.08.04)的代码中没有这个参数,于是加上--hparams="num_classes=自己数据集的类别数+1 ",发现可以解决问题

2)计算ap时,出现形如这样的错误(issues552)↓

 Invalid argument: Incompatible shapes: [32,810,128,128] vs. [32,9,128,128] 

也可以尝试通过指定num_classes解决


参考链接
https://blog.csdn.net/jy1023408440/article/details/105638482

这篇关于Google版EfficientDet训练自己的数据集的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/822354

相关文章

Java中注解与元数据示例详解

《Java中注解与元数据示例详解》Java注解和元数据是编程中重要的概念,用于描述程序元素的属性和用途,:本文主要介绍Java中注解与元数据的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参... 目录一、引言二、元数据的概念2.1 定义2.2 作用三、Java 注解的基础3.1 注解的定义3.2 内

将sqlserver数据迁移到mysql的详细步骤记录

《将sqlserver数据迁移到mysql的详细步骤记录》:本文主要介绍将SQLServer数据迁移到MySQL的步骤,包括导出数据、转换数据格式和导入数据,通过示例和工具说明,帮助大家顺利完成... 目录前言一、导出SQL Server 数据二、转换数据格式为mysql兼容格式三、导入数据到MySQL数据

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

C#提取PDF表单数据的实现流程

《C#提取PDF表单数据的实现流程》PDF表单是一种常见的数据收集工具,广泛应用于调查问卷、业务合同等场景,凭借出色的跨平台兼容性和标准化特点,PDF表单在各行各业中得到了广泛应用,本文将探讨如何使用... 目录引言使用工具C# 提取多个PDF表单域的数据C# 提取特定PDF表单域的数据引言PDF表单是一

一文详解Python中数据清洗与处理的常用方法

《一文详解Python中数据清洗与处理的常用方法》在数据处理与分析过程中,缺失值、重复值、异常值等问题是常见的挑战,本文总结了多种数据清洗与处理方法,文中的示例代码简洁易懂,有需要的小伙伴可以参考下... 目录缺失值处理重复值处理异常值处理数据类型转换文本清洗数据分组统计数据分箱数据标准化在数据处理与分析过

大数据小内存排序问题如何巧妙解决

《大数据小内存排序问题如何巧妙解决》文章介绍了大数据小内存排序的三种方法:数据库排序、分治法和位图法,数据库排序简单但速度慢,对设备要求高;分治法高效但实现复杂;位图法可读性差,但存储空间受限... 目录三种方法:方法概要数据库排序(http://www.chinasem.cn对数据库设备要求较高)分治法(常

Python将大量遥感数据的值缩放指定倍数的方法(推荐)

《Python将大量遥感数据的值缩放指定倍数的方法(推荐)》本文介绍基于Python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处理,并将所得处理后数据保存为新的遥感影像... 本文介绍基于python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处

使用MongoDB进行数据存储的操作流程

《使用MongoDB进行数据存储的操作流程》在现代应用开发中,数据存储是一个至关重要的部分,随着数据量的增大和复杂性的增加,传统的关系型数据库有时难以应对高并发和大数据量的处理需求,MongoDB作为... 目录什么是MongoDB?MongoDB的优势使用MongoDB进行数据存储1. 安装MongoDB

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动