最近要用yolov3跑数据,记录下整个过程和踩的坑吧。。。
配置过程是按照官网上一步步来的
环境是乌班图+cuda9 +cudnn 5.1 驱动啥的都配好了,我就直接傻子上路啦。
一 下载工程 通过git克隆
git clone https://github.com/pjreddie/darknet.git
然后cd darknet之后,由于我要用GPU版本,就先vim Makefile文件了
将GPU,CUDNN设置为1代表使用GPU,因为涉及在线测试的话将OPENCV打开了要不测试的时候框框并不会在原图上出现而是产生一个jpg在darknet目录下。
除此之外还要更改两个地方
注意修改上图的NVCC 跟 GPU中的common和ldflags为自己的cuda所在的目录,一般cuda都安装在usr/local里面了,自己去找下自己的版本吧。
然后保存退出,make文件。
我的直接编译通过了没有问题,有的人可能在这里报错,就根据少什么包装什么就行啦,记得先执行 make clean。至此GPU版本就测试好了。
然后下面测试一下yolov3是否能用,先在官网上down一下v3的权重。
wget https://pjreddie.com/media/files/yolov3.weights
然后测试一下data里面的demo图
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
如果ok的话在主目录下可以看到,开了opencv则会直接显示出来:
如果darknet运行error,总结了两个bug,一个是我遇到的一个是别人遇到的。
我遇到的:
CUDA Error: out of memory
darknet: ./src/cuda.c:36: check_error: Assertion `0' failed.
解决办法:
这是因为在yolov3的cfg文件中目前开启的是train模式,batchsize为64,要做的是 vim cfg/yolov3.cfg 按照下面步骤即可
# Testing
batch=1 取消注释
subdivisions=1
# Training
#batch=64 注释掉
#subdivisions=16
其他人遇到的:
Loadingweights from yolo.weights...Done!
CUDA Error:invalid device function
darknet: ./src/cuda.c:21: check_error: Assertion `0' failed.
Aborted (core dumped)
这是因为配置文件Makefile中配置的GPU架构和本机GPU型号不一致导致的。
更改前默认配置如下(不同版本可能有变):
ARCH= -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]
# -gencode arch=compute_20,code=[sm_20,sm_21] \ This one is deprecated?
# This is what I use, uncomment if you know your arch and want to specify
# ARCH= -gencode arch=compute_52,code=compute_52
compute_30表示显卡的计算能力是3.0,几款主流GPU的compute capability列表:
所以Tesla K80对应compute_30,Tesla K40c对应compute_35,Titan X对应compute_52,根据自己的GPU型号的计算能力进行配置,例如配置为:
ARCH= -gencode arch=compute_35,code=compute_35 \
然后重新编译即可。