YOLO是近几年物体检测主要算法之一,2018年已发展到YOLOv3,是目前速度最快的物体检测算法,详细内容可查看YOLO主页。YOLO的主要优势在于基于纯C语言编写的DarkNet,可查看DarkNet主页,不需要其他依赖库,跨平台能力强,运行速度快,这里是下载地址。有趣的是里边有好几个LICENSE文件,其中LICENSE.fuck的内容是这样的:

       DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
               Version 2, December 2004

Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>

Everyone is permitted to copy and distribute verbatim or modified
copies of this license document, and changing it is allowed as long
as the name is changed.

       DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE

TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  1. You just DO WHAT THE FUCK YOU WANT TO.

短短几行字出现了三次“FUCK”,还出现在标题中。这是我第一次见到这样的LICENSE文档,估计是往github上推送时忘了删除吧。
下面是我运行YOLOv3代码的过程。
我的运行环境为:

  • Ubuntu16.04LTS
  • CUDA9.0
  • cuDNN7.0.5
  • AMD Ryzen 1600
  • NVIDIA GTX1070

一. 使用CPU运行

这个比较简单,在Ubuntu下载、编译、运行非常方便,按照YOLO主页给的提示执行就可以看到结果。

1. 下载

git clone https://github.com/pjreddie/darknet

2. 编译

cd darknet
make

执行完命令可以看到生成了可执行文件darknet和库文件libdarknet.a和libdarknet.so。在Ubuntu下使用makefile文件进行编译非常方便,执行一个命即可,比在Windows安装cygwin和GUI的CMake,使用CMake在界面方式编译要简单得多。

3. 下载预训练的权重文件

wget https://pjreddie.com/media/files/yolov3.weights

在Ubuntu中下载速度很慢,要几个小时。我打开了另一台装Windows的电脑,用下载神器迅雷几分钟就下完了,感谢国内下载完这个文件还开着电脑和迅雷的小伙伴们。然后将该文件拷贝至Ubuntu电脑上darknet目录下。

4. 运行检测器

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

这里的“./darknet”表示当前目录下的darknet,这点与Windows的命令行不同。运行完可看到下面的结果,并在darknet目录下生成了检测结果的jpg文件。

layer filters size input output
0 conv 32 3 x 3 / 1 416 x 416 x 3 -> 416 x 416 x 32 0.299 BFLOPs
1 conv 64 3 x 3 / 2 416 x 416 x 32 -> 208 x 208 x 64 1.595 BFLOPs
.......
105 conv 255 1 x 1 / 1 52 x 52 x 256 -> 52 x 52 x 255 0.353 BFLOPs
106 detection
truth_thresh: Using default '1.000000'
Loading weights from yolov3.weights...Done!
data/dog.jpg: Predicted in 0.029329 seconds.
dog: 99%
truck: 93%
bicycle: 99%

这几步在我的电脑上执行顺利,没有出现问题。

二. 使用GPU运行

四个步骤相同,区别在于要修改Makefile文件。而且电脑要提前装好CUDA和cuDNN,可参看
环境配置(近期实测)——Ubuntu16.04+CUDA9.0+tensorflow-gpu填坑记。 Makefile文件修改如下:

GPU=0
CUDNN=0
NVCC=nvcc

改为

GPU=1
CUDNN=1
NVCC=/usr/local/cuda-9.0/bin/nvcc #即改为本机CUDA安装地址

修改完执行make提示:

include/darknet.h:16:23: fatal error: cudnn.h: 没有那个文件或目录
compilation terminated.
Makefile:89: recipe for target 'obj/gemm.o' failed
make: *** [obj/gemm.o] Error 1

是因为缺乏头文件cudnn.h,需要将其复制。由于需要管理员权限,我使用命令复制。
进入所在目录~/下载/cuda/include(下载CUDA的默认位置,可能会有不同),运行:

sudo cp cudnn.h /usr/include

然后再darknet目录下执行make,提示

/usr/bin/ld: 找不到 -lcudnn
collect2: error: ld returned 1 exit status
Makefile:83: recipe for target 'libdarknet.so' failed
make: *** [libdarknet.so] Error 1

这是因为缺少库文件libcudnn.so,我使用命令复制。进入所在目录~/下载/cuda/lib64(下载CUDA的默认位置,可能会有不同),打开终端,运行

sudo cp libcudnn.so /usr/local/cuda-9.0/lib64

再在darknet目录下执行make命令,可以看到,已生成可执行程序darkenet和库libdarknet.o和libdarknet.so。剩余过程同上,最后也可以生成有方框标记概率的jpg文件。