Ph-one

这个教程是我在自己学习的过程中写的,当作一个笔记,写的比较详细
在github上下载yolov3的tensorflow1.0版本:
https://github.com/YunYang1994/tensorflow-yolov3
在19年12月,发现网上训练的教程大部分似乎已经过时了,因为作者对开源代码进行了部分修改
其实在作者的readme上已经写了训练的方法,但是不是那么详细,于是记录下
由于本人水平有限,如果文章有不当之处还望评论区指出

一,制作训练集

1,打标签
训练集需要实验labelimg工具进行制作,这里的数据集格式采用的是voc格式:
labelimg下载地址
实验labelimg打好标签后会生成两个文件夹:
Annotations —存放标记的图片
JPEGImages —存放xml格式的标签
这里不做多余的解释
2,按照voc数据集格式建立文件夹

因为作者给的模型是训练VOC数据集的模型,所以训练我们自己的数据集的时候也需要改为VOC格式的,VOC格式解析:
第一步:首先了解VOC2007数据集的格式

  1. 1)JPEGImages文件夹

文件夹里包含了训练图片和测试图片,混放在一起

  1. 2)Annatations文件夹

文件夹存放的是xml格式的标签文件,每个xml文件都对应于JPEGImages文件夹的一张图片

  1. 3)ImageSets文件夹

Action存放的是人的动作,我们暂时不用

Layout存放的人体部位的数据。我们暂时不用

Main存放的是图像物体识别的数据,分为20类,当然我们自己制作就不一定了,如果你有精力,Main里面有test.txt , train.txt, val.txt ,trainval.txt.这四个文件我们后面会生成
train中存放的是训练使用的数据,每一个class的train数据都有5717个。
val中存放的是验证结果使用的数据,每一个class的val数据都有5823个。
trainval为训练和验证的图片文件的文件名列表 。
Segmentation存放的是可用于分割的数据
如果你下载了VOC2007数据集,那么把它解压,把各个文件夹里面的东西删除,保留文件夹名字。如果没下载,那么就仿照他的文件夹格式,按照这个目录格式建立文件夹:
在这里插入图片描述
然后分别把标记的图片放入JPEGImages文件夹,标签xml文件放入Annotations文件夹:
在这里插入图片描述
在这里插入图片描述
3,划分训练集和测试集
训练时要有测试集和训练集,通过划分放在
VOCdevkit\VOC2008\ImageSets\Main
文件夹下,这里可以使用一段python代码按照9:1进行随机划分:
在VOC2008文件夹建立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()


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56

打开控制台,运行该python文件,后跟Annotation的目录即可进行划分:

python .\split.py F:\dateset\hat_data\VOC\test\VOCdevkit\VOC2007
  • 1

在这里插入图片描述
train为训练集,test为验证集
4,根据划分结果制作训练集
上面代码已经实现了将数据集划分为训练集和验证集,但是tensorflow yolov3作者写的模型要求的数据集格式为:

在这里插入图片描述
所以我们需要写一个小脚本,根据train.txt 和test.txt将数据集进行更改

import os
from shutil import copyfile
#根据tarin.txt和test.txt将数据集分为标准数据集
train_text_path = \'F:/dateset/hat_data/VOCdevkit/VOC2007/ImageSets/Main/train.txt\'
test_text_path = \'F:/dateset/hat_data/VOCdevkit/VOC2007/ImageSets/Main/test.txt\'
#图片存放地址
image_path = \'F:/dateset/hat_data/VOCdevkit/VOC2007/JPEGImages\'
#xml文件存放地址
xml_path = \'F:/dateset/hat_data/VOCdevkit/VOC2007/Annotations\'

#输出的目录
outdir = \'F:/dateset/hat_data\'
#创建各级文件夹
test_xml_out = os.path.join(outdir,\'VOC/test/VOCdevkit/VOC2007/Annotations\')
os.makedirs(test_xml_out)
os.makedirs(os.path.join(outdir,\'VOC/test/VOCdevkit/VOC2007/ImageSets/Layout\'))
os.makedirs(os.path.join(outdir,\'VOC/test/VOCdevkit/VOC2007/ImageSets/Main\'))
os.makedirs(os.path.join(outdir,\'VOC/test/VOCdevkit/VOC2007/ImageSets/Segmentation\'))
test_img_out = os.path.join(outdir,\'VOC/test/VOCdevkit/VOC2007/JPEGImages\')
os.makedirs(test_img_out)
os.makedirs(os.path.join(outdir,\'VOC/test/VOCdevkit/VOC2007/SegmentationClass\'))
os.makedirs(os.path.join(outdir,\'VOC/test/VOCdevkit/VOC2007/SegmentationObject\'))
train_xml_out = os.path.join(outdir,\'VOC/train/VOCdevkit/VOC2007/Annotations\')
os.makedirs(train_xml_out)
os.makedirs(os.path.join(outdir,\'VOC/train/VOCdevkit/VOC2007/ImageSets/Layout\'))
os.makedirs(os.path.join(outdir,\'VOC/train/VOCdevkit/VOC2007/ImageSets/Main\'))
os.makedirs(os.path.join(outdir,\'VOC/train/VOCdevkit/VOC2007/ImageSets/Segmentation\'))
train_img_out = os.path.join(outdir,\'VOC/train/VOCdevkit/VOC2007/JPEGImages\')
os.makedirs(train_img_out)
os.makedirs(os.path.join(outdir,\'VOC/train/VOCdevkit/VOC2007/SegmentationClass\'))
os.makedirs(os.path.join(outdir,\'VOC/train/VOCdevkit/VOC2007/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(

分类:

技术点:

相关文章:

  • 2022-01-14
  • 2021-10-12
  • 2022-12-23
  • 2021-09-06
  • 2021-11-29
  • 2022-02-02
猜你喜欢
  • 2021-06-20
  • 2021-10-12
  • 2021-07-27
  • 2023-01-17
  • 2021-10-10
  • 2021-07-25
  • 2021-06-06
相关资源
相似解决方案