TensorFlow YOLOv3 训练自己的数据集,详细教程

TensorFlow YOLOv3 训练自己的数据集,详细教程

这个教程是我在网上查找资料写的,为了便于自己查看,将多篇博客内容总结当成学习自己的笔记,。如若有对某位作者造成侵权问题,请作者联系我删除,谢谢 ! 由于本人水平有限,如果文章有不当之处还望评论区指出。

本文参考了如下博客:
https://blog.csdn.net/qq_38441692/article/details/103652760

一. 下载YOLOv3代码

在github上下载代码 :https://github.com/YunYang1994/tensorflow-yolov3

二. 制作训练集

1、打标签

这里的数据集格式采用的是VOC格式

1)方法一:使用实验LabelImg工具进行制作

LabelImg下载地址和数据集的制作过程可参考博文:labelImg标注图像的详细教程
实验LabelImg工具打好标签后会生成两个文件夹:
Annotations —存放标记的图片
JPEGImages —存放xml格式的标签

2)方法二:从COCO数据集中提取
参考博文:COCO数据集提取某类并转化为VOC

2. 按照VOC数据集格式建立文件夹

  • JPEGImages文件夹: 包含了训练图片和测试图片,混放在一起
  • Annotations文件夹: 存放xml格式的标签文件,每个xml文件都对应于JPEGImages文件夹的一张图片
  • ImageSets文件夹:
    1) Main文件夹存放图像物体识别的数据:有test.txt , train.txt, val.txt ,trainval.txt.这四个文件(后面会生成)
    -train中存放的是训练使用的数据;
    -val中存放的是验证结果使用的数据;
    -trainval为训练和验证的图片文件的文件名列表 。
    2)Action存放的是人的动作,我们暂时不用
    3)Layout存放的人体部位的数据。我们暂时不用
    4)Segmentation存放的是可用于分割的数据
    数据集文件夹目录格式如下图所示:
    在这里插入图片描述

JPEGImages文件夹放图片文件:
在这里插入图片描述

Annotations文件夹放标签xml文件:
在这里插入图片描述

3.划分训练集和测试集

训练时要有测试集和训练集,通过划分放在

E:\DeviceData\deviceData_20201108\ImageSets\Main

文件夹下,这里可以使用一段python代码按照9:1进行随机划分:
在deviceData_20201108文件夹建立一个python文件:split.py,代码如下

import os
import random
import sys

if len(sys.argv) < 2:
    print("no directory specified, please input target directory")
    exit()

root_path = sys.argv[1]

xmlfilepath = root_path + '/Annotations'

txtsavepath = root_path + '/ImageSets/Main'

if not os.path.exists(root_path):
    print("cannot find such directory: " + root_path)
    exit()

if not os.path.exists(txtsavepath):
    os.makedirs(txtsavepath)

trainval_percent = 0.9
train_percent = 0.8
total_xml = os.listdir(xmlfilepath)
num = len(total_xml)
list = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list, tv)
train = random.sample(trainval, tr)

print("train and val size:", tv)
print("train size:", tr)

ftrainval = open(txtsavepath + '/trainval.txt', 'w')
ftest = open(txtsavepath + '/test.txt', 'w')
ftrain = open(txtsavepath + '/train.txt', 'w')
fval = open(txtsavepath + '/val.txt', 'w')

for i in list:
    name = total_xml[i][:-4] + '\n'
    if i in trainval:
        ftrainval.write(name)
        if i in train:
            ftrain.write(name)
        else:
            fval.write(name)
    else:
        ftest.write(name)

ftrainval.close()
ftrain.close()
fval.close()
ftest.close()

打开控制台,运行该python文件,后跟Annotation的目录即可进行划分:
python .\split.py … (存放原始数据集的路径)

python .\split.py E:\DeviceData\deviceData_20201108

在这里插入图片描述
在ImageSets\Main下生成了四个文件,其中,train为训练集,test为验证集
在这里插入图片描述

4,根据划分结果制作训练集

上面代码已经实现了将数据集划分为训练集和验证集,但是tensorflow yolov3作者写的模型要求的数据集格式为:
在这里插入图片描述
所以我们需要写一个小脚本split-again.py,根据train.txt 和test.txt将数据集进行更改
根据这个小脚本就可进行划分为规定的格式,如果数据集的量比较大,可能有点慢,当然你也可以进行手动划分,省略前面几步操作,只要最终目录结构满足作者的格式就行

import os
from shutil import copyfile
#根据tarin.txt和test.txt将数据集分为标准数据集(改路径,存放数据集的路径(原始数据集路径))
train_text_path = 'E:/DeviceData/deviceData_20201108/ImageSets/Main/train.txt'
test_text_path = 'E:/DeviceData/deviceData_20201108/ImageSets/Main/test.txt'
#图片存放地址 (改路径,存放数据集的路径)
image_path = 'E:/DeviceData/deviceData_20201108/JPEGImages/'
#xml文件存放地址 (改路径,存放数据集的路径)
xml_path = 'E:/DeviceData/deviceData_20201108/Annotations/'

#输出的目录 (改路径,存放数据集的路径(生成数据集存放的路径))
outdir = 'E:/DeviceData/deviceData_20201108_VOC/'
#创建各级文件夹
test_xml_out = os.path.join(outdir,'VOC/test/VOC2020/Annotations')
os.makedirs(test_xml_out)
os.makedirs(os.path.join(outdir,'VOC/test/VOC2020/ImageSets/Layout'))
os.makedirs(os.path.join(outdir,'VOC/test/VOC2020/ImageSets/Main'))
os.makedirs(os.path.join(outdir,'VOC/test/VOC2020/ImageSets/Segmentation'))
test_img_out = os.path.join(outdir,'VOC/test/VOC2020/JPEGImages')
os.makedirs(test_img_out)
os.makedirs(os.path.join(outdir,'VOC/test/VOC2020/SegmentationClass'))
os.makedirs(os.path.join(outdir,'VOC/test/VOC2020/SegmentationObject'))
train_xml_out = os.path.join(outdir,'VOC/train/VOC2020/Annotations')
os.makedirs(train_xml_out)
os.makedirs(os.path.join(outdir,'VOC/train/VOC2020/ImageSets/Layout'))
os.makedirs(os.path.join(outdir,'VOC/train/VOC2020/ImageSets/Main'))
os.makedirs(os.path.join(outdir,'VOC/train/VOC2020/ImageSets/Segmentation'))
train_img_out = os.path.join(outdir,'VOC/train/VOC2020/JPEGImages')
os.makedirs(train_img_out)
os.makedirs(os.path.join(outdir,'VOC/train/VOC2020/SegmentationClass'))
os.makedirs(os.path.join(outdir,'VOC/train/VOC2020/SegmentationObject'))

with open(train_text_path) as f:
    lines = f.readlines()
    for i in lines:
        img_save_path = os.path.join(train_img_out,i.rstrip('\n')+'.jpg')
        xml_save_path = os.path.join(train_xml_out, i.rstrip('\n') + '.xml')
        copyfile(os.path.join(image_path,i.rstrip('\n')+'.jpg'),img_save_path)
        copyfile(os.path.join(xml_path, i.rstrip('\n') + '.xml'), xml_save_path)
        print(i)
with open(test_text_path) as f:
    lines = f.readlines()
    for i in lines:
        img_save_path = os.path.join(test_img_out, i.rstrip('\n') + '.jpg')
        xml_save_path = os.path.join(test_xml_out, i.rstrip('\n') + '.xml')
        copyfile(os.path.join(image_path, i.rstrip('\n') + '.jpg'), img_save_path)
        copyfile(os.path.join(xml_path, i.rstrip('\n') + '.xml'), xml_save_path)
        print(i)

打开控制台,运行该python文件:

python .\split_again.py 

在这里插入图片描述

5、分别在test和train下面运行split.py脚本

python .\split.py E:\DeviceData\deviceData_20201108_VOC\VOC\test\VOC2020
python .\split.py E:\DeviceData\deviceData_20201108_VOC\VOC\train\VOC2020

在这里插入图片描述

三、制作标准数据集txt文件

作者在github上声明,训练需要两个文件,如下所示:
dataset.txt:

xxx/xxx.jpg 18.19,6.32,424.13,421.83,20 323.86,2.65,640.0,421.94,20 
xxx/xxx.jpg 48,240,195,371,11 8,12,352,498,14
 image_path x_min, y_min, x_max, y_max, class_id  x_min, y_min ,..., class_id 
 make sure that x_max < width and y_max < height

class.names:

person
bicycle
car
...
toothbrush

1、生成dataset.txt

其实前几步都是为这两步做准备,通过目录下的 scripts/voc_annotation.py就可以生成dataset.txt文件,但是需要改一些代码参数:
1)只需更改 classes为自己的类别

classes = ['person', 'tv', 'laptop', 'tablet', 'cell phone']

2)default 更改为你自己的看注释

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    #default 更改为你自己数据集VOC的目录
    parser.add_argument("--data_path", default="E:/DeviceData/deviceData_20201108_VOC/VOC")
    parser.add_argument("--train_annotation", default="../data/dataset/voc_train.txt")
    parser.add_argument("--test_annotation",  default="../data/dataset/voc_test.txt")
    flags = parser.parse_args()

    if os.path.exists(flags.train_annotation):os.remove(flags.train_annotation)
    if os.path.exists(flags.test_annotation):os.remove(flags.test_annotation)

    #更改训练集和测试集的相对路径
    num1 = convert_voc_annotation(os.path.join(flags.data_path, 'train/VOC2020'), 'trainval', flags.train_annotation, False)
    num3 = convert_voc_annotation(os.path.join(flags.data_path, 'test/VOC2020'),  'trainval', flags.test_annotation, False)
    print('=> The number of image for train is: %d\tThe number of image for test is:%d' %(num1 , num3))

更改后运行该python文件:
在这里插入图片描述

在这里插入图片描述

这就生成了dataset.txt

2、更改voc.names的类别

在这里插入图片描述
修改为自己的类别:
在这里插入图片描述

3、修改配置文件

编辑您的文件./core/config.py以进行一些必要的配置

__C.YOLO.CLASSES                   = "./data/classes/voc.names"
__C.TRAIN.ANNOT_PATH               = "./data/dataset/voc_train.txt"
__C.TEST.ANNOT_PATH                = "./data/dataset/voc_test.txt"

四、训练数据

有多种方式
1)从头开始训练:

$ python train.py
$ tensorboard --logdir ./data

2)从COCO配置训练(推荐):

$ cd checkpoint
$ wget https://github.com/YunYang1994/tensorflow-yolov3/releases/download/v1.0/yolov3_coco.tar.gz
$ tar -xvf yolov3_coco.tar.gz
$ cd ..
// 训练之前需要将COCO权重转换成预训练模型
$ python convert_weight.py --train_from_coco
// 训练模型
$ python train.py

在这里插入图片描述

五、测试权重文件

训练完之后有多个权重文件,挑选其中的50作为测试权重。
在这里插入图片描述

1) 修改测试权重路径

编辑config.py中的__C.TEST.WEIGHT_FILE路径参数,将其改成我们测试的权重文件名
在这里插入图片描述

2)执行python evaluate.py测试测试集
在这里插入图片描述

3)执行python main.py -na生成测试报告

我的报错了,是因为我的类别中类别名(cell phone)有空格,需要把空格去掉
在这里插入图片描述
去到extra目录下,可执行python rename_class -c 旧类名 -n 新类名 通过改类名的方式去掉类名中的空格
在这里插入图片描述
再执行python main.py -na可以得到测试报告 mAP值

六、查看识别效果(video_demo)

1)修改类别数目
将video_demo.py中的 num_classes的值改为你的class.names文件中类别数,我的class.names文件包括5种类别,所以num_classes=5

2)修改freeze_graph.py文件(修改权重文件)
修改freeze_graph.py文件中的ckpt_file为自己训练的权重
在这里插入图片描述
运行freeze_graph.py
运行成功,并且可以看到.pb文件更新了:
如果不运行freeze_graph.py就执行video_demo.py会出现下面的这种情况。
在这里插入图片描述
3)执行python video_demo.py

在这里插入图片描述

  • 1
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要在Windows 10上使用TensorFlow训练自己的数据集,我们需要按照以下步骤进行操作: 1. 安装Python和TensorFlow:首先,确保你已经安装了Python和TensorFlow。你可以在Python官方网站下载Python,并使用pip命令安装TensorFlow。 2. 准备数据集:准备你的自定义数据集,并将其划分为训练集和验证集。确保数据集中包含图片和相应的标签文件。 3. 下载预训练模型权重:Yolov3是一个已经训练过的模型,你可以在互联网上找到与COCO数据集训练的预训练权重。下载这些权重文件以作为训练的起点。 4. 调整配置文件:在YOLOv3的配置文件中做一些必要的更改。指定你的类别数目、路径、学习率等参数。 5. 数据预处理:在开始训练之前,需要将数据集转换成Yolo V3所需的格式。可以使用相应的Python脚本完成这一步骤。 6. 训练模型:使用转换后的数据集和配置文件开始训练模型。这可以通过运行相应的训练命令来完成。 7. 评估和调整:训练完成后,可以使用验证集对模型进行评估,以评估其性能。根据结果,可以调整模型的参数或重新训练。 8. 推理和预测:训练完成后,模型可以用于进行推理和预测。可以使用训练好的模型权重文件对测试图片进行目标检测。 使用上述步骤,你应该能够在Windows 10上使用TensorFlow训练自己的数据集,并用YOLOv3模型进行目标检测。确保按照说明正确配置环境并按顺序执行每个步骤,以获得最佳结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值