真正超详细手把手PyTorch框架下用YOLOv3训练自己的数据集实战过程记录(Ubuntu18.04)

最近还有项目是多目标跟踪,所以开始接触目标检测器,那就从最普遍的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版本的官方下载地址:https://github.com/tzutalin/labelImg/
具体的过程按照官方教程即可,我放在下面:

sudo apt-get install pyqt5-dev-tools
sudo pip3 install -r requirements/requirements-linux-python3.txt
make qt5py3
python3 labelImg.py

:如果在执行第二步的之后如果出现sudo: pip3: command not found,可以参考我上一篇文章:https://blog.csdn.net/Cheungleilei/article/details/103503754
之后会打开一个界面
真正超详细手把手PyTorch框架下用YOLOv3训练自己的数据集实战过程记录(Ubuntu18.04)_第1张图片具体的标注过程在这里我就不再赘述,可以参考一些其他文章。

获取源码并编译

1.官方代码下载地址:https://github.com/pjreddie/darknet
当然,你也可以采用:

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

我采用第一种,下载完毕后,看到压缩包,右键“Extract here"
2. 现在开始编译:

cd darknet
sudo gedit  Makefile 

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

make

接着用make命令进行编译,出现以下界面,编译成功:
真正超详细手把手PyTorch框架下用YOLOv3训练自己的数据集实战过程记录(Ubuntu18.04)_第2张图片

实验数据集整理和准备

解压后得到的文件中含有两个文件夹——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 os
import random

trainval_percent = 0.1
train_percent = 0.9
xmlfilepath = '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文件:
真正超详细手把手PyTorch框架下用YOLOv3训练自己的数据集实战过程记录(Ubuntu18.04)_第3张图片

加入自己的数据集

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

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

python voc_label.py
cat 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即可。
    真正超详细手把手PyTorch框架下用YOLOv3训练自己的数据集实战过程记录(Ubuntu18.04)_第4张图片
  2. data目录下创建cell.names,按创建data文件的方法创建即可,创建完成后双击,在空白页面中添加“RGB”即可,输入内容就是你需要检测的类别名,我这里只检测RGB,所以只写了RGB。
    真正超详细手把手PyTorch框架下用YOLOv3训练自己的数据集实战过程记录(Ubuntu18.04)_第5张图片
  3. 这个data文件主要记录数据集的情况,具体的修改方法如下:
classes=<你需要检测的类别数量>
train = <2007_train.txt 文件所在的位置>
valid = <2007_test.txt/2007_valid.txt 文件所在位置,这不太重要>
names = <names文件所在位置>
backup = <backup文件夹所在位置,没有就自己建一个>

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

classes=1
train=/home/user/Downloads/darknet-master/2007_train.txt
valid=/home/user/Downloads/darknet-master/2007_test.txt
names=/home/user/Downloads/darknet-master/data/cell.names
backup=backup/
  1. 网络配置在cfg中,此次采用yolov3.cfg,这里需要修改cfg文件。每个[yolo]及其前的卷积层都要修改,主要修改卷积层中的filters的数量,数量计算公式是 filters= 3*(5+类别数),比如我这里有1个类别,filters=18.
    还要修改[yolo]中的classes数,几个类别写几,我是1个类别,就写1。
[net]
# Testing
batch=1
subdivisions=1
# Training
# batch=64
# subdivisions=2
width=416
height=416
channels=3
momentum=0.9
decay=0.0005
angle=0
saturation = 1.5
exposure = 1.5
hue=.1

learning_rate=0.001
burn_in=1000
max_batches = 500200
policy=steps
steps=400000,450000
scales=.1,.1

[convolutional]
batch_normalize=1
filters=16
size=3
stride=1
pad=1
activation=leaky

[maxpool]
size=2
stride=2

[convolutional]
batch_normalize=1
filters=32
size=3
stride=1
pad=1
activation=leaky

[maxpool]
size=2
stride=2

[convolutional]
batch_normalize=1
filters=64
size=3
stride=1
pad=1
activation=leaky

[maxpool]
size=2
stride=2

[convolutional]
batch_normalize=1
filters=128
size=3
stride=1
pad=1
activation=leaky

[maxpool]
size=2
stride=2

[convolutional]
batch_normalize=1
filters=256
size=3
stride=1
pad=1
activation=leaky

[maxpool]
size=2
stride=2

[convolutional]
batch_normalize=1
filters=512
size=3
stride=1
pad=1
activation=leaky

[maxpool]
size=2
stride=1

[convolutional]
batch_normalize=1
filters=1024
size=3
stride=1
pad=1
activation=leaky

###########

[convolutional]
batch_normalize=1
filters=256
size=1
stride=1
pad=1
activation=leaky

[convolutional]
batch_normalize=1
filters=512
size=3
stride=1
pad=1
activation=leaky

[convolutional]
size=1
stride=1
pad=1
#filters=255
filters=18 #此处有修改
activation=linear

[yolo]
mask = 3,4,5
anchors = 10,14,  23,27,  37,58,  81,82,  135,169,  344,319
classes=80
num=6
jitter=.3
ignore_thresh = .7
truth_thresh = 1
random=1

[route]
layers = -4

[convolutional]
batch_normalize=1
filters=128
size=1
stride=1
pad=1
activation=leaky

[upsample]
stride=2

[route]
layers = -1, 8

[convolutional]
batch_normalize=1
filters=256
size=3
stride=1
pad=1
activation=leaky

[convolutional]
size=1
stride=1
pad=1
#filters=255
filters=18 #3*(class=1+4+1)
activation=linear

[yolo]
#mask = 1,2,3
mask = 0,1,2
anchors = 10,14,  23,27,  37,58,  81,82,  135,169,  344,319
#classes=80
classes=1 #只有一个类别
num=6
jitter=.3
ignore_thresh = .7
truth_thresh = 1
random=1
  1. 下载yolov3的初始权重,还要下载一下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步下载相对应的权重。

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

你可能感兴趣的:(目标检测,深度学习环境配置,计算机视觉)