最近在研究视频分析相关技术,朋友推荐了darknet开源库,其中主要使用yolo算法,想了解yolo的朋友请自行百度,下面直接说正题。
一、运行环境
OS:Windows 10
显卡:GTX 1070 Ti
编译器/IDE:CMake-3.15.0-rc4-win64x64, Visual Studio 2017,C++编译工具集:V141,Python2.7
二、依赖库
Darknet-master(从github下载,默认使用yolov3)
OpenCV:4.1.1(从github下载)
CUDA: 10.1
CUDNN:10.1(使用这玩意儿做分析时占用GPU资源占用很低)
三、OpenCV编译
OpenCV主要使用CMake生成vcxproj项目工程文件,然后使用vs2017进行编译。
操作步骤:
1. 使用CMake-gui.exe工具(需要下载一些东西,而且比较慢,脱机环境下要提前把依赖文件下载好)。
注意:上图中BULID_opencv_world选项选中和不选中差异巨大,编译Darknet-CUDNN版本所需要OpenCV依赖库必须选中该选项才能编译出来;普通版本采用默认配置就行(不选中)。笔者是在两个目录下分别编译了两个不同的版本,免得混淆。
2. 打开vs工程文件,编译版本。编译很慢,耐心等待。笔者直接使用Release x64。
3. 配置环境变量。本人对CMAKE语法不熟悉,折腾了很久,还是配环境变量来得快。这个步骤主要是为编译Darknet,熟悉CMAKE语法的同学可以修改CMakeList.txt文件或cmake命令加参数应该也可以搞定。
4. 使用CMake-gui.exe生成Darknet在windows平台工程文件,同上面操作。(如果提示OpenCV_DIR、OpenCVConfig类似的错误,就是没找到opencv目录,上面配好了应该不会有问题。)
图上有CUDNN相关警告,我没有管它,后面直接改的vcxproj工程配置。
5. 配置工程。注意,有两个目录下有darknet.vcxproj文件。
这个是没有CUDNN版本的
这个是带CUDNN版本的
编译时如果通不过,多半是由于包含目录、库目录配置不对导致的,改掉就行。
四、测试
1. 测试前还需要下载神经网络权重文件,笔者测试只用了yolov3.weights、yolov3-tiny.weights两个文件。
2. 准备测试图片或视频文件,下面只帖视频文件测试命令和测试结果。
视频文件信息:1080p h264 2Mbps 25fps
权重文件:yolov3.weights
只列出重要的,使用yolov3-tiny.weights,FPS要高得多,但准确率有所下降。
结论:
1. 显存基本等于单进程占用 * 进程数,max process = 3主要是因为打开4路进程显存不够用。
2. 总的fps比较固定,开启多个进程意义不大。(使用yolov3-tiny.weights时多进程fps总和明显大于单进程fps,可能跟解码、IO速度有关,也就是说,算法复杂度低可考虑使用多进程,复杂度较高就没必要了)
3. 内存占用、CPU虽然有消耗,但与GPU相比,瓶颈主要还是在GPU上。
4. cudnn优势非常明显,强烈建议使用(NVIDIA自己的东西还是好用)。
今天先写到这里,下一步研究一下API使用和模型训练。