使用yolo v3训练自己的模型

文章目录

      • 一 加载darknet
      • 二 数据准备
      • 三 模型文件配置
      • 四、测试

一 加载darknet

1、下载darknet框架
参考官网https://pjreddie.com/darknet/yolo/

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

2、官网下载预训练权重

wget https://pjreddie.com/media/files/yolo3.weights

3、测试
(1)修改darknet目录下Makefile文件,将GPU、CUDNN、OPENCV的值都改为1(需提前安装显卡驱动、cuda、cudnn、opencv)
(2)修改要使用的cfg文件,以yolov3.cfg为例,将testing下的batch和subdivision取消注释,将training下的batch和subdivision加注释

用图片测试:

1 ./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg

用视频测试:

1 ./darknet detector test cfg/coco.data cfg/yolov3.cfg yolov3.weights 

用相机测试:

1 ./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights

一般情况下不需要加sudo就可以执行,但如果出现权限问题,加sudo有效,说明你的cuda安装有问题,但是不会对结果产生影响。

二 数据准备

1、将自己的数据集放在指定文件夹下
部分文件夹需要自己新建
在这里插入图片描述
图片统一编号,放在文件夹JPEGImages文件夹中,https://blog.csdn.net/Mihu_Tutu/article/details/103726384

2、图片制作xml文件
用labelImg,下载地址https://github.com/tzutalin/labelImg
我用的是python2
Python2安装labelImg步骤:

sudo apt-get install pyqt4-dev-tools
sudo pip install lxml
make qt4py2
python labelImg.py

这里顺便附上python3的步骤:


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

打开之后,改变xml文件存储地址为上图中的Annotations文件夹中。

3、Imagesets文件夹下新建Main文件夹,用来存放训练图片的名字的文档train.txt及测试图片的名字的文档test.txt。下面附上python代码。

原文:https://blog.csdn.net/xue_csdn/article/details/91043911

import os
import random 
 
xmlfilepath=r'/home/huadian/darknet/scripts/VOCdevkit/VOC2007/Annotations'
saveBasePath=r"/home/huadian/darknet/scripts/VOCdevkit/VOC2007/"
 
trainval_percent=0.8
train_percent=0.7
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)  
 
print("train and val size",tv)
print("traub suze",tr)
ftrainval = open(os.path.join(saveBasePath,'ImageSets/Main/trainval.txt'), 'w')  
ftest = open(os.path.join(saveBasePath,'ImageSets/Main/test.txt'), 'w')  
ftrain = open(os.path.join(saveBasePath,'ImageSets/Main/train.txt'), 'w')  
fval = open(os.path.join(saveBasePath,'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:  
            ftrain.write(name)  
        else:  
            fval.write(name)  
    else:  
        ftest.write(name)  
  
ftrainval.close()  
ftrain.close()  
fval.close()  
ftest .close()

注意路径问题。
使用过程中出现,找不到文件的问题,解决办法是把上述程序在window系统下运行(具体什么原因?需要求助大神)。
4、将xml文件转换为txt文件
在darknet/scripts目录下找到voc_label.py文件,
将sets中的2012相关的去掉,classes改为自己数据集的类别,os.system去掉2012相关,把相应的文件路径改成自己的
运行python voc_label.py,可以看到txt文件出现在labels文件夹下
使用yolo v3训练自己的模型_第1张图片同时在scripts文件夹下边生成三个txt文件,分别是2007_train.txt、2007_test.txt(一般不会用到)、2007_val.txt

如果出现
使用yolo v3训练自己的模型_第2张图片
说明JPEGImages 文件夹下的图片出现格式问题,建议换一张图片,重新标注。

三 模型文件配置

1、修改voc.nama
位于darknet/data文件夹下,这是目标的标签,清空,添加自己的标签

2、修改voc.data
位于darknet/cfg文件夹下,分别将train、val的路径改为scripts文件夹下边的2007_train.txt、2007_val.txt的路径

3、修改模型(cfg)中的参数
使用yolov3模型
权重文件darknet53.conv.74
下载方式[wget https://pjreddie.com/media/files/darknet53.conv.74]
(1)使用yolov3-voc.cfg,将Training后边的注释去掉,batch=64,修改subdivsion=64(如果该值太小容易使内存溢出),
(2)修改参数cfg/yolov3-voc.cfg
一共有三个yolo。可以通过ctrl+f找到yolo
修改classes = 2 (根据voc-names个数)
然后修改 上面的convolutional中的filters
filters = 3*(5+classes)
(3)回到darknet,开始训练

./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74

修改yolov2模型
权重文件darknet19-448.conv.23
下载方式[wget https://pjreddie.com/media/files/darknet19-448.conv.23]
(1)使用yolov2-voc.cfg,将Training后边的注释去掉,batch=64,修改subdivsion=64(如果该值太小容易使内存溢出)必须是2的指数,
(2)修改[region]层,将classes的值改为自己标签的个数,
[region]层上边最后一个[convolutional]层中,修改filters的数值,计算公式:
filters=num*(classes+coords+1),classes和coords的值都是[region]层中的值
(3)回到darknet,开始训练

./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet19-448.conv.23

使用yolo v3训练自己的模型_第3张图片(1)Region Avg IOU:平均的IOU,代表着预测的Bounding Box和Ground truth的交集与并集之比,(batch/subdivision)期望该值趋近于1。
(2)Class:是标注物体的概率,期望该值趋近于1。
(3)Obj:期望该值趋近于1。
(4)No Obj:期望该值越来越小,但不为0。
(5)AvgRecall:期望该值趋近于1,召回率比较高说明效果较好
(6)count表示输出有多少个目标总和

训练完一个batch后的参数的意义
(1)30001表示是第30001个batch。
(2)表示总体的损失。
(3)表示平均损失,该数值越低越好。
(4)代表当前的学习率。
(5)表示当前批次训练花费的总时间。
(6)表示参与训练的图片数目的总和。

就可以在darknet/backup文件夹下看到有不同精度的模型(权重)出现。按照每100步、每1000步、每10000步产生。
如果训练中断,但是后面想要接着前边的模型继续训练,(如训练到5100步时中断)只需要把“darknet19_448.conv.23”换成“yolov2-voc_5000.weights”,即可继续训练。
根据需要选择模型测试图片或视频。

四、测试

测试方法与步骤3类似,需将cfg文件名改为yolov2-voc.cfg,yolov2-voc.cfg中的training下的两个值加注释,testing下的两个值取消注释。如:用摄像头测试:

1 ./darknet detector demo cfg/voc.data cfg/yolov2-voc.cfg yolov2-voc_30000.weights

如果想在bbox上显示准确率,执行:

打开derknet/src文件中找到image.c文件
找到draw_detections函数,加入红色框中的内容,

在这里插入代码片使用yolo v3训练自己的模型_第4张图片

最后重新编译darknet:

make clean
make

你可能感兴趣的:(深度学习)