首页 > 其他分享 >使用tensorflow1.12从零开始训练自己的yolo3

使用tensorflow1.12从零开始训练自己的yolo3

时间:2023-01-02 12:33:14浏览次数:187  
标签:yolo3 tensorflow1.12 huangjx train yolo VOCdevkit 从零开始 txt


有些步骤我不会解释为什么这么做,你只需要知道你这么做能得到什么就行,如果都要进行解释,一来你们不想看,二来有可能你根本就看不懂,,,,对于小白来说,我们都是懒人对吧,不懒的话你来看啥?(狗头护体)
​​​**本文介绍如何制作数据集、修改代码、不加载预权重从头跑自己的训练数据**​​ 【克隆代码】

git clone https://github.com/qqwweee/keras-yolo3


【建立图片存放文件夹VOCdevkit】

huangjx@u:~/Projects/keras-yolo3$ mkdir VOCdevkit
huangjx@u:~/Projects/keras-yolo3$ cd VOCdevkit/
huangjx@u:~/Projects/keras-yolo3/VOCdevkit$ mkdir VOC2007
huangjx@u:~/Projects/keras-yolo3/VOCdevkit$ cd VOC2007/
huangjx@u:~/Projects/keras-yolo3/VOCdevkit/VOC2007$ mkdir Annotations
huangjx@u:~/Projects/keras-yolo3/VOCdevkit/VOC2007$ mkdir ImageSets
huangjx@u:~/Projects/keras-yolo3/VOCdevkit/VOC2007$ mkdir JPEGImages
huangjx@u:~/Projects/keras-yolo3/VOCdevkit/VOC2007$ ll
总用量 20
drwxr-xr-x 5 huangjx huangjx 4096 6月 22 17:14 ./
drwxr-xr-x 3 huangjx huangjx 4096 6月 22 17:13 ../
drwxr-xr-x 2 huangjx huangjx 4096 6月 22 17:14 Annotations/
drwxr-xr-x 2 huangjx huangjx 4096 6月 22 17:14 ImageSets/
drwxr-xr-x 2 huangjx huangjx 4096 6月 22 17:14 JPEGImages/
huangjx@u:~/Projects/keras-yolo3/VOCdevkit/VOC2007$


【将自己要训练的图片放到JPEGImages文件夹下面】

我这里要训练的数据是检测出图片里面的信用卡logo,图片有两种,一种是带有光大信用卡logo的​​118张图片​​​,一种是带有上海信用卡的​​161张图片​​,总共279张图片放到JPEGImages文件夹下面

使用tensorflow1.12从零开始训练自己的yolo3_字符串


使用tensorflow1.12从零开始训练自己的yolo3_xml_02


【标注图片】
首先:在Ubuntu 18.04 安装labelImg
然后:使用label进行标注
安装和标注参见:​​Ubuntu 18.04 Linux安装labelImg的教程​​ 说明:如果你看不懂上面连接的内容,你可以在评论区留下问题,我秒回
【生成ImageSets/Main/4个文件】
在VOC2007文件夹下面新建文件gen.py,将下面的代码复制粘贴运行

import os
import random

trainval_percent = 0.1
train_percent = 0.9
xmlfilepath = 'Annotations'
txtsavepath = 'ImageSets\Main'
if not os.path.exists(txtsavepath):
os.mkdir(txtsavepath)
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)

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

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

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


【生成train.txt,val.txt,test.txt】
在kera-yolo3项目文件夹下面新建voc_gen.py文件,复制下面的代码然后进行一处修改然后运行。修改这里​​​classes = ['guangda', 'shagnhai'] # 我使用两个类别所以只有两种,字符串要跟你打标签的字符串一样。​​。运行完之后你会得到三个带有2007_前缀的文件夹,把前缀删除掉,得到三个文件train.txt,val.txt,test.txt,本步骤结束。

import xml.etree.ElementTree as ET
from os import getcwd

sets=[('2007', 'train'), ('2007', 'val'), ('2007', 'test')]

classes = ['guangda', 'shagnhai'] # 我使用两个类别所以只有两种,字符串要跟你打标签的字符串一样。


def convert_annotation(year, image_id, list_file):
in_file = open('VOCdevkit/VOC%s/Annotations/%s.xml'%(year, image_id))
tree=ET.parse(in_file)
root = tree.getroot()

for obj in root.iter('object'):
difficult = obj.find('difficult').text
cls = obj.find('name').text
if cls not in classes or int(difficult)==1:
continue
cls_id = classes.index(cls)
xmlbox = obj.find('bndbox')
b = (int(xmlbox.find('xmin').text), int(xmlbox.find('ymin').text), int(xmlbox.find('xmax').text), int(xmlbox.find('ymax').text))
list_file.write(" " + ",".join([str(a) for a in b]) + ',' + str(cls_id))

wd = getcwd()

for year, image_set in sets:
image_ids = open('VOCdevkit/VOC%s/ImageSets/Main/%s.txt'%(year, image_set)).read().strip().split()
list_file = open('%s_%s.txt'%(year, image_set), 'w')
for image_id in image_ids:
list_file.write('./VOCdevkit/VOC%s/JPEGImages/%s.jpg'%(year, image_id))
convert_annotation(year, image_id, list_file)
list_file.write('\n')
list_file.close()


【修改参数文件yolo3-tiny.cfg】
使用pycharm打开yolo3.cfg,ctrl+f查找’yolo’,你需要修改​​​两个yolo的三个地方​​,总共6个地方。

[convolutional]
size=1
stride=1
pad=1
filters=255 # 改这个,filters = 3*(5+len(classes))
activation=linear

[yolo]
mask = 6,7,8
anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326
classes=80 # 改这个,我是二分类,所以修改成classes=2
num=6
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=1 # 改这个, 显存少就改为random=0


【打开model_data,修改文件coco_classes.txt和voc_classes.txt】
因为我自己是只有两种类别,所以内容如下,两个文件内容一样

guangda
shanghai

【修改代码,准备训练】
我自己电脑显卡是1080ti的8G,所以折腾不了太大的网络,我选用较小的网络ting_yolo,并且batch设置成16,然后训练了70个epoch出来的结果。大概耗时一个小时。
修改train.py文件中的第20行代码为:
​​​anchors_path = 'model_data/tiny_yolo_anchors.txt'​

修改train.py文件中的第59行代码为:
​​​batch=16​

修改train.py文件中的第79行代码为:
​​​batch=16​

修改train.py文件中的第141行代码中的load_pretrained=True为:
​​​load_pretrained=False​​​ 
【启动开始训练】

python train.py


【使用训练模型进行预测】
训练结束之后,模型保存在logs/000/文件夹里面
修改yolo.py文件第24行"model_path": ‘model_data/yolo.h5’,为:
​​​"model_path": 'model_data/你自己模型保存的位置',​

修改yolo.py文件第25行"anchors_path": ‘model_data/yolo_anchors.txt’,’,为:
​​​"anchors_path": 'model_data/ting_yolo_anchors.txt'​

运行

python yolo_video.py


【结果展示】

使用tensorflow1.12从零开始训练自己的yolo3_tensorflow_03


使用tensorflow1.12从零开始训练自己的yolo3_tensorflow_04


使用tensorflow1.12从零开始训练自己的yolo3_xml_05


使用tensorflow1.12从零开始训练自己的yolo3_xml_06


使用tensorflow1.12从零开始训练自己的yolo3_tensorflow_07


使用tensorflow1.12从零开始训练自己的yolo3_xml_08

有疑问欢迎评论区见,秒回


标签:yolo3,tensorflow1.12,huangjx,train,yolo,VOCdevkit,从零开始,txt
From: https://blog.51cto.com/u_14825502/5983590

相关文章