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

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

编译dll

打开工程 yolo_cpp_dll_no_gpu.sln,
把常规属性中的目标平台版本从8改为10,修改opencv路径,编译。
出现以下错误:
无法解析的外部符号 make_implicit_layer
解决方法参考下面网址:
https://blog.csdn.net/weixin_50521062/article/details/121267907
更改yolo_cpp_dll_no_gpu.vcxproj
注意:下面的3条修改,我在测试时,66行的不需要修改,也可以正常编译成功。
左边为原来的版本,右边为更改后的版本
66行加上

YoloV4学习笔记4_编译dll并调用测试(win10+VC2015+opencv4.4+yolov4)_第1张图片 163行加上

YoloV4学习笔记4_编译dll并调用测试(win10+VC2015+opencv4.4+yolov4)_第2张图片238行加上

YoloV4学习笔记4_编译dll并调用测试(win10+VC2015+opencv4.4+yolov4)_第3张图片改完后,重新打开工程,编译成功。

注意:

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

如果要编译gpu版dll

参考:https://blog.csdn.net/stjuliet/article/details/87884976
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 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;

你可能感兴趣的:(深度学习,VC,学习,c++,深度学习)