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. C#用正则表达式替换手机中间几位为*号 代码及解析

    /// <summary> /// 替换手机号中间四位为* /// </summary> /// <param name="phoneNo">& ...

  2. mysql 没有全外连接

    真实测试过,没有测试过的别再坑人了.别随便乱写了.

  3. dp背包问题

    0-1背包 1.问题定义: 给定n种物品和背包.物品i的重量是wi,价值是vi,每种物品只有一个,背包容量为C.问:应该如何选择装入背包的物品,使得装入背包中的物品总值最大. 2.算法思路: 选择装入 ...

  4. qtp中type方法的按键常量

    记录键盘操作可以用set和presskey方法,而type方法是不记录的.type方法主要用于输入连接文本字符串和键盘修饰键(组合键),组合键之间用&符号. 如:JavaWindow(&quo ...

  5. EasyUI 中 Combobox里的onChange和onSelect事件的区别

    EasyUI 中 Combobox 选项发生改变时会触发 onChange,onSelect,onClick 3 个事件. 最近要做一个级联的 Combo 菜单,类似于选择地址时让用户填写省,市,区的 ...

  6. PHP设置凌晨时间戳

    这种需求应是很常见的,但一直没有时间整理. 一天可以领取2次奖励,今天领完了那就等明天再来. 这里面涉及到一个很重要的一点就是凌晨12点的时间戳,以前一直在前端去做判断.最近发现在后端用PHP获取凌晨 ...

  7. asp.netmvc部署到linux(centos)

    介绍将asp.netmvc项目部署到centos系统. 开发工具:win10+vs2017+.NetFramework4.6.1+Vmware14+centos 1.安装Jexus 这里使用独立版(专 ...

  8. Promise 错误处理

    Promise 是一个异步返回单个结果的函数或方法 不使用  `catch()` 时,在  `success handler` 里的错误无法被捕捉到 使用  `catch()` 时,在  `succe ...

  9. PHP调用Python接口过程中所遇到的问题

    在php调用python脚本时,首先把python相关组件安装完善.用Python命令检测运行脚本而不报错. 在调用接口的过程 1.没有打开的python脚本的权限 解决办法:把python脚本所在的 ...

  10. java AQS(AbstractQueuedSynchronizer)同步器详解

    除了内置锁(synchronized)外,java AQS(AbstractQueuedSynchronizer)同步器几乎是所有同步容器,同步工具类的基础.ReentrantLock.Reentra ...