如何使⽤YOLOV4的darknet训练⾃⼰的数据集?
0 我的环境
ubuntu 16.04
GPU 2080Ti
CUDA: 10.0.0
cuDNN: 7.4.1
1 下载darknet源码
⽅式⼆:因为从github下载源码⽐较慢,可是使⽤另外⼀种⽅法,将github上的源码保存在gitee中,然后从gitee上下载源码。gitee 毕竟是国内的嘛,下载速度会开很多。
具体操作就是:
(1) 创建gitee账号并且登录
(2) 点击新建仓库
(3) 新建仓库会弹出⼀个新的界⾯,然后将界⾯拉到最底部,点击import
点击import之后,然后在其中输⼊github上darknet的地址就⾏
(4) 这样你就会创建⼀个darknet的仓库,内容和github的内容⼀样
然后点击copy复制地址,使⽤git clone 的⽅在终端中进⾏下载。
2 创建数据集⽂件⽬录
因为从github下载源码⽐较慢,可是使⽤另外⼀种⽅法,将github上的源码保存在gitee中,然后从gitee上下载源码。gitee毕竟是国内的嘛,下载速度会开很多。
如果不对yolov4源码进⾏修改的,但是想使⽤yolov4训练⾃⼰的数据集,我们需要按照yolov4读取数据集的⽅式,创建相应的数据集⽂件⽬录。最终的数据集⽬录结构是这个样⼦的:
darknet-master
---- data
---- obj.names        # 物体类别名称(如果有两类物体,就写上两类物体的名称)
---- obj.data        # 将数据集的信息保存在这个⽂件中,yolov4从这个⽂件中读取数据集信息
---- obj              # 存放图⽚以及每个图⽚的标签信息
----         # 存放训练集地址 (相对地址,⽐如: data/obj/image1.jpg)
----           # 存在测试集地址 (相对地址,⽐如: data/obj/image3.jpg)
我分别介绍⼀个data⽂件夹下五个⽂件或⽂件夹的作⽤以及格式:
(1) obj.names 该⽂件中保存的是检测物体的名称。假设有⼀个安全帽检测的项⽬,检测有没有戴安全帽。没有戴安全帽的标签是people,戴安全帽的标签是hat。那么obj.names⽂件中就这样写:
person
hat
每⼀类名称独占⼀⾏,这样是为了⽅便读取⽂件中的内容,我们只需要通过换⾏符就可以轻松分割并读取obj.names中每个类别的名称。
(2) obj.data  该⽂件中保存着五类信息:类别数量,训练集,验证集,类别名称和保存权重的⽂件
classes= 2                        # 2表⽰数据集中只有两类可检测的物体
train  =           # 表⽰保存训练数据集的地址
test=             # 表⽰保存验证数据集的地址
names = data/obj.names            # 表⽰可检测物体的名称
backup = backup/                  # 表⽰保存训练权重的⽂件
obj.data⽂件其实就是⼀个汇总⽂件,yolov4需要的数据集地址,数据集标签以及信息的时候就是从这个⽂件中得到的。该⽂件涉及的内容在上下⽂都有涉及,这⾥就不再赘述。
(3) obj  该⽂件夹中存放着整个数据集(训练集和验证集)的图⽚(.jpg格式)以及它们的标签(.txt)⽂件。也就是说每⼀张图⽚都对应⼀个txt标签⽂件。⽐如image1.jpg图⽚对应的标签⽂件就是⽂件。将数据集图⽚和标签放在⼀起有⼀个好处就是,我们不需要单独将图⽚和标签放在不同的⽂件夹下,只需要提供⼀个⽂件路径,得到所有的.jpg图⽚之后将其后缀改成.txt就可以得到相应的标签⽂件,这样做⽅便有简洁。
每个标签⽂件中包含如下五个信息:
<object-class>  <x_center>  <y_center>  <width>  <height>
object-class: 表⽰物体的数字标签。⽐如0, 1, 2等整数。
<x_center>  <y_center>  <width>  <height>: 表⽰物体的相对中⼼坐标及其相对宽⾼(这四个值的⼤⼩在0-1之间)。
举例来说:
<x_center> = <absolute_x> / <image_width> = bounding box中⼼x实际坐标 / 图⽚实际宽度
<y_center> = <absolute_y> / <image_height> = bounding box中⼼y实际坐标 / 图⽚实际⾼度
<width> = <absolute_width> / <image_width> = bbox宽度 / 图⽚实际宽度
<height> = <absolute_width> / <image_width> = bbox⾼度 / 图⽚实际⾼度
如果⼀幅图⽚中包含不⽌⼀个物体,那么每幅图⽚的标签信息应该如何填写?举例来说,对于image1.jpg图⽚有三个物体,⽂件就是这样:
1 0.716797 0.395833 0.216406 0.147222
0 0.687109 0.379167 0.255469 0.158333
1 0.42031
2 0.39583
3 0.140625 0.166667
(4)   该⽂件中保存着所有训练集的相对地址。⽐如:
data/obj/img1.jpg
data/obj/img2.jpg
data/obj/img3.jpg
(5) 该⽂件中保存着所有验证集的相对地址。⽐如:
data/obj/img11.jpg
data/obj/img21.jpg
data/obj/img31.jpg
到这,数据集的搭建就已经完成了。下⾯我们需要对yolov4的配置⽂件进⾏修改。
3 修改配置⽂件
(1) 复制yolov4.cfg⽂件将其重命名为yolov4-obj.cfg。这样就不会对原始⽂件进⾏修改。
(2) 修改yolov4-obj.cfg如下内容:
# step1: 修改batch和subdivisions
L2: batch=64                # 原来就是64,根据gpu⾃⼰选择
L3: subdivisions=16        # 原来是8,根据⾃⼰的gpu选择
# step2: 修改图⽚的尺⼨
L7: width=608              # 这边我就不进⾏修改了
L8: height=608              # 这边我也不修改
# step3: 修改classes(每个yolo层都需要修改⼀次,⼀共需要修改三次)
L968: classes=2            # 我只需要识别两类物体,因此需要修改成2
L1056: classes=2
L1144: classes=2
# step4: 需要修改每个yolo相邻的上⼀个convolution层的filter
L961: filters=21            # 因为我预测两类物体:21 = 3*(5+2)
L1049: filters=21
L1137: filters=21
4 修改makefile⽂件
darknet使⽤c语⾔编写的,因此我们需要对其进⾏编译。在编译之前我们需要修改makefile⽂件,并修改如下内容:
(1) GPU=1: 表⽰在训练的时候使⽤CUDA进⾏加速训练(CUDA应该在 /usr/local/cuda⽂件夹下)
(2) CUDNN=1: 表⽰在训练的过程中使⽤CUDNN v5-v7进⾏加速(cuDNN应该在 /usr/local/cudnn⽂件夹下)
(3) CUDNN_half=1: 为Tensor Cores (在Titan V / Tesla V100 / DGX-2等)上进⾏加速训练和推理。
(4) OPENCV=1: 编译OpenCV 4.x/3.x/2.4.x等。OpenCV可以读取视频或者图⽚。
(5) DEBUG=1: 编译debug版本的Yolo
(6) OPENMP=1:使⽤OpenMP进⾏编译,能够使⽤多核的CPU进⾏加速
(7) LIBOS=1: 编译构建darknet.so动态库。
(8) ZED_CAMREA=0: 置为1的时候表⽰构建ZED-3D-camera的库。这⾥我们不使⽤
5 配置OpenCV
这⾥参考了博客
(1) 下载相关库⽂件
# step1
sudo apt-get install build-essential
# step2
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
# step3
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
(2) 安装cmake
sudo apt-get install cmake
(3) 下载opencv并进⾏编译
step2: 解压,并且创建build⽂件夹,对opencv进⾏编译(这⾥⾯我是将opencv放在darknet-master⽂件夹下,然后编译的)
# step1: 切换到opencv⽬录下
cd opencv
# step2: 创建build⽂件夹
mkdir build
# step3: 切换到build⽂件夹
cd build
cmake如何使用
# step4: 使⽤camke进⾏⽣成CMakeLists⽂件
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
# step5: 使⽤make命令进⾏编译
sudo make -j8
# step6
sudo make install
(4) 将opencv的库添加到路径中,从⽽让系统能够到
# step1: 打开⽂件
sudo gedit /etc/f.f
# step2: 向⽂件中加上下⾯命令
export /usr/local/
# step3: 让动戴链接库为系统所享
sudo ldconfig
# step4: 配置bashrc
sudo gedit /etc/bash.bashrc
# step5: 在⽂件中加上下⾯两⾏命令
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
# step6: 最后再终端中source⼀下
source /etc/bash.bashrc
(5) 最后,我们需要编译darknet
darknet是使⽤c语⾔开发的框架,如果要使⽤的话,我们需要对其进⾏编译。具体操作就是打开终端,然后转到darnet-master⽂件夹下,输⼊make进⾏编译就可以了。
# step1: 转到darknet所在的⽂件夹
cd darknet-master
# step2: 使⽤make进⾏编译
make
这时候你会发现⽂件夹下会多出来⼀些东西,⽐如darknet可执⾏⽂件,backup⽂件等。我们通过运⾏darknet就可以进⾏训练或者检测,backup是存放我们训练权重的⽂件夹。
6 进⾏训练
(1) 下载预训练权重:
(2) 执⾏下⾯命令:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。