博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
真正超详细手把手用YOLOv3训练自己的数据集实战过程记录(Ubuntu18.04)
阅读量:2055 次
发布时间:2019-04-28

本文共 5620 字,大约阅读时间需要 18 分钟。

最近还有项目是多目标跟踪,所以开始接触目标检测器,那就从最普遍的YOLOV3开始。无奈网上教程参差不齐,甚至有大段大段的错误,以及大段大段的省略,估计这就是大佬效应吧,因为觉得有些过程太过理所应当,所以就省略了。

这篇文章非常详细地介绍了整个过程,基本做到了每个细节都写清楚,希望对像我这样的小白能有帮助。
基础的YOLO知识,计划在之后整理,这里就写一下代码过程。

软硬件环境:

python 3.6.5
Ubuntu18.04 LTS
PyTorch 1.1.0
CUDA 10.0
cudnn 7.5.0
GPU: NVIDIA TITAN XP

准备数据集

第一步就是准备一个目标检测的数据集,这个数据集可以使用官方提供的,感觉下载也可以自己制作,这里我使用的数据集是,进入页面下载后解压就行。

尽管使用的别人的数据集,我还是下载了labelImg,ubuntu版本的官方下载地址:
具体的过程按照官方教程即可,我放在下面:

sudo apt-get install pyqt5-dev-toolssudo pip3 install -r requirements/requirements-linux-python3.txtmake qt5py3python3 labelImg.py

:如果在执行第二步的之后如果出现sudo: pip3: command not found,可以参考我上一篇文章:

之后会打开一个界面
在这里插入图片描述具体的标注过程在这里我就不再赘述,可以参考一些其他文章。

获取源码并编译

1.官方代码下载地址:

当然,你也可以采用:

git clone https://github.com/pjreddie/darknet

我采用第一种,下载完毕后,看到压缩包,右键“Extract here"

2. 现在开始编译:

cd darknetsudo gedit  Makefile

打开后,根据自己的需求修改文件夹,因为我用GPU,所以修改为GPU=1,CUDNN=1,OPENCV我设为0,因为我不使用摄像头。

make

接着用make命令进行编译,出现以下界面,编译成功:

实验数据集整理和准备

解压后得到的文件中含有两个文件夹——Annotations和JPEGImages

  1. 到刚解压了的darknet-master文件夹下建立一个文件夹,命名为VOCdekit,再在VOCdekit文件夹下建立一个VOC2007,把AnnotationsJPEGImages放在VOC2007下,并在VOC2007文件夹中再建立一个ImageSets,此时VOC2007中一共有三个文件夹,分别是Annotations,ImageSets以及JPEGImage。在ImageSets下建立一个Main文件夹。
  2. 刚才建立这么多文件夹,解释一下它们要做的事:VOC2007建立,因为要制作VOC2007格式的数据集,源码中的路径命名都是按照这样的格式来的。那么在VOC2007中的Annotations又有什么用?它是为存放xml格式的标签文件的,也就是你刚才用Labelmg制作的标签文件,里面保存了每张图片的尺寸、物体类别、boundingbox等等信息,每一张xml文件都对应了JPEGImages中的一张图片。JPEGImages自然而然就是存放数据集图片的文件夹,也就是你自己收集的训练和测试图片。ImageSets里面本来时包含了三个文件夹的,但是我们只强调存放图像数据的Main文件,这个Main文件存着训练、测试和验证集的图片名称,也就是起到分割三个集的作用。
  3. 在VOC2007下建立一个test.py文件,将以下代码拷进去
import osimport randomtrainval_percent = 0.1train_percent = 0.9xmlfilepath = 'Annotations'txtsavepath = 'ImageSets\Main'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()

成功后会看到Main文件夹下多了四个txt文件:

在这里插入图片描述

加入自己的数据集

  1. 在darknet文件夹内打开终端,
wget https://pjreddie.com/media/files/voc_label.py

下载得很快,打开,修改一下:

(1)sets部分,把有(‘2012’)的删去
(2)classes保存自己要检测的类别即可,我用的数据集只有一个类别,所以就只写了“RBC”
2. 在终端输入

python voc_label.pycat 2007_train.txt 2007_val.txt  > train.txt

结束后,应该会发现,出现三个txt文件2007_train.txt,2007_val.txt,2007_test.txt,这是真正有用的三个文件。

修改配置

  1. cfg下创建cell.data,这里说一下两种创建data文件的方法(会的可以跳到下一步)
    (1)data文件夹中本来就有一大堆data文件,复制其中一个,改一下名字,改一下内容即可
    (2)右键新建一个doc文档,后右键“properties”,出来以下界面, 把后缀docx改为data即可。
    在这里插入图片描述
  2. data目录下创建cell.names,按创建data文件的方法创建即可,创建完成后双击,在空白页面中添加“RGB”即可,输入内容就是你需要检测的类别名,我这里只检测RGB,所以只写了RGB。
  3. 这个data文件主要记录数据集的情况,具体的修改方法如下:
classes=
<你需要检测的类别数量>
train = <2007_train.txt 文件所在的位置>valid = <2007_test.txt/2007_valid.txt 文件所在位置,这不太重要>names =
backup =

例如,我的例子中,我这样写的:

classes=1train=/home/user/Downloads/darknet-master/2007_train.txtvalid=/home/user/Downloads/darknet-master/2007_test.txtnames=/home/user/Downloads/darknet-master/data/cell.namesbackup=backup/
  1. 网络配置在cfg中,此次采用yolov3.cfg,这里需要修改cfg文件。每个[yolo]及其前的卷积层都要修改,主要修改卷积层中的filters的数量,数量计算公式是 filters= 3*(5+类别数),比如我这里有1个类别,filters=18.
    还要修改[yolo]中的classes数,几个类别写几,我是1个类别,就写1。
[net]# Testingbatch=1subdivisions=1# Training# batch=64# subdivisions=2width=416height=416channels=3momentum=0.9decay=0.0005angle=0saturation = 1.5exposure = 1.5hue=.1learning_rate=0.001burn_in=1000max_batches = 500200policy=stepssteps=400000,450000scales=.1,.1[convolutional]batch_normalize=1filters=16size=3stride=1pad=1activation=leaky[maxpool]size=2stride=2[convolutional]batch_normalize=1filters=32size=3stride=1pad=1activation=leaky[maxpool]size=2stride=2[convolutional]batch_normalize=1filters=64size=3stride=1pad=1activation=leaky[maxpool]size=2stride=2[convolutional]batch_normalize=1filters=128size=3stride=1pad=1activation=leaky[maxpool]size=2stride=2[convolutional]batch_normalize=1filters=256size=3stride=1pad=1activation=leaky[maxpool]size=2stride=2[convolutional]batch_normalize=1filters=512size=3stride=1pad=1activation=leaky[maxpool]size=2stride=1[convolutional]batch_normalize=1filters=1024size=3stride=1pad=1activation=leaky###########[convolutional]batch_normalize=1filters=256size=1stride=1pad=1activation=leaky[convolutional]batch_normalize=1filters=512size=3stride=1pad=1activation=leaky[convolutional]size=1stride=1pad=1#filters=255filters=18 #此处有修改activation=linear[yolo]mask = 3,4,5anchors = 10,14,  23,27,  37,58,  81,82,  135,169,  344,319classes=80num=6jitter=.3ignore_thresh = .7truth_thresh = 1random=1[route]layers = -4[convolutional]batch_normalize=1filters=128size=1stride=1pad=1activation=leaky[upsample]stride=2[route]layers = -1, 8[convolutional]batch_normalize=1filters=256size=3stride=1pad=1activation=leaky[convolutional]size=1stride=1pad=1#filters=255filters=18 #3*(class=1+4+1)activation=linear[yolo]#mask = 1,2,3mask = 0,1,2anchors = 10,14,  23,27,  37,58,  81,82,  135,169,  344,319#classes=80classes=1 #只有一个类别num=6jitter=.3ignore_thresh = .7truth_thresh = 1random=1
  1. 下载,还要下载一下darknet53.conv.74的模型参数
wget https://pjreddie.com/media/files/darknet53.conv.74
  1. 行了,在darknet文件夹下打开终端跑起来吧:
./darknet detector train cfg/cell.data cfg/yolov3.cfg darknet53.conv.74

这里再提醒一下,上面那句代码,cell.data换为你自己刚才建立的data文件,yolov3.cfg是因为我使用的是yolov3模型,如果用其他模型,就输入其他模型比如yolov3-tiny.cfg之类的,那么就要在第5步下载相对应的权重。

好了,今天就介绍到这儿,是不是超级详细?(__) 嘻嘻!有什么疑惑和建议都可以在下面留言,同时不要吝啬你的点赞哦!

转载地址:http://dhdlf.baihongyu.com/

你可能感兴趣的文章
【托业】【怪兽】TEST02
查看>>
【托业】【怪兽】TEST03
查看>>
【托业】【跨栏】TEST04
查看>>
【托业】【跨栏】TEST05
查看>>
【托业】【全真题库】TEST1-语法题+阅读题
查看>>
【托业】【全真题库】TEST3-语法题+阅读题
查看>>
【托业】【跨栏】TEST06
查看>>
【托业】320题-语法题(03-04)(03-37、04-11)
查看>>
【日语】五十音图-一个好用的日语五十音图记忆方法
查看>>
linux下使用crontab实现定时PHP计划任务失败的原因分析
查看>>
linux环境下安装redis扩展
查看>>
一个简单大方的赞后+1,踩后-1js动画效果
查看>>
新手学习编程的最佳方式
查看>>
从json_encode过来的的字符串被返回到html页面时的解析
查看>>
linux虚拟机局域网网卡配置
查看>>
用js判断是否为手机浏览,如果是手机浏览就跳转到手机站
查看>>
每天一个linux命令(26):用SecureCRT来上传和下载文件(转载自竹子)
查看>>
定时启动计划任务(转载自网络)
查看>>
Javascript的RegExp对象(转载自网络)
查看>>
rwx对于文件和目录的意义
查看>>