1.  下载预训练权重文件

YOLOv3使用在Imagenet上预训练好的模型参数(文件名称: darknet53.conv.74,大小76MB)基础上继续训练。

darknet53.conv.74下载链接:  https://pjreddie.com/media/files/darknet53.conv.74,下载完成后放在darknet主目录。

也可以直接在darknet目录下通过wget命令下载:

wget https://pjreddie.com/media/files/darknet53.conv.74

2.  准备打标工具并对自己的图片数据打标

打标工具推荐使用 labelImg,下载地址:https://github.com/tzutalin/labelImghttp://download.csdn.net/download/dcrmg/9974195

labelImg使用很简单,在图片的物体上画框然后给一个标签就可以了,打标结果的保存格式是xml文件。

例如对于train1.jpg,打标结果保存为train1.xml

3.  xml标签文件格式转换

YOLO训练的标签文件是txt格式,需要把第2步中的xml文件转换。

  • 1) 在darknet主目录下创建4个文件夹: trainImage、validateImage、trainImageXML 和 validateImageXML,并分别存放第2步中的训练集图片、验证集图片、训练集xml标签和验证集xml标签
  • 2) 借助createID.py生成训练集和验证集的图片名称列表trainImageId.txt和validateImageId.txt。

createID.py 代码:

# -*- coding: utf-8 -*-
import os;
import shutil; def listname(path,idtxtpath):
filelist = os.listdir(path); # 该文件夹下所有的文件(包括文件夹)
filelist.sort()
f = open(idtxtpath, 'w');
for files in filelist: # 遍历所有文件
Olddir = os.path.join(path, files); # 原来的文件路径
if os.path.isdir(Olddir): # 如果是文件夹则跳过
continue;
f.write(files);
f.write('\n');
f.close(); savepath = os.getcwd()
imgidtxttrainpath = savepath+"/trainImageId.txt"
imgidtxtvalpath = savepath + "/validateImageId.txt"
listname(savepath + "/trainImage",imgidtxttrainpath)
listname(savepath + "/validateImage",imgidtxtvalpath)
print "trainImageId.txt && validateImageId.txt have been created!"

3) 借助trans.py生成训练集和验证集的完整路径列表并完成标签xml文件到txt文件的转换

  trans.py代码

import xml.etree.ElementTree as ET
import pickle
import string
import os
import shutil
from os import listdir, getcwd
from os.path import join
import cv2 sets=[('2012', 'train')] classes = ["class1","class2","class3","class4"] def convert(size, box):
dw = 1./size[0]
dh = 1./size[1]
x = (box[0] + box[1])/2.0
y = (box[2] + box[3])/2.0
w = box[1] - box[0]
h = box[3] - box[2]
x = x*dw
w = w*dw
y = y*dh
h = h*dh
return (x,y,w,h) def convert_annotation(image_id,flag,savepath): if flag == 0:
in_file = open(savepath+'/trainImageXML/%s.xml' % (os.path.splitext(image_id)[0]))
out_file = open(savepath+'/trainImage/%s.txt' % (os.path.splitext(image_id)[0]), 'w')
tree = ET.parse(in_file)
root = tree.getroot()
size = root.find('size') img = cv2.imread('./trainImage/'+str(image_id))
h = img.shape[0]
w = img.shape[1] elif flag == 1:
in_file = open(savepath+'/validateImageXML/%s.xml' % (os.path.splitext(image_id)[0]))
out_file = open(savepath+'/validateImage/%s.txt' % (os.path.splitext(image_id)[0]), 'w') tree = ET.parse(in_file)
root = tree.getroot()
size = root.find('size') img = cv2.imread('./validateImage/' + str(image_id))
h = img.shape[0]
w = img.shape[1] 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 = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))
bb = convert((w,h), b)
out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n') wd = getcwd() for year, image_set in sets:
savepath = os.getcwd();
idtxt = savepath + "/validateImageId.txt";
pathtxt = savepath + "/validateImagePath.txt";
image_ids = open(idtxt).read().strip().split()
list_file = open(pathtxt, 'w')
s = '\xef\xbb\xbf'
for image_id in image_ids:
nPos = image_id.find(s)
if nPos >= 0:
image_id = image_id[3:]
list_file.write('%s/validateImage/%s\n' % (wd, image_id))
print(image_id)
convert_annotation(image_id, 1, savepath)
list_file.close() idtxt = savepath + "/trainImageId.txt";
pathtxt = savepath + "/trainImagePath.txt" ;
image_ids = open(idtxt).read().strip().split()
list_file = open(pathtxt, 'w')
s = '\xef\xbb\xbf'
for image_id in image_ids:
nPos = image_id.find(s)
if nPos >= 0:
image_id = image_id[3:]
list_file.write('%s/trainImage/%s\n'%(wd,image_id))
print(image_id)
convert_annotation(image_id,0,savepath)
list_file.close()

注意: 需要根据自己的类别更改trans.py文件第12行的classes,有几个类别写几个。

执行之后在darknet主目录下生成trainImagePath.txt、validateImagePath.txt和所有的txt标注文件。

4. 修改配置文件

  • 1) 修改data/voc.names 文件

把 voc.names文件内容改成自己的分类,例如有3个分类class_1,class_2,class_3,则voc.names内容改为:

      class_1

      class_2

      class_3

  • 2) 修改cfg/voc.data文件

根据自己的实际情况做以下修改:

   classes = N       #(N为自己的分类数量,如有10类不同的对象,N = 10)

   train = /home/XXX/darknet/trainImagePath.txt    # 训练集完整路径列表

   valid = /home/XXX/darknet/validateImagePath.txt   # 测试集完整路径列表

   names = data/voc.names    # 类别文件

   backup = backup     #(训练结果保存在darknet/backup/目录下)

  • 3) 修改cfg/yolov3-voc.cfg 文件

1. classes = N (N为自己的分类数)

   2. 修改每一个[yolo]层(一共有3处)之前的filters为 3*(classes+1+4),如有3个分类,则修改 filters = 24

   3. (可选) 修改训练的最大迭代次数, max_batches = N

5. YOLOv3训练

./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74

训练完成后结果文件 ‘yolov3-voc_final.weights’ 保存在 backup文件中。

6. 自训练模型测试

./darknet detector test cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc_final.weights 01.jpg

YOLOv3训练自己的数据的更多相关文章

  1. 利用YOLOV3训练自己的数据

    写在前面:YOLOV3只有修改了源码才需要重新make,而且make之前要先make clean. 一.准备数据 在/darknet/VOCdevkit1下建立文件夹VOC2007. voc2007文 ...

  2. YOLOv3:训练自己的数据(附优化与问题总结)

    环境说明 系统:ubuntu16.04 显卡:Tesla k80 12G显存 python环境: 2.7 && 3.6 前提条件:cuda9.0 cudnn7.0 opencv3.4. ...

  3. Win10中用yolov3训练自己的数据集全过程(VS、CUDA、CUDNN、OpenCV配置,训练和测试)

    在Windows系统的Linux系统中用yolo训练自己的数据集的配置差异很大,今天总结在win10中配置yolo并进行训练和测试的全过程. 提纲: 1.下载适用于Windows的darknet 2. ...

  4. yolov3测试自己的数据

    yolov3测试自己的数据 前言 上一篇我已经介绍了利用yolov3预训练权重文件(只包含卷积层)并训练 只需要进行如下编译: ./darknet detector train cfg/voc.dat ...

  5. faster r-cnn 在CPU配置下训练自己的数据

    因为没有GPU,所以在CPU下训练自己的数据,中间遇到了各种各样的坑,还好没有放弃,特以此文记录此过程. 1.在CPU下配置faster r-cnn,参考博客:http://blog.csdn.net ...

  6. smallcorgi/Faster-RCNN_TF训练自己的数据

    熟悉了github项目提供的训练测试后,可以来训练自己的数据了.本文只介绍改动最少的方法,只训练2个类, 即自己添加的类(如person)和 background,使用的数据格式为pascal_voc ...

  7. pytorch识别CIFAR10:训练ResNet-34(数据增强,准确率提升到92.6%)

    版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:460356155@qq.com 在前一篇中的ResNet-34残差网络,经过减小卷积核训练准确率提升到85%. 这里对训练数据集做数据 ...

  8. caffe 用faster rcnn 训练自己的数据 遇到的问题

    1 . 怎么处理那些pyx和.c .h文件 在lib下有一些文件为.pyx文件,遇到不能import可以cython 那个文件,然后把lib文件夹重新make一下. 遇到.c 和 .h一样的操作. 2 ...

  9. caffe 如何训练自己的数据图片

    申明:此教程加工于caffe 如何训练自己的数据图片 一.准备数据 有条件的同学,可以去imagenet的官网http://www.image-net.org/download-images,下载im ...

随机推荐

  1. 获得ztree的所有子节点id

    var treeNodeIds="";//获得所有树节点的id function aa(){ var treeObj = $.fn.zTree.getZTreeObj(" ...

  2. WPF程序打包发布

    1.新建安装项目: 新建项目——其他项目类型——安装与部署——InstallShield Limited Edition Project 2.配置安装信息: 选择Project Assistant进入 ...

  3. Python3+Scapy安装使用教程

    一.说明 之前写DoS程序的时候(见"拒绝服务(DoS)理解.防御与实现"),数据包完全是自己构造的,这其中的难处一是要清楚各层协议的字段.字段长度.字段是数值还是字符.大头还是小 ...

  4. gitlab安装随记

    gitlab安装 配置yum源 sudo vim /etc/yum.repos.d/gitlab-ce.repo 按照网上别人的例子,修改为清华的源 [gitlab-ce] name=Gitlab C ...

  5. 【基础】使用cookies,实现免登陆(七)

    实现过程: 1.测试网站:www.dx.com 2.登陆后的cookies:"DXSSO","Token=20A0FA7D-XXXX-XXXX-XXXX".至于 ...

  6. array_diff()

    array_diff()函数定义和用法 array_diff() 函数返回两个数组的差集数组.该数组包括了所有在被比较的数组中,但是不在任何其他参数数组中的键值. 在返回的数组中,键名保持不变. 提示 ...

  7. 软件151 王楚博 maven的导入

    一.maven 包的导入 清单如下: <!-- Inherit defaults from Spring Boot --> <parent> <groupId>or ...

  8. 【Alpha】事后分析

    Alpha阶段终于告一段落,我们的团队也完整经历了从提出设想.用户需求分析,到开发.测试,再到部署上线.推广的流程."葫芦娃不想写代码"团队还是较出色地完成了Alpha阶段的工作, ...

  9. C# foreach 值类型及引用类型迭代变量改变的方式

    C#中foreach不能改变迭代变量的值 然而此种说法只适用与值类型,更改值类型时会改变在栈上的内存分布 引用类型由于是引用地址的变更,不影响内存分布,所以能够在foreach中更改 至于引用类型中的 ...

  10. redis应用--HyperLogLog

    如果你负责开发维护一个大型的网站,有一天老板找产品经理要网站每个网页每天的 UV 数据,然后让你来开发这个统计模块,你会如何实现? 如果统计 PV 那非常好办,给每个网页一个独立的 Redis 计数器 ...