工具:labelimg、MobaXterm

1.标注自己的数据集。用labelimg进行标注,保存后会生成与所标注图片文件名相同的xml文件,如图。我们标注的是井盖和路边栏,名称分了NoManholeCover、ManholeCover、WarningStick共3类标签名

2.下载yolov3项目工程。按照YoLo官网下载

  1. git clone https://github.com/pjreddie/darknet
  2. cd darknet
  3. make

3.修改Makefile文件(文件就在下载的darknet文件夹内)

vi Makefile #打开文件

  1. GPU=1#使用GPU训练,其他的没有用,所以没有置为1,可根据自己的需要调整
  2. CUDNN=0
  3. OPENCV=0
  4. OPENMP=0
  5. DEBUG=0

make #保存并退出后,进行make才可生效,如果出现错误,自行百度。

3.准备数据集。在darknet/scripts文件夹下创建文件夹VOCdevkit(因为scripts文件夹下有voc_label.py文件,它的作用下面会说,下面创建的文件也跟它有关),根据下图在VOCdevkit文件夹下创建文件,并放入相应的数据

  1. VOCdevkit
  2. ——VOC2007 #文件夹的年份可以自己取,但是要与你其他文件年份一致,看下一步就明白了
  3. ————Annotations #放入所有的xml文件
  4. ————ImageSets
  5. ——————Main #放入train.txt,val.txt文件
  6. ————JPEGImages #放入所有的图片文件
  7. Main中的文件分别表示test.txt是测试集,train.txt是训练集,val.txt是验证集,trainval.txt是训练和验证集,反正我只建了两个

注意:Linux环境下Annotations和IPEGImages中的文件权限一定是-rw-r--r--,不然会影响模型准确率!!!

其中Main中的txt文件是要写文件名,比如train.txt里写的是用来训练的图片的文件名(不包含后缀,只是文件名哦!!!),这个文件可以找代码生成(下面的python代码可以用),代码的话看懂他的作用,特别的文件的路径之类的,根据自己的情况修改下,就可以用

import os

import random

train_percent = 0.50

xmlfilepath = 'Annotations'

txtsavepath = 'ImageSets\Main'

total_xml = os.listdir(xmlfilepath)

num=len(total_xml)

list=range(num)

tr=int(num*train_percent)

train=random.sample(list,tr)

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 train:

ftrain.write(name)

else:

fval.write(name)

ftrain.close()

fval.close()

print ("finished")

5.修改voc_label.py,这个文件就是根据Main中txt里的文件名,生成相应的txt,里面存放的是它们的路径

  1. sets=[('2007', 'train'), ('2007', 'val')] #这里要与Main中的txt文件一致
  2. classes = ["ManholeCover","NoManholeCover","WarningStick"] #你所标注的表签名,第一步中已经说过
  3. #os.system("cat 2007_train.txt 2007_val.txt > train.txt") #文件最后一句,意思是要将生成的文件合并,所以很据需要修改,这里的年份都是一致的,简单理解下代码应该会懂,不要盲目修改

python voc_label.py #保存后运行

运行后会生成2007_train.txt、2007_val.txt如图

6.下载Imagenet上预先训练的权重,放到scripts目录下

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

7.修改cfg/voc.data,重命名为voc-cover.data

  1. classes= 3#classes为训练样本集的类别总数,第一步中说了我分了5类标签
  2. train = /darknet/scripts/2007_train.txt #train的路径为训练样本集所在的路径,上一步中生成
  3. valid = /darknet/scripts/2007_val.txt #valid的路径为验证样本集所在的路径,上一步中生成
  4. names = data/voc-cover.names #names的路径为data/voc-cover.names文件所在的路径
  5. backup = backup

8.修改data/voc.names,重命名为voc-cover.names

  1. NoManholeCover
  2. ManholeCover
  3. WarningStick
  4. #修改为自己样本集的标签名即第一步中标注的标签名

9.修改cfg/yolov3-voc-cover.cfg

  1. [net]
  2. # Testing
  3. # batch=1 #这里的batch跟subdivisions原来不是注释掉的,但是训练后没成功,有的blog上说为1的时候太小难以收敛,但是不知道下面训练模式的 batch=64 subdivisions=8 会不会覆盖掉,总之注释掉后就成功了,不过这个脚本不是很明白,还来不及验证
  4. # subdivisions=1
  5. # Training
  6. batch=64
  7. subdivisions=8
  8. ......
  9. [convolutional]
  10. size=1
  11. stride=1
  12. pad=1
  13. filters=24#---------------修改为3*(classes+5)即3*(3+5)=24
  14. activation=linear
  15. [yolo]
  16. mask = 6,7,8
  17. anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326
  18. classes=3#---------------修改为标签类别个数,5类
  19. num=9
  20. jitter=.3
  21. ignore_thresh = .5
  22. truth_thresh = 1
  23. random=0#1,如果显存很小,将random设置为0,关闭多尺度训练;(转自别的blog,还不太明白)
  24. ......
  25. [convolutional]
  26. size=1
  27. stride=1
  28. pad=1
  29. filters=24#---------------修改同上
  30. activation=linear
  31. [yolo]
  32. mask = 3,4,5
  33. anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326
  34. classes=3#---------------修改同上
  35. num=9
  36. jitter=.3
  37. ignore_thresh = .5
  38. truth_thresh = 1
  39. random=0
  40. ......
  41. [convolutional]
  42. size=1
  43. stride=1
  44. pad=1
  45. filters=24#---------------修改同上
  46. activation=linear
  47. [yolo]
  48. mask = 0,1,2
  49. anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326
  50. classes=3#---------------修改同上
  51. num=9
  52. jitter=.3
  53. ignore_thresh = .5
  54. truth_thresh = 1
  55. random=1

10.开始训练

  1. ./darknet detector train cfg/voc-cover.data cfg/yolov3-voc-cover.cfg scripts/darknet53.conv.74 -gpus 0,1
  2. #注意文件路径
  3. 训练默认的是前1000轮每100轮保存一次模型,1000轮后每10000轮保存一次模型。可以修改examples/detector.c文件的138行。修改完重新编译一下,在darknet目录下执行make

11.测试识别。训练后会在backup文件夹下生成权重文件,利用生成的权重文件进行测试

./darknet detector test cfg/voc-cover.data cfg/yolov3-voc-cover.cfg backup/yolov3-voc_600.weights data/210.jpg

以上对于一些文件的理解也是多次失败的收获,可能并不全对,有误请指正,遇到问题也可以交流。

DarkNet的Python接口:

注意使用Python测试的时候必须要有GPU和安装好cuda驱动,因为作者提供的Python的接口只有GPU调用函数

作者给出的使用的Demo为:

```python

# Stupid python path shit.

# Instead just add darknet.py to somewhere in your python path

# OK actually that might not be a great idea, idk, work in progress

# Use at your own risk. or don't, i don't care

import sys, os

sys.path.append(os.path.join(os.getcwd(),'python/'))

import darknet as dn

import pdb

dn.set_gpu(0)

net = dn.load_net("cfg/yolo-thor.cfg", "/home/pjreddie/backup/yolo-thor_final.weights", 0)

meta = dn.load_meta("cfg/thor.data")

r = dn.detect(net, meta, "data/bedroom.jpg")

print r

# And then down here you could detect a lot more images like:

r = dn.detect(net, meta, "data/eagle.jpg")

print r

r = dn.detect(net, meta, "data/giraffe.jpg")

print r

r = dn.detect(net, meta, "data/horses.jpg")

print r

r = dn.detect(net, meta, "data/person.jpg")

print r

```

我们不难看出除了系统模块之外,只调用了darknet.py模块,存放在工程的python目录里。

但darknet.py中有一些路径是软地址要改一下(在47行中,仿照着注释的格式):

```python

#lib = CDLL("/home/lishukang/darknet/libdarknet.so", RTLD_GLOBAL)

lib = CDLL("libdarknet.so", RTLD_GLOBAL)

```

但这个模块是基于Python2编写,如果直接使用Python2运行的话还会有一些包存在路径问题,哪我们不如将他稍微修改一下:

在154行,即最后一行中,print需要加上括号

```python

print (r)

```

这样,我们在工程目录下进行模块导入就没有任何问题了。

我们仿照着把配置文件路径和要测试的图片地址改好就可以了。比如我的:

```python

In [10]: dn = set_gpu(0)

...: net = dn.load_net("cfg/yolov3.cfg", "/home/lishukang/darknet/backup/yolov3_400.weights", 0)

...: meta = dn.load_meta("cfg/number.data")

...: r = dn.detect(net, meta, "zhebing/pic/20171105_636454947681503257_P.jpg")

...: print (r)

```

就可以显示出测试图像啦。

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

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

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

  2. 第十一节,利用yolov3训练自己的数据集

    1.环境配置 tensorflow1.12.0 Opencv3.4.2 keras pycharm 2.配置yolov3 下载yolov3代码:https://github.com/qqwweee/k ...

  3. Win7+keras+tensorflow使用YOLO-v3训练自己的数据集

    一.下载和测试模型 1. 下载YOLO-v3 git clone https://github.com/qqwweee/keras-yolo3.git 这是在Ubuntu里的命令,windows直接去 ...

  4. Ubuntu16.04中用yolov3训练自己的数据集

    一.配置yolo v3 参考yolo v3官网https://pjreddie.com/darknet/yolo/ 下载darknet后进行编译: git clone https://github.c ...

  5. 如何使用yolov3训练自己的数据集

    博客主要结构 1. 如何在ubuntu18.04上安装yolo 2 .如何配置yolov3 3 .如何制作自己的训练集测试集 4 .如何在自己的数据集上运行yolov3 1. 在ubuntu18.04 ...

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

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

  7. 使用yolo3模型训练自己的数据集

    使用yolo3模型训练自己的数据集 本项目地址:https://github.com/Cw-zero/Retrain-yolo3 一.运行环境 1. Ubuntu16.04. 2. TensorFlo ...

  8. 【Tensorflow系列】使用Inception_resnet_v2训练自己的数据集并用Tensorboard监控

    [写在前面] 用Tensorflow(TF)已实现好的卷积神经网络(CNN)模型来训练自己的数据集,验证目前较成熟模型在不同数据集上的准确度,如Inception_V3, VGG16,Inceptio ...

  9. YOLOv3训练自己的数据

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

随机推荐

  1. Python中使用多进程来实现并行处理的方法小结

    进程和线程是计算机软件领域里很重要的概念,进程和线程有区别,也有着密切的联系,先来辨析一下这两个概念: 1.定义 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和 ...

  2. Kafka如何彻底删除topic及数据

    前言:删除kafka topic及其数据,严格来说并不是很难的操作.但是,往往给kafka 使用者带来诸多问题.项目组之前接触过多个开发者,发现都会偶然出现无法彻底删除kafka的情况.本文总结多个删 ...

  3. 常用且难记的一些css

    1.多行文字超出隐藏,自动追加 ... 移动端兼容更好,pc下只能兼容 Safari.Opera 以及 Chrome 等部分浏览器,挺常用. (注:为什么要同时加这几个css不在这里详细叙述,详见) ...

  4. chrome window 下的所有key josn

    ["postMessage","blur","focus","close","parent",&qu ...

  5. Oracle数据库:ORA-54013错误解决办法

    ORA-54013: 不允许对虚拟列执行 INSERT 操作 这是Oracle 11 的新特性 —— 虚拟列. 在以前的Oracle 版本,当我们需要使用表达式或者一些计算公式时,我们会创建数据库视图 ...

  6. HTTPS协议学习

    http的缺点:(其他一些未加密的协议中也存在) 通信使用明文(不加密),内容可能会被窃听 不验证通信方的身份,因此有可能遭遇伪装 无法证明报文的完整性,所以有可能已遭篡改 TCP/IP是可能被窃听的 ...

  7. UT源码105032014093

    需求描述: 设计佣金问题的程序 commission方法是用来计算销售佣金的需求,手机配件的销售商,手机配件有耳机(headphone).手机壳(Mobile phone shell).手机贴膜(Ce ...

  8. [noip2016]洛谷2827

    来一发文字证明~ 数据范围很大... 如果用priority_queue搞的话肯定是会t的. 所以肯定要想一想优化的思路. 我们发现,对于队列来讲,同加,减是不改变这个队列的大小关系的: 但是呢,切开 ...

  9. 使用nginx mirror 制作nexus 的简单ha

      主要是运行两台nexus 机器,通过nexus 的host 以及proxy 以及public 模型,结合nginx 的mirror 将对于host 的get 请求 mirror 到另一台机器pro ...

  10. Firebird Embedded 部署的一个坑

    今天把旧程序升级了,把DBX组件换成了FireDac组件,在虚拟机里测试的时候,一直报上图中的错误,但是在主机上运行无问题,之前用户使用也一直没报过这个错. 折腾了又折腾,还是搞不定,感觉脑袋有点大了 ...