YOLO v4的安装基本与YOLO v3相同,作者基本上在YOLOv3的版本基础上进行修改,安装上基本上大同小异,下边简单介绍安装要求。
文章目录
cmake --version
CUDA 10.0
使用如下命令查看CUDA版本信息。
cat /usr/local/cuda/version.txt
OpenCV >= 2.4
使用如下命令查看OpenCV版本号。
pkg-config opencv --modversion
cuDNN >= 7.0 for CUDA
使用如下命令查看cuDNN版本号。
cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
如上图所示的cuDNN版本号为7.6.0。
GPU with CC >= 3.0
gcc --version
打开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
直接在darknet文件环境下,运行如下代码。
make
在编译过程中,可能会出现Warining,只要不出现Error就是可以的。
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
问题分析:这个问题主要是出自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
首先,下载yolov4.weights下载链接。
./darknet detect cfg/yolov4.cfg yolov4.weights data/dog.jpg
规则为:
./darknet detect [训练cfg文件路径] [权重文件路径] [检测图片的路径]
运行结果如下图所示
首先将自己的数据集生成为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三个文件。到此,数据准备完成。
./darknet detector train cfg/voc.data cfg/yolo-voc.cfg darknet19_448.conv.23
上边是进行训练的命令,可以按照上边的命令对文件进行修改。
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
在上边修改的文件内有一个data/voc.names文件,里边保存目标分类的名称,修改为自己类别的名称即可。
第一处:修改头文件
文件开头的配置文件可以按照下边的说明进行修改
# 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
网盘地址: yolov4.conv.137
./darknet detector train data/obj.data yolov4-custom.cfg yolov4.conv.137
通常每个类(对象)有足够的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(对于大模型和困难的数据集)。
模型名称 | mAP0.5 | FPS | BFlops |
---|---|---|---|
yolov4 608 | 65.7% | 34 | 128.5 |
yolov4 512 | 64.9% | 45 | 91.1 |
yolov4 416 | 62.8% | 55 | 60.1 |
yolov4 320 | 60% | 63 | 35.5 |
yolov3-tiny-prn | 33.1% | 370 | 3.5 |
EfficientNetB0-Yolov3 | 45.5% | 55 | 18.3 |
yolov3-spp | 60.6% | 38 | 141.5 |
yolov3 | 55.3% | 66 | 65.9 |
yolov3-tiny | 33.1% | 345 | 5.6 |
这个是超出内存,是因为模型训练送入图像太多,应该减少.cfg文件中的subdivisions数值。
如果在训练过程中,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