YOLO v4安装并训练自己数据集(Ubuntu16.04)

YOLO v4安装并训练自己数据集(Ubuntu16.04)

YOLO v4的安装基本与YOLO v3相同,作者基本上在YOLOv3的版本基础上进行修改,安装上基本上大同小异,下边简单介绍安装要求。
文章目录

1. 安装要求

  1. CMake >= 3.8
    使用如下命令可以查看自己系统的CMke版本号。
cmake --version
  1. CUDA 10.0
    使用如下命令查看CUDA版本信息。

    cat /usr/local/cuda/version.txt
    
  2. OpenCV >= 2.4

    使用如下命令查看OpenCV版本号。

    pkg-config opencv --modversion
    
  3. cuDNN >= 7.0 for CUDA
    使用如下命令查看cuDNN版本号。

    cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
    

在这里插入图片描述

如上图所示的cuDNN版本号为7.6.0。

  1. GPU with CC >= 3.0

    gcc --version
    

2. 安装

2.1 设置Makefile

打开darken根目录下的Makefile文件,如下表所示设置里边参数。

内容修改不同情况
GPU=1用CUDA构建,用GPU加速(CUDA应该在/usr/local/CUDA中)
CUDNN=1使用CUDNN v5-v7构建,使用GPU加速训练(CUDNN应在/usr/local/CUDNN中)
CUDNN_HALF=1用于张量核(在泰坦V/Tesla V100/DGX-2及更高版本上)加速探测3x,训练2x
OPENCV=1使用OPENCV 4.x/3.x/2.4.x构建-允许检测来自网络摄像机或网络摄像机的视频文件和视频流
DEBUG=1需要对YOLO进行调试
OPENMP=1使用OPENMP支持构建,使用多核CPU加速Yolo

如果已经安装opencv的情况下,需要设置OPENCV=1;
如果有Nvidia显卡并且已经安装相应版本CUDA与CUDNN时,设置GPU=1,CUDNN=1.
如果显卡为 Titan V / Tesla V100 / DGX-2 或者更新的产品时,设置CUDNN_HALF=1;
多核CPU应用时,设置OPENMP=1

2.2 编译

直接在darknet文件环境下,运行如下代码。

make

在编译过程中,可能会出现Warining,只要不出现Error就是可以的。

2.3 编译常见问题

2.3.1 Makefile: recipe for target ‘obj/convolutional_kernels.o’ failed
qhy@qhy-desktop:~/darknet$ make clean
qhy@qhy-desktop:~/darknet$ make
……
gcc -Iinclude/ -Isrc/ -DGPU -I/usr/local/cuda/include/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -DGPU -c ./src/yolo_layer.c -o obj/yolo_layer.o
nvcc  -gencode arch=compute_30,code=sm_30 -gencode arch=compute_35,code=sm_35 -gencode arch=compute_50,code=[sm_50,compute_50] -gencode arch=compute_52,code=[sm_52,compute_52] -Iinclude/ -Isrc/ -DGPU -I/usr/local/cuda/include/ --compiler-options "-Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -DGPU" -c ./src/convolutional_kernels.cu -o obj/convolutional_kernels.o
/bin/sh: 1: nvcc: not found
Makefile:92: recipe for target 'obj/convolutional_kernels.o' failed
make: *** [obj/convolutional_kernels.o] Error 127
qhy@qhy-desktop:~darknet$

解决方案

修改makefile,将NVCC=nvcc换成自己的cuda路径

NVCC = /usr/local/cuda-10.0/bin/nvcc
2.3.2 Yolov4 make 编译出现Makefile:185: recipe for target ‘obj/network-kernels.o’ failed

问题分析:这个问题主要是出自darknet/src/network_kernels.cu这个文件。但是我分别在Ubuntu16.04和18.04版本的系统下编译,只有Ubuntu16.04下出现了问题。而Ubuntu18.04并不需要修改这个文件。

解决办法

1.打开network_kernels.cu,使用快捷键ctrl+F查找关键词cudaStreamCaptureModeGlobal,该文档下只有这一处,将这一参数删除并保存。(注意这个参数前面的是逗号也要删掉。)
2.在终端输入 make clean
3.make

2.4 Demo测试

首先,下载yolov4.weights下载链接

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

规则为:

./darknet detect [训练cfg文件路径] [权重文件路径] [检测图片的路径]

运行结果如下图所示

在这里插入图片描述

3. 训练自己数据集

3.1数据集准备

首先将自己的数据集生成为VOC数据集的格式,至少生成如下格式的文件夹

Annotations
ImageSets
       --Main
           --test.txt
           --train.txt
           --trainval.txt
           --val.txt
JPEGImages

接着将上边四个文件夹放在/darknet/scripts/VOCdevkit/VOC2007内,这个文件夹需要自己来创建一个。接着对/darknet/scripts/voc_label.py进行修改。

第一处
修改第7行

 sets=[('2012', 'train'), ('2012', 'val'), ('2007', 'train'), ('2007', 'val'), ('2007', 'test')]
 
将“('2012', 'train'), ('2012', 'val'),”删除掉,改为

 sets=[('2007', 'train'), ('2007', 'val'), ('2007', 'test')

第二处
修改第9行

 classes = ["aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat", "chair", "cow", "diningtable", "dog", "horse", "motorbike", "person", "pottedplant", "sheep", "sofa", "train", "tvmonitor"]

修改为自己检测目标类别名称

完成修改以后可运行文件,生成YOLO训练时使用的labels

python voc_label.py

运行结束以后,可以在**/darknet/scripts/VOCdevkit/VOC2007文件夹内看到labels文件夹,并且在/darknet/scripts**文件夹内会生成2007_train.txt、2007_test.txt、2007_val.txt三个文件。到此,数据准备完成。

3.2修改配置文件
./darknet detector train cfg/voc.data cfg/yolo-voc.cfg darknet19_448.conv.23

上边是进行训练的命令,可以按照上边的命令对文件进行修改。

3.2.1修改cfg/voc.data
classes= 3               //修改为训练分类的个数 
train  = /home/ws/darknet/scripts/2007_train.txt          //修改为数据阶段生成的2007_train.txt文件路径
valid  = /home/ws/darknet/scripts/2007_val.txt           //修改为数据阶段生成的2007_val.txt文件路径
names = data/voc.names
backup = backup
3.2.2修改data/voc.names

在上边修改的文件内有一个data/voc.names文件,里边保存目标分类的名称,修改为自己类别的名称即可。

3.2.3修改cfg/yolov4-custom.cfg

第一处:修改头文件
文件开头的配置文件可以按照下边的说明进行修改

# Testing
#batch=1
#subdivisions=1
# Training
batch=64                //每次迭代要进行训练的图片数量 ,在一定范围内,一般来说Batch_Size越大,其确定的下降方向越准,引起的训练震荡越小。 
subdivisions=8          //源码中的图片数量int imgs = net.batch * net.subdivisions * ngpus,按subdivisions大小分批进行训练 
height=416              //输入图片高度,必须能够被32整除
width=416               //输入图片宽度,必须能够被32整除
channels=3              //输入图片通道数
momentum=0.9            //冲量
decay=0.0005            //权值衰减
angle=0                 //图片角度变化,单位为度,假如angle=5,就是生成新图片的时候随机旋转-5~5度    
saturation = 1.5        //饱和度变化大小
exposure = 1.5          //曝光变化大小
hue=.1                  //色调变化范围,tiny-yolo-voc.cfg中-0.1~0.1 
learning_rate=0.001     //学习率
burn_in=1000
max_batches = 120200    //训练次数,建议设置为classes*2000,但是不要低于4000
policy=steps            //调整学习率的策略
//根据batch_num调整学习率,若steps=100,25000,35000,则在迭代100次,25000次,35000次时学习率发生变化,该参数与policy中的steps对应
steps=40000,80000     // 一般设置为max_batch的80%与90%
scales=.1,.1             //相对于当前学习率的变化比率,累计相乘,与steps中的参数个数保持一致;

注意:如果修改max_batches总的训练次数,也需要对应修改steps,适当调整学习率。
具体的含义可以查看YOLO网络中参数的解读

第二处:修改目标类别
修改三处classes,分别位于970行、1058行与1146行,将其修改为自己数据集的目标数量;

 classes=3    

第三处:卷积层中filters
在每个[yolo]层之前的3个[convolutional]中,将[filters=255]改为filters=(classes + 5)x3,记住只要在每个[yolo]层之前的最后一个[convolutional]即可。
分别位于963行、1051行与1139行,将其修改为自己数据集的目标数量;

filters=255  #filters=(classes + 5)x3
activation=linear


[yolo]
mask = 0,1,2
3.3 下载预训练权重

网盘地址: yolov4.conv.137

3.4 训练模型
./darknet detector train data/obj.data yolov4-custom.cfg yolov4.conv.137
3.5 何时停止训练

通常每个类(对象)有足够的2000次迭代,但总共不少于4000次迭代。但是为了更精确地定义什么时候应该停止培训,通过观察avg数值。

Region Avg IOU: 0.798363, Class: 0.893232, Obj: 0.700808, No Obj: 0.004567, Avg Recall: 1.000000, count: 8 Region Avg IOU: 0.800677, Class: 0.892181, Obj: 0.701590, No Obj: 0.004574, Avg Recall: 1.000000, count: 8

9002: 0.211667, 0.60730 avg loss, 0.001000 rate, 3.868000 seconds, 576128 images Loaded: 0.000000 seconds

在训练期间,您将看到不同的错误指示符,当不再减少0时应该停止。XXXXXXX avg
当你看到平均损失为0。xxxxxx avg不再减少在许多迭代,然后你应该停止培训。最终的平均损失可能是0.05(对于小模型和容易的数据集)到3.0(对于大模型和困难的数据集)。

4. YOLO不同结果版本对比

模型名称mAP0.5FPSBFlops
yolov4 60865.7%34128.5
yolov4 51264.9%4591.1
yolov4 41662.8%5560.1
yolov4 32060%6335.5
yolov3-tiny-prn33.1%3703.5
EfficientNetB0-Yolov345.5%5518.3
yolov3-spp60.6%38141.5
yolov355.3%6665.9
yolov3-tiny33.1%3455.6

5. 常见问题

5.1 训练过程中出现Out of memory

这个是超出内存,是因为模型训练送入图像太多,应该减少.cfg文件中的subdivisions数值。

5.2 avg (loss)为nan

如果在训练过程中,avg (loss)部分为nan是正常现象,如果都为nan时,可能为学习率太大,应该适当减少学习率,同时应该注意,使用多GPU训练时,学习率应该除以GPU的数量。

**参考文件
YOLOv4
安装YOLO v4并训练自己数据集(Linux环境)

yolov–7--解决报错:/bin/sh: 1: nvcc: not found make: *** [obj/convolutional_kernels.o] Error 127

Yolov4 make 编译出现Makefile185 recipe for target ‘objnetwork-kernels

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值