YOLO v2(Darknet)训练自定义数据集使用记录

  

1、环境准备

Darknet官网:https://pjreddie.com/darknet/yolo/

GitHub地址:https://github.com/pjreddie/darknet

Windows版本可参考:https://github.com/AlexeyAB/darknet

参照官网流程:下载源码,编译,下载基于voc或者coco数据集已训练好的权重文件,进行目标检测测试。

一切顺利的话,则可以准备自己的数据集进行训练了。

2、准备数据

准备好训练图片(以武器图片识别为例),参考VOC Data数据集格式,样本统一采用jpg格式的图像,名字上也使用像VOC一样类似000001.jpg、000002.jpg的格式命名。

按VOC数据集的结构放置图像文件。VOC的结构如下:

--VOC
    --Annotations
    --ImageSets
      --Main
      --Layout
      --Segmentation
    --JPEGImages
    --SegmentationClass
    --SegmentationObject

     这里面用到的文件夹是Annotations、ImageSets和JPEGImages。其中文件夹Annotations中主要存放xml文件,每一个xml对应一张图像,并且每个xml中存放的是标记的各个目标的位置和类别信息,命名通常与对应的原始图像一样;而ImageSets我们只需要用到Main文件夹,这里面存放的是一些文本文件,通常为train.txt、test.txt等,该文本文件里面的内容是需要用来训练或测试的图像的名字(无后缀无路径);JPEGImages文件夹中放我们已按统一规则命名好的原始图像。

      1.新建文件夹WeaponData

      2.在WeaponData文件夹下新建三个文件夹Annotations、ImageSets和JPEGImages,并把准备好的自己的原始图像放在JPEGImages文件夹下

      3.在ImageSets文件夹中,新建三个空文件夹Layout、Main、Segmentation,然后把写了训练或测试的图像的名字的文本拷到Main文件夹下,按训练(train)、验证(val)、测试(test)的目的命名(见后文)。

3、标注数据集

在获取到大量数据之后,为了实现目标检测,还需要对图片进行物体类别和位置的标注。Darknet使用xml文件格式来存储标注的物体坐标位置,训练自己的数据可以参考Pascal VOC Data数据集的文件夹以及文件组成结构创建相应的label文件。标注图片相关工具有很多,这里以labelImg为例,操作如下图:

标注完成后,在Annotation文件夹下便会生成所有图片的物体标注信息,每张图片对应一个xml文件。最后生成的文件如下:

其中每个xml文件中包含了图片的大小,所标注物体的类别及坐标位置。

4、准备训练

1、将所有样本按一定比例分为训练集、测试集、验证集三部分,比如按训练集、测试集、验证集的比例3:1:1分布,分别生成三个文件train.txt、val.txt、test.txt:

可以使用自己熟悉的语言写生成生成,文件中每一行就是一个文件名,不含扩展名,如下图所示:

2、将WeaponData文件夹、Darknet源码上传到服务器上(如果一开始就在服务器上做则省略),比如放到 /opt/dev/yolo 文件夹下,其中 /opt/dev/yolo/darknet为源码。

3、 在/opt/dev/yolo文件夹中新建文件夹VOCdevkit,再将前面准备好的整个WeaponData文件夹都拷到VOCdevkit文件夹下,并重命名为VOC2018(如果不重命名的话就需要修改voc_label.py脚本中相应位置来匹配文件夹名称)。

mkdir VOCdevkit
mv WeaponData VOCdevkit/VOC2018

4、 下载voc_label.py文件到/opt/dev/yolo下:

cd /opt/dev/yolo
wget https://pjreddie.com/media/files/voc_label.py

并修改voc_label.py中的sets和classes部分:

最后运行该脚本:

python voc_label.py

完成后便会在文件夹/opt/dev/yolo/VOCdevkit/WeaponData下生成了文件夹lables, 文件夹里面包含了类别和对应归一化后的位置,同时在/opt/dev/yolo/下应该也生成了2018_train.txt、2018_test.txt、2018_val.txt三个文件,里面包含了所有样本的绝对路径。

再执行如下命令,将2018_train.txt和2018_val.txt的内容都用于训练:

cat 2018_train.txt 2018_val.txt > train.txt

5、配置文件修改

1、修改/opt/dev/yolo/darknet/data/voc.names,改为需要识别的目标类别:

aeroplane
person
building
ship
vehicle

2、 修改cfg/voc.data

classes= 5
train  = /opt/dev/yolo/train.txt
valid  = /opt/dev/yolo/2018_test.txt
names = /opt/dev/yolo/darknet/data/voc.names
backup = /opt/dev/yolo/results

其中classes为样本类别数, train 为训练样本的文件路径,valid为验证样本文件路径,names为类别文件,backup为权重文件备份目录(先创建好)。

3、 修改cfg/yolo-voc.2.0.cfg (也可以用 cfg/yolo-voc.cfg )

修改最后一个卷基层的filters和最后一个region的classes。
其中,filters=num×(classes + coords + 1)=5*(5+4+1)=50,这里只有5个类别。

[convolutional]
size=1
stride=1
pad=1
filters=50
activation=linear

[region]
anchors = 1.08,1.19,  3.42,4.41,  6.63,11.38,  9.42,5.11,  16.62,10.52
bias_match=1
classes=5
coords=4
num=5
softmax=1
jitter=.2
rescore=1

……

6、修改 Makefile 文件

训练最好使用GPU,否则CPU非常慢,源码默认没有开启,一开始没有注意被坑了很久。

安装 cuda+cudnn 参考:yolov2在CUDA8.0+cudnn8.0下安装、训练、检测经历 - 牧马人夏峥 - 博客园

然后修改Makefile文件:

cd /opt/dev/yolo/darknet
vim Makefile

修改顶部的三行开启GPU和CUDNN:

GPU=1
CUDNN=1
OPENCV=1
以及后面的NVCC为自己的路径:

NVCC=/usr/local/cuda-8.0/bin/nvcc

重新编译

make clean
make

7、开始训练

可以下载 ImageNet 的前23层预训练权重文件加快训练:

cd /opt/dev/yolo/darknet
wget https://pjreddie.com/media/files/darknet19_448.conv.23

然后执行如下命令开始训练:

./darknet detector train cfg/voc.data cfg/yolo-voc.2.0.cfg ./darknet19_448.conv.23 

如果需要分析输出日志的话,可以在命令后面使用tee将日志输出到文件。

训练时间比较长,可以观察loss,如果稳定到一定程度,则可以停止训练。

下面是训练过程的每一轮迭代输出例子:

Loaded: 0.000031 seconds
Region Avg IOU: 0.805040, Class: 0.929115, Obj: 0.777778, No Obj: 0.004146, Avg Recall: 0.875000,  count: 8
Region Avg IOU: 0.826887, Class: 0.999643, Obj: 0.778379, No Obj: 0.006632, Avg Recall: 0.916667,  count: 12
Region Avg IOU: 0.760517, Class: 0.999070, Obj: 0.698473, No Obj: 0.004795, Avg Recall: 0.846154,  count: 13
Region Avg IOU: 0.840628, Class: 0.999687, Obj: 0.805357, No Obj: 0.005085, Avg Recall: 0.900000,  count: 10
Region Avg IOU: 0.670166, Class: 0.944164, Obj: 0.620956, No Obj: 0.004349, Avg Recall: 0.777778,  count: 18
Region Avg IOU: 0.849498, Class: 0.999253, Obj: 0.743897, No Obj: 0.006114, Avg Recall: 0.933333,  count: 15
Region Avg IOU: 0.625192, Class: 0.957918, Obj: 0.562712, No Obj: 0.005363, Avg Recall: 0.550000,  count: 20
Region Avg IOU: 0.711634, Class: 0.999687, Obj: 0.687795, No Obj: 0.006114, Avg Recall: 0.941176,  count: 17
29391: 1.344486, 1.478107 avg, 0.000100 rate, 4.674087 seconds, 1881024 images

以上截图显示了所有训练图片的一个批次(batch),批次大小的划分根据我们在 .cfg 文件中设置的subdivisions参数。在我使用的 .cfg 文件中 batch = 64 ,subdivision = 8,所以在训练输出中,训练迭代包含了8组,每组又包含了8张图片,跟设定的batch和subdivision的值一致。

(注: 也就是说每轮迭代会从所有训练集里随机抽取 batch = 64 个样本参与训练,所有这些 batch 个样本又被均分为 subdivision = 8 次送入网络参与训练,以减轻内存占用的压力)

针对上图中最后一行中的信息 ,含义如下:

  •     29391: 指示当前训练的迭代次数
  •     1.344486: 是总体的Loss(损失)
  •     1.478107 avg: 是平均Loss,这个数值应该越低越好,一般来说,一旦这个数值低于0.060730 avg就可以终止训练了(由于我的样本质量不太好,这里值一直降不下去)。
  •     0.000100 rate: 代表当前的学习率,是在.cfg文件中定义的。
  •     4.674087 seconds: 表示当前批次训练花费的总时间。
  •     1881024 images: 表示到目前为止,参与训练的图片的总量。

8、测试

训练到一定阶段,中间输出权重可以拿来做识别测试,比如将10000次迭代的文件用于测试:

./darknet detector test cfg/voc.data cfg/yolo-voc.2.0.cfg yolo-voc_10000.weights data/person.jpg

这里需要注意的是,一定要使用./darknet detector test命令,指定自己的 voc.data和cfg文件。

检测结果会输出到predictions.png(或者predictions.jpg)中,可打开查看是否检测正确。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 将Java voc格式数据集转换为YoloDarknet)格式,可以按照以下步骤进行操作: 1. 首先,需要了解VOC格式和YoloDarknet)格式的数据集结构和标注方式。 2. VOC格式通常包含一个XML文件夹,其中包含每个图像的XML文件和图像文件。每个XML文件中包含图像的宽度、高度以及在图像中的目标位置和类别信息。 3. 使用Java解析每个XML文件,提取出图像的宽度、高度和目标位置信息。 4. 将目标位置信息转换为Yolo格式的位置信息。Yolo使用相对于图像宽度和高度的相对坐标来表示目标位置。需要使用以下公式将绝对坐标转换为相对坐标: x_center = (xmin + xmax) / (2 * width) y_center = (ymin + ymax) / (2 * height) obj_width = (xmax - xmin) / width obj_height = (ymax - ymin) / height 其中,(xmin, ymin) 和 (xmax, ymax) 是目标框的左上角和右下角坐标,width 和 height 是图像的宽度和高度。 5. 根据目标类别信息,将Yolo格式的位置信息和类别信息写入Yolo格式的文本文件。Yolo格式的文本文件的每一行表示一个目标,并包含目标类别以及其在图像中的位置。 6. 重复步骤3-5,直到处理完所有的XML文件。 7. 最后,将转换后的Yolo格式的文本文件和VOC格式的图像文件一起使用Yolo训练工具进行训练。 以上是将Java voc格式数据集转换为YoloDarknet)格式的基本步骤。根据具体的实际需求,可能还需要进行一些额外的处理或修改。 ### 回答2: 要将Java voc格式的数据集转换为YoloDarknet)格式,可以按照以下步骤进行: 1. 确保你已经有了Java voc格式的数据集,该数据集通常包含图像和相应的XML文件,每个XML文件中都包含有关图像中对象的位置和类别的信息。 2. 创建一个新的文件夹,用于存储转换后的Yolo格式的数据集。 3. 使用Java代码读取voc数据集中的XML文件,并解析其中的信息,获取对象的类别和边界框的位置。 4. 将解析得到的类别和边界框的信息转换为Yolo格式的标注。Yolo格式的标注通常包含一个txt文件,每行表示一个对象的标注信息,包括类别的编号和边界框的归一化坐标(即左上角和右下角像素坐标除以图像宽度和高度)。 5. 将转换后的Yolo格式的标注信息写入txt文件中,并将txt文件保存在新创建的文件夹中,与对应的图像文件放在同一目录下。 6. 重复步骤3至5,将所有图像的标注信息都转换为Yolo格式的标注并保存。 7. 最后,将新创建的文件夹中的所有图像和标注文件复制到Darknet数据集目录中,以便可以在训练或测试过程中使用。 通过以上步骤,你就可以将Java voc格式的数据集成功转换为YoloDarknet)格式的数据集,以便用于目标检测任务。 ### 回答3: 将Java VOС格式数据集转换为Yolodarknet)格式,可以按照以下步骤进行操作: 1. 首先,了解Java VOC格式数据集。Java VOC(Visual Object Classes)是一种常用的图像数据集格式,用于物体检测任务。它由一个包含图像和标注信息的文件夹组成,标注信息通常为XML格式。 2. 确定Yolodarknet)格式的要求。Yolodarknet)是一种基于深度学习的物体检测框架,它要求数据集以特定的格式存储。Yolodarknet)要求每个图像的标注信息存储在一个对应的txt文件中,每行包含一个目标的类别和边界框的坐标。 3. 开发一个Java程序来将Java VOC格式数据集转换为Yolodarknet)格式。可以使用Java的文件操作功能,按照以下步骤进行转换: - 遍历Java VOC数据集的每个图像和对应的XML标注文件。 - 解析XML文件,提取目标的类别和边界框的坐标。 - 根据Yolodarknet)格式的要求,将类别和边界框的坐标转换为对应的格式,写入一个新的txt文件。 - 将新生成的txt文件与对应的图像放入Yolodarknet数据集文件夹中。 4. 运行该Java程序,并确保数据集中的所有图像都被成功转换为Yolodarknet)格式。可以逐个检查转换后的txt文件,确保其格式正确且与图像对应。 通过以上步骤,您可以将Java VOC格式数据集转换为Yolodarknet)格式,以供Yolodarknet)框架进行物体检测训练和测试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值