前言
yolo系列用c写的,在工程中的部署特别方便。4月份yolov4横空出世,之前试了试效果,精度确实有了很大的提升,AB大神nb。最近需要在C++项目中使用yolov4,尝试了opencv的调用(见我的上一篇博客这里),yolov4官方也提供了C++接口,并不需要opencv4.4的版本,调用起来也特别简单。
darknet
使用官方接口调用,我们首先得编译darknet动态库,下载yolov4源码
git clone https://github.com/AlexeyAB/darknet.git
进入darknet目录下,修改makefile文件
cd darknet
vim Makefile
其中需要修改的几个地方,OPENCV=1,LIBSO=1,如果需要使用GPU,则设置GPU=1,CUDNN=1。
GPU=1
CUDNN=1
CUDNN_HALF=0
OPENCV=1
AVX=0
OPENMP=0
LIBSO=1
ZED_CAMERA=0
ZED_CAMERA_v2_8=0
计算能力根据自己GPU设定,由于我使用的titan v,所以计算能力为7.0,不使用GPU则忽略。
# Tesla A100 (GA100), DGX-A100, RTX 3080
# ARCH= -gencode arch=compute_80,code=[sm_80,compute_80]
# Tesla V100
ARCH= -gencode arch=compute_70,code=[sm_70,compute_70]
# GeForce RTX 2080 Ti, RTX 2080, RTX 2070, Quadro RTX 8000, Quadro RTX 6000, Quadro RTX 5000, Tesla T4, XNOR Tensor Cores
# ARCH= -gencode arch=compute_75,code=[sm_75,compute_75]
# Jetson XAVIER
# ARCH= -gencode arch=compute_72,code=[sm_72,compute_72]
# GTX 1080, GTX 1070, GTX 1060, GTX 1050, GTX 1030, Titan Xp, Tesla P40, Tesla P4
# ARCH= -gencode arch=compute_61,code=sm_61 -gencode arch=compute_61,code=compute_61
# GP100/Tesla P100 - DGX-1
# ARCH= -gencode arch=compute_60,code=sm_60
# For Jetson TX1, Tegra X1, DRIVE CX, DRIVE PX - uncomment:
# ARCH= -gencode arch=compute_53,code=[sm_53,compute_53]
# For Jetson Tx2 or Drive-PX2 uncomment:
# ARCH= -gencode arch=compute_62,code=[sm_62,compute_62]
修改自己的cuda和cudnn的路径,然后make,之后会生成一个libdarknet.so动态库。
ifeq ($(GPU), 1)
COMMON+= -DGPU -I/usr/local/cuda-10.1/include/
CFLAGS+= -DGPU
ifeq ($(OS),Darwin) #MAC
LDFLAGS+= -L/usr/local/cuda-10.1/lib -lcuda -lcudart -lcublas -lcurand
else
LDFLAGS+= -L/usr/local/cuda-10.1/lib64 -lcuda -lcudart -lcublas -lcurand
endif
endif
ifeq ($(CUDNN), 1)
COMMON+= -DCUDNN
ifeq ($(OS),Darwin) #MAC
CFLAGS+= -DCUDNN -I/usr/local/cuda-10.1.0/include
LDFLAGS+= -L/usr/local/cuda-10.1.0/lib -lcudnn
else
CFLAGS+= -DCUDNN -I/usr/local/cuda-10.1.0/include
LDFLAGS+= -L/usr/local/cuda-10.1.0/lib64 -lcudnn
endif
endif
检测步骤
检测部分很简单,需要用到刚刚编译的动态库,以及yolov4源码下的yolo_v2_class.hpp。
其实就那么几步,首先加载网络
string classesFile = "./yolo/coco.names";
string modelConfig = "./yolo/yolov4.cfg";
string modelWeights = "./yolo/yolov4.weights";
//加载类别名
vector<string> classes;
ifstream ifs(classesFile.c_str());
string line;
while (getline(ifs, line)) classes.push_back