TensorFlow2.x-YOLOv3训练自定义数据库

本文记录如何用TensorFlow2.x-YOLOv3训练自定义数据库。训练使用TensorFlow-cpu 2.2,在Intel(R) Core(TM) i7-8550U CPU 8G RAM的笔记本中完成,训练artelab图集427张图的时间约为14个小时,供参考。

参考链接

tensorflow-yolov3 基于tensorflow-gpu==1.11.0版本实现的yolo3版本

TensorFlow2.0-Examples基于tensorflow-gpu==2.0版本实现的yolo3版本

YunYang1994/tensorflow-yolov3 训练自己的数据集

artelab本文训练图集下载链接,图集内容为条形码。本文以训练该图集为例,来说明如何使用TensorFlow2.x-YOLOv3训练自定义的数据库。

向原作者致敬,非常感谢!

运行环境

Win10 + Python 3.6

TensorFlow-cpu 2.2

Keras 2.3.1

训练前准备工作

1. Github中下载TensorFlow2.0-Examples

下载后,请尝试运行TensorFlow2.0-Examples/4-Object_Detection/YOLOV3/test.py,若可以正常运行,则表示当前电脑用TensorFlow2.x-YOLOv3训练自定义的数据库的基础条件已具备。若有需要,请参考TensorFlow2.x-YOLOv3在Win10中运行Demo

2. Github中下载labelImg并确认其可以正常运行。如有需要,请参考Install labelImg on Win10 + python3.6

3. 下载artelab训练图集,下图为artLab图集中的一张,或准备其他训练图集。

ArtLab barcode Image

TensorFlow2.x-YOLOv3训练自定义数据库

1. TensorFlow2.x-YOLOv3文件结构

Github下载得到的TensorFlow2.x-YOLOv3文件结构为:

在以上结构中,我们需要更改YOLOV3/data文件夹下的内容,以及YOLOV3/core/config.py中的部分代码。接下来,我们逐一说明。

2. YOLOV3/data准备

上述TensorFlow2.x-YOLOv3单独拷贝出来,改造成我们所需要的文件结构。改造完成的TensorFlow2.x-YOLOV3/data的文件结构图如下:

将原有的文件结构改造为上述结构,我们需要新增或修改以下内容:

data/classes:删除原有的coco.names和yymnist.names,新增barcode.names。本文示例中仅需要检测barcode一类目标,因此 barcode.names内容为:

data/dataset: 删除原有的yymnist_test.txt,新增以下内容:

       data/dataset/imageset: 待训练的图片集,所有用于训练的图片均放在此路径下。

       data/dataset/yolotxt: 用labelImg标注的训练图集中的目标信息txt文件所在路径,其中的文件数量与待训练图片集数量相同,文件名称与待训练图片集的图片一一对应。

       data/dataset/convert.py: 用于将labelImg标注的目标信息YOLO格式的数据转换为TensorFlow2.x-YOLOv3格式的数据。转换的原理以及原因请参阅本文小节【YOLO数据转换为TensorFlow2.x-YOLOv3数据】。

       data/dataset: 该文件夹中test.txt和train.txt由convert.py根据data/dataset/yolotxt生成。默认情况下,将待训练图片集随机分类,取75%的图片作为训练集,目标信息存放在train.txt中;另外25%作为测试集,目标信息存放在test.txt中。若需要更改比例,需要在convert.py中修改相应参数。

3. 修改YOLOV3/core/config.py

打开config.py,将其中的

分别修改为:

上述三行代码并不在一起,这里为方便描述,写在一起。分别修改的是目标类型文件名,训练和测试数据信息路径与文件名。上述文件均使用的是相对路径,相对于TensorFlow2.x-YOLOv3原文件结构中的TensorFlow2.x-YOLOv3/train.py的路径。

4. 开始训练

以上内容修改完成后,在TensorFlow2.x-YOLOv3/train.py路径下运行train.py文件。正常开始训练的界面如下

我的电脑配置是Intel(R) Core(TM) i7-8550U CPU 8G RAM,训练artelab图集427张图的时间约为14个小时,供大家参考。

5.训练完成后,在train.py所在路径下运行tensorboard –logdir ./data/log,可以查看训练过程

此时,在浏览器中输入http://localhost:6006/,可以查看图形化的训练过程。

tensorboard

TensorFlow2.x-YOLOv3自定义数据库训练模型测试

在Tensorflow2.x_YOLOV3路径下,运行python test.py,即可使用当前训练的模型来检测我们图集中的测试集。

YOLO数据转换为TensorFlow2.x-YOLOv3数据

Install labelImg on Win10 + python3.6中提到过,labelImg标注的YOLO数据意义为:

图片标注完成后,每张图片均会生成一张与图像名称相同的txt文件,其内容及其意义如下:

在上述数据中,相应变量的意义如下:

x/y: 标注区域中心点坐标

w/h: 标注区域宽与高

imgWidth/imgHeight : 源图像的宽度与高度。

而TensorFlow2.x-YOLOv3需要将所有图片目标信息集中在一个txt文档中,txt文档中的一行代表一张图片的信息,一张图片中可以有多个目标信息,每行数据的意义如下:

正因为有了上述供需的差异,所以我们需要依靠convert.py来将labelImg标注的YOLO数据转换为TensorFlow2.x-YOLOv3所需要的数据。该文件的原理可以参考这里

我用的文件基本与原博客相同,做了一些简单的修改,请参阅下面的代码。

关于convert.py,有以下几个注意点:

1.  变量source_img_path_related_to_train_py与source_img_path

     这两个变量指向的其实是同一个文件夹,即待训练图片所在文件夹imageset。但它们都是相对路径,source_img_path_related_to_train_py是imageset相对于train.py所在位置的路径,而source_img_path则是相对于convert.py所在位置的路径。

2. 变量MAX_ID

    该变量值应该与待训练图片的类别数量相同。

3. 变量train_scale

    该变量设置图像集中用作训练集的百分比,默认为0.75,若需要修改,修改此变量即可。

如何在自己的程序中调用训练模型

按照上述步骤训练完成后,在train.py路径下会发现“yolov3.index”和”yolov3.data-00000-of-00001″这两个文件,它们就是我们训练得到的模型。借助Tensorflow2.x_YOLOV3中原有的core和data中的部分文件,参考test.py,构造文件夹可以调用我们训练得到的模型。如下文件结构所示,your_code.py为准备调用训练模型的文件。

 在your_code.py文件中准备以下代码,即可调用训练得到的模型进行目标检测。

本文到此结束,感谢阅读,欢迎关注。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

Fork me on GitHub