YOLOv3配置以及训练自己的数据

YOLOv3主页:https://pjreddie.com/darknet/yolo/

1 使用预训练模型进行检测

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

yolo配置文件存放在cfg/目录下,为了实现检测,还需要下载预训练权重,here(237MB),or just run this:

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

1.1 单图像检测

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

输出如下:
yolo检测输出
yolo检测输出
源码中未与opencv一起编译,因此不能直接显示检测结果,结果保存在darknet/predictions.png中,原项目是在cpu上执行,为了使得yolo能够在gpu上执行,需要对编译配置文件做修改,并重新编译,后面我会进一步说明如何操作。
在darknet/data目录下,还带有一些其他的示例图片,你也可以换成其他图片做进一步尝试,例如eagle.jpg,dog.jpg.

1.2 多图像检测

也可以对多幅图片做检测,run this,

./darknet detect cfg/yolov3.cfg yolov3.weights

程序会等待输入图片的地址,例如data/horses.jpg,想要退出的话,ctrl-c即可。

1.3 实时检测

如果要做实时检测,需要先配置好cuda以及opencv,再执行以下命令,

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

也可以对视频做检测,

./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights <video file>

在这里插入图片描述

2 YOLOv3训练自己的数据

首先介绍一下数据集结构,如果有不同的数据集,比如说A项目数据集、B项目数据集、C项目数据集等等,这些数据集可以都放到一个文件夹下,取名为VOCdevkit,推荐取名为VOCdevkit,因为后面用到的数据集处理程序里面的默认文件夹名为VOCdevkit。这个文件夹下可以放置不同的数据集,例如VOC2007、VOC2019等等,我们可以在里面新建一个VOC2019文件夹,用来存放我们自己项目的数据集。每个数据集需要有以下几个文件夹,包括Annotations、ImageSets、JPEGImages、以及后面处理程序会自己生成的labels文件夹,这里我们可以先不手动创建这个文件夹。各文件夹里面存放的内容如下:
JPEGImages:存放所有图片,包括训练集测试集等等所有的图片,所有图像格式最好一致,里面没有子文件夹。
Annotations:存放JPEGImages中所有图片对应的xml文件,如何制作xml文件后面我们会具体提到,里面无子文件夹。
ImageSets:可以先只创建Main文件夹,Main文件夹里面时空的即可。

2.1 标记图像区域

工具:labelimg
工具的安装与使用这里不介绍,以后有时间再具体详细补充。
使用该工具为每幅图像都框出目标,保存为xml,文件名字与原图像名字一致,这里补充一下,所有训练集图像格式最好一致。所有的xml文件存放于Annotations文件夹中。

2.2 生成训练集与测试集

准备好了Annotations文件夹里面的xml后,就可以生成ImageSets/Main下的*.txt了,具体包括train.txt, test.txt, val.txt, trainval.txt。
使用的生成工具是:data_set.py(提取码:oyu7),data_set.py放在VOC2019目录下,程序中trainval的比例为0.9,train的比例为0.8,可更具需要做修改。执行data_set.py后,在ImageSets/Main目录下即可生成上述四个*.txt文件。
文件夹描述
在这里插入图片描述
data_set.py与ImageSets放在一个目录下。
trainval_percent与train_percent可根据需要做修改。

2.3 生成yolo使用的标签格式

使用到的工具:voc_label.py,可通过以下命令获取该工具:

wget https://pjreddie.com/media/files/voc_label.py

其实在darknet/scripts目录下存在该工具。
该工具放在darknet/目录下
需要修改的地方有:数据集名称、目标类的个数。如下地方需要修改:
在这里插入图片描述
在这里插入图片描述
另外下面这个问题是我自己遇到的:
在这里插入图片描述
程序里面的difficult = obj.find(‘Difficult’).text是我改之后的,之前的是difficult = obj.find(‘difficult’).text,我将小写的d改成了大写的D,因为我用的这个xml工具其生成的标签是Difficult,所以要看看自己的xml生成工具生成的是哪个。
数据集根据ImageSets/Main下的几个txt做更改,之前说会生成4个txt,其实trainval.txt这个文件用不到,因为在voc_label.py这个程序里面,会将train与val合并为一个训练集,即最后的os.system(“cat 2019_train.txt 2019_val.txt > train.txt”)
在这里插入图片描述
最后voc_label.py生成5个*.txt,分别为2019_test.txt, 2019_train.txt, 2019_val.txt, train.txt, train.all.txt。这几个*.txt都位于darknet/目录下,文件的名字与自己的数据集名字有关,这里仅作说明举例之用,train.txt就是2019_train.txt与2019_val.txt的合并,train.all.txt就是2019_test.txt, 2019_train.txt, 2019_val.txt的合并。每个txt存放的内容都是对应图片的绝对位置。

2.4 修改cfg/voc.data文件

打开cfg/voc.data文件,做如下修改:
在这里插入图片描述
classes修改为自己项目的目标类数(我这里只有1类),train表示训练集,valid表示测试集,这个名字有点怪,应该是验证集的意思,但感觉影响不大,只要train与valid不重叠就行。
这里还需要对voc.names(在data目录下)做修改,原先voc.names里面包含20个类,需要将其修改为自己项目的类别名称。再修改voc.data里面的names。backup指的是最后模型的存放位置,好像需要在darknet/目录下手动创建backup目录,否则程序报错,反正直接保存在backup目录就没错。
修改完了voc.data之后,需要先下载预训练好的权重,执行命令:

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

2.5 修改cfg/yolov3-voc.cfg

首先修改分类数为自己的分类数,有三处需要修改(印象中是这样),然后注意开头部分训练的batchsize和subdivisions被注释了,如果需要自己训练的话就需要去掉,测试的时候需要改回来,最后可以修改动量参数为0.99和学习率改小,这样可以避免训练过程出现大量nan的情况。最后把每个[yolo]前的filters改成18,这里我只有1个类,所以是18,这个值怎么设置看这里

2.6 训练模型

终于到了这里了,just run this(在darknet/目录下),

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

2.7 训练过程参数的意义

Region xx: cfg文件中yolo-layer的索引;
Avg IOU:当前迭代中,预测的box与标注的box的平均交并比,越大越好,期望数值为1;
Class: 标注物体的分类准确率,越大越好,期望数值为1;
obj: 越大越好,期望数值为1;
No obj: 越小越好;
.5R: 以IOU=0.5为阈值时候的recall; recall = 检出的正样本/实际的正样本
0.75R: 以IOU=0.75为阈值时候的recall;
count:正样本数目。
待补充ing

2.8 YOLOv3使用自己训练的模型进行目标检测

  1. 首先要做的是修改自己yolov3的配置文件,我这里是cfg/yolov3-voc.cfg文件,
    因为是训练之后的测试,所以文件开头修改如下,如果是训练的话,则需要将对应位置的注释掉:

    [net]
    # Testing batch=1 subdivisions=1
    # Training
    #batch=64
    #subdivisions=16 
    
  2. 之前的检测命令是,

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

    也可以是,

    ./darknet detector test cfg/coco.data cfg/yolov3.cfg yolov3.weights data/dog.jpg
    

    第一条命令是简短版本,默认使用的data配置文件是cfg/下的coco.data,即cfg/coco.data,我们训练自己的数据的时候,例如在本教程当中,我们修改的是cfg/voc.data,因此在对单图片做检测的时候,我们需要将data的配置文件替换为cfg/voc.data,同理,你们训练自己的模型之后,将其替换为自己相应的data配置文件即可;然后再将配置文件修改为自己的配置文件即可,例如在本教程中,我们修改的配置文件是cfg/yolov3-voc.cfg,所以将原命令中的配置文件修改为cfg/yolov3-voc.cfg;最后将训练得到的权重替换为我们自己训练好的权重,我们的权重保存在darknet/backup目录下(路径的设置在cfg/voc.data里面的backup参数,但是在darknet/目录下貌似必须要有backup这个文件夹,否则会出问题,因此建议就直接将backup参数设置为darknet/下的backup目录);最后的参数是需要检测的图片路径,路径需要传对即可。
    所以最后的命令总结如下,

    ./darknet detector test <你的data配置文件> <你的yolov3配置文件> <你的权重文件> <picture file> 
    

    即,

    ./darknet detector test your_dataCfgFilePath/your_dataCfgFileName.data your_yolov3CfgFilePath/your_yolov3CfgFileName.cfg your_yolov3WeightsParh/your_yolov3WeightsName.weights yourPicturePath/your_PictureName
    

    同样,对视频的检测命令也需要做相应更改,之前的命令是,

    ./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights <video file> 
    

    使用data配置文件是cfg/coco.data,我们需要将其替换为自己的data配置文件,同样,yolov3配置文件以及权重也需要做相应替换,最后总结如下,

    ./darknet detector demo <你的data配置文件> <你的yolov3配置文件> <你的权重文件> <video file> 
    

3 参考资料

  1. https://pjreddie.com/darknet/yolo/
  2. https://blog.csdn.net/just_sort/article/details/81389571
  3. https://blog.csdn.net/fine_he/article/details/82262515
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值