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. 数据结构与算法之PHP排序算法(桶排序)

    一.基本思想 桶排序是将待排序的数据分割成许多buckets,然后每个bucket各自排序,或用不同的排序算法,或者递归的使用bucket sort算法.也是典型的分而治之(divide-and-co ...

  2. Delphi 数据导出到Excel

    好多办公软件特别是财务软件,都需要配备把数据导出到Excel,下面就来介绍两种数据导出方法 1.ADODB导出查询结果(此方法需要安装Excel) 2.二维表数据导出(根据Excel文件结构生成二进制 ...

  3. 用docker搭建python项目运行环境

    Docker Hub镜像加速器 安装docker: curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-eng ...

  4. tinyproxy代理配置

    tinyproxy代理配置 应用场景: 生产机处于内网,无法直接访问外网,程序安装和漏洞修复等操作需要进行联网操作:通过在办公网(可访问外网)上设置代理服务器,生产机通过代理由办公网访问外网 代理服务 ...

  5. from jobscrawler_qianchengwuyou.items import JobscrawlerQianchengwuyouItem

    -- coding: utf-8 -- import scrapy from jobscrawler_qianchengwuyou.items import JobscrawlerQianchengw ...

  6. 命令行运行Android Robotium自动化用例或单元测试用例

    本文目录 1.运行所有的测试用例 2.运行单个测试类或某个TestSuite 3.运行某个测试类里面的某个测试方法 4.运行两个不同的测试类或类中的方法 命令行运行Android Robotium自动 ...

  7. 阿里云oss c# api 的使用 的使用

    API 文档下载地址:http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/attach/32085/cn_zh/1515493045734 ...

  8. Spark Streaming的容错和数据无丢失机制

    spark是迭代式的内存计算框架,具有很好的高可用性.sparkStreaming作为其模块之一,常被用于进行实时的流式计算.实时的流式处理系统必须是7*24运行的,同时可以从各种各样的系统错误中恢复 ...

  9. Ubuntu下安装git

    1 安装 官网上提供的命令是: $ sudo add-apt-repository ppa:git-core/ppa 中间暂停时,按回车键Enter继续安装. $ sudo apt-get updat ...

  10. Vue语法学习第三课——计算属性

    模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护.对于任何复杂逻辑,都应当使用计算属性. <div id="example&qu ...