前言
在训练yolov3模型前,首先需要下载darknet的源码,使用的是这一版本:https://pjreddie.com/darknet/yolo/,是在原版(AlexeyAB版本)基础上的改进版本,具体区别见这篇博客:darknet优化经验-AlexeyAB大神经验
下载完darknet源码后需要使用make指令进行编译,编译的过程实际上是执行Makefile中的语句,要想成功编译,还需根据我们自身服务器环境的情况对MakeFile文件进行修改。以下就是我在make过程中遇到的报错和相应的解决方法。
修改GPU、CUDNN、OPENCV这几项
大多数darknet配置教学都会有这一步,就是根据自己的运行条件(大家一般都是在服务器上运行,所以这三项基本都是设置为1):
GPU=1
CUDNN=1
OPENCV=1
OPENMP=0
DEBUG=0
有的博客说只需要改这几项,但我只改这几项make之后,却出现如下错误:
In file included from ./src/utils.h:5:0,
from ./src/gemm.c:2:
include/darknet.h:11:14: fatal error: cuda_runtime.h: 没有那个文件或目录
#include "cuda_runtime.h"
^~~~~~~~~~~~~~~~
compilation terminated.
Makefile:89: recipe for target 'obj/gemm.o' failed
make: *** [obj/gemm.o] Error 1
这是主要是因为服务器找不到相应的cuda,因此需要我们在Makefile中手动添加路径,见下一步。
修改cuda相关路径
需要修改的有:
NVCC=nvcc
ifeq ($(GPU), 1)
COMMON+= -DGPU -I/usr/local/cuda/include/
CFLAGS+= -DGPU
LDFLAGS+= -L/usr/local/cuda/lib64 -lcuda -lcudart -lcublas -lcurand
endif
怎么改呢?其实就是改成自己服务器上cuda所在的实际位置,一般是位于/usr/local/下,但是你可能cuda的目录并不是命名成cuda
,而是其他什么别的名字(比如我的就是cuda-10.0
)。修改如下(如果还有其他地方包含cuda
的路径,那么也进行类似的修改):
NVCC=/usr/local/cuda-10.0/bin/nvcc
ifeq ($(GPU), 1)
COMMON+= -DGPU -I/usr/local/cuda-10.0/include/
CFLAGS+= -DGPU
LDFLAGS+= -L/usr/local/cuda-10.0/lib64 -lcuda -lcudart -lcublas -lcurand
endif
改完之后保存,重新进行编译:
make clean # 清除上次编译内容
make # 重新编译