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

本文详细介绍如何使用Keras-Yolo3进行数据集制作、代码修改及模型训练,包括搭建图片存储目录、标注图片、生成训练文件、配置参数、启动训练及模型预测全流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

1
1
1
1
【建立图片存放文件夹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$ 

2
2
2
2
【将自己要训练的图片放到JPEGImages文件夹下面】
我这里要训练的数据是检测出图片里面的信用卡logo,图片有两种,一种是带有光大信用卡logo的118张图片,一种是带有上海信用卡的161张图片,总共279张图片放到JPEGImages文件夹下面
在这里插入图片描述
在这里插入图片描述

3
3
3
3
【标注图片】
首先:在Ubuntu 18.04 安装labelImg
然后:使用label进行标注
安装和标注参见:Ubuntu 18.04 Linux安装labelImg的教程
说明:如果你看不懂上面连接的内容,你可以在评论区留下问题,我秒回
4
4
4
4
【生成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()

5
5
5
5
【生成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()


6
6
6
6
【修改参数文件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

7
7
7
7
【打开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
8
8
8
8
【启动开始训练】

python train.py

9
9
9
9
【使用训练模型进行预测】
训练结束之后,模型保存在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

10
10
10
10
【结果展示】
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值