YoloV4学习笔记4_编译dll并调用测试(win10+VC2015+opencv4.4+yolov4)

编译dll

打开工程 yolo_cpp_dll_no_gpu.sln,

把常规属性中的目标平台版本从8改为10,修改opencv路径,编译。

出现以下错误:

无法解析的外部符号 make_implicit_layer

解决方法参考下面网址:


更改yolo_cpp_dll_no_gpu.vcxproj

注意:下面的3条修改,我在测试时,66行的不需要修改,也可以正常编译成功。

左边为原来的版本,右边为更改后的版本

66行加上


opencv yuv422数据yuv怎么放的_深度学习

163行加上


opencv yuv422数据yuv怎么放的_数据集_02

238行加上


opencv yuv422数据yuv怎么放的_学习_03

改完后,重新打开工程,编译成功。

注意:

默认yolov4默认字符集是“多字节字符集”,根据需要可以在工程属性中改为unicode,一样可以编译通过。

如果要编译gpu版dll

参考:
1、修改yolo_cpp_dll.vcxproj中CUDA的版本号,2处
2、特别注意要将CUDA设备中的Generation改成自己显卡对应的计算能力(默认添加了35和75两项,可能不是你的显卡的计算能力,可以去英伟达显卡官网查询计算能力:https://developer.nvidia.com/cuda-gpus#collapseOne),否则接下来的生成会出错。在前面边编译训练用的工程时,也有本操作。



调用dll

把yolo_cpp_dll.dll、pthreadGC2.dll、pthreadVC2.dll放到工程目录,
引入yolo_cpp_dll.lib和yolo_v2_class.hpp
注意:如果要debug,则把dll分出release版和debug版不同名字(dll工程relase和debug输出名相同,需要改成不同,这里给debug版加了"_d")

#include “yolo_v2_class.hpp”
 #ifdef _DEBUG
 #pragma comment(lib,“yolo_cpp_dll_d.lib”)
 #else
 #pragma comment(lib,“yolo_cpp_dll.lib”)
 #endif //_DEBUG具体使用很简单:
 //创建检测器
 Detector m_YoloDetector(“.cfg",".weights”);
 //检测
 std::vector<bbox_t> vResult = m_YoloDetector.detect(img);

经测试,debug和release都可以正常使用。

注意:

1、cfg和weights文件如果不存在,会是程序闪退,最好先判断是否存在并提示。
2、cfg和weights必须配套,也就是要用训练weights时使用的cfg,否则会检测不出结果。
3、debug和release的dll不能混用,否则会出错。
4、在调用dll的工程中的yolo_v2_class.hpp中,增加“ #define OPENCV ”
因为有一些代码是#ifdef OPENCV控制的,得加上#define OPENCV才会起作用
否则可能会有如下错误:
错误1:无法 从“cv::Mat”转换为“image_t”
错误2:无法从"cv::Mat"转换为“string",这个错误是因为错误1导致的重载函数匹配不上了。
5、gpu识别coco数据集80分类,识别一次dog.jpg的例子图像,花费3100ms。
识别自己做的1分类数据集,需要1500ms,还是很慢啊。
(cpu i7-7700HQ 2.8GHz)
相同条件下,yolov4-tiny的识别速度是yolov4的10倍,coco数据集80分类识别205ms。
6、虽然用不到,但是特殊记录一下,darknet中的图片像素点数据,都是保存的0-1之间的标准化数据。例如,darknet_R = opencv_R/255;