// 首先获得Program Files(x86)的文件夹路径
function getProgramFiles32bit(){}
// 然后从Program Files(x86)文件夹中利用vswhere.exe找达到visual studio的安装路径
function getLatestVisualStudioWithDesktopWorkloadPath(){
// 获得visual studio的版本
function getLatestVisualStudioWithDesktopWorkloadVersion(){}
// 找到vcpkg(是visual studio的命令行包管理工具,可用来基于vs安装新包)
// 从vs的安装路径下找到Common7\Tools\VsDevCmd.bat运行
// 基于tokens判断vs是哪个版本,并设置用该vs的Cmake
if($tokens[0] -eq “15”){
$(generator = “Visual Studio 15 2017”
// 如果找到nvcc.exe,则从环境变量找到CUDA_PATH并添加CUDA_PATH\bin
// 从环境变量找到CUDA_PATH并增加额外的环境变量CUDA_TOOLKIT_ROOT_DIR
// 增加CMAKE编译选项-DBUILD_AS_CPP:BOOL=TRUE
// 如果有vcpkg则基于vcpkg进行release版本编译:执行cmkae指令
2. 编译问题1:
在power shell下无法运行build.ps1,因为windows默认禁止脚本运行,需要手动打开脚本限制。在命令行输入set-ExecutionPolicy RemoteSigned修改注册表解除脚本限制
3. 编译问题2:
运行build.ps1后警告Could not find package configuration file provided by “OpenCV” with any of following names: OpenCVConfig.cmake, opencv-config.cmake。并提示我设置OpenCV_DIR系统变量到包含该OpenCVConfig.cmake的路径。实际上就是把我之前安装的opencv的系统变量名OpenCV4_2增加一个别名OpenCV_DIR,然后重新编译,发现还是找不到Opencv库。于是打开darknet的cmakelist,手动增加一个变量即:set(OpenCV_DIR D:/Program Installed/opencv-4.2.0/build/install),发现还是不行,后来灵感发现是我的路径里边包含了一个空格,此时在cmakelist语法中自动被切断为2个字符串,如果需要串联,则需要把该字符串增加双引号,并且斜杠要改成正斜杠,即如下,从而完成编译:
if(ENABLE_OPENCV)
set(OpenCV_DIR "D:/Program Installed/opencv-4.2.0/build/install") # 注意要改成正斜杠
find_package(OpenCV)
主题2:YoloV4的预测
这个步骤比较简单,编译安装好以后,按网站指示在命令行执行即可
1. 下载权重:
如果速度慢,可以从一些热心人士找到国内下载,比如https://blog.csdn.net/weixin_43723614/article/details/105772081
2. 在powershell命令行运行代码
就会自动在目录下生成已绘制预测框的图片,这一步就略了。
主题3:YoloV4生成dll用于前向推理调用(部署到其他机器)
当采用YoloV4算法框架,标注自己的数据,训练自己的模型以后,就可以导出dll,把模型和dll一起部署到其他机器上进行推理。
1. 打开项目
打开项目根目录/build/darknet文件夹,里边有4个sln项目文件,分别是如下,打开其中的yolo_cpp_dll.sln项目:
- darknet.sln:用于对darknet进行编译,比如训练已有数据或训练自定义数据
- yolo_cpp_dll.sln:用于生成darknet的动态链接库,用于任何yolo模型的预测
- yolo_cpp_dll_no_gpu.sln:用于生成darknet的无gpu版本动态链接库,用于预测
- yolo_console_dll.sln:用于调用darknet所生成dll的样例项目
2. 对sln项目进行设置
修改如下几条,然后分别选择生成debug/release可以分别生成同名dll文件:
- 修改项目生成target:生成依赖项/生成自定义,选择CUDA10.x自己的cuda版本,否则会报无法加载cuda10.0的属性配置
- 如果报错说OpenCV或者CUDNN无法导入,则需要修改属性/CC++/预处理器/取消预处理器定义,把里边被取消的预处理器OpenCV和CUDNN删掉,并添加到预处理器定义中。
- 注意:两个模式debug/release下生成的dll文件大小不同,分别针对普通cpp项目的debug模式和release模式,并且两者效率差别也较大,其中debug/release版本分别为5Mb/2.5Mb,进行预测需要的时间也是差了4倍,release版本更快。
主题4:在其他项目中调用YoloV4的dll文件进行预测
1. 新建常规cpp项目:
- 打开GPU开关,从而使用GPU预测(假定生成的是yoloV4 GPU版本的dll)
- 打开OPENCV开关,从而使dll中跟OPENCV相关功能可以使用(比如detect时可以直接传入OpenCV的Mat图片进行预测)
- 需要引入yolo的头文件和库文件
2. 拷贝dll生成的文件:
从yolo dll项目的build/darknet/x64文件夹下拷贝头文件/库文件,以及2个线程支持文件到自己项目中即可通过编译,然后把debug/release的2个dll文件分别放到自己项目的debug/release项目中即可通过运行:其中debug下只能使用debug生成的dll,release下也只能使用release生成的dll,否则就会报错。
3. 编译问题1:
如果运行时报错sprintf: 该function may be unsafe.To disable deprecation, use _CRT_SECURE_NO...则可以在项目/属性/CC++/预处理器/预处理器定义中,添加两个宏来取消对sprintf的禁止:_CRT_SECURE_NO_DEPRECATE;_SCL_SECURE_NO_DEPRECATE;
4. 编译问题2
如果报错找不到pthreadVC2.dll,则从build/darknet/x64的文件夹下可找到这个文件pthreadVC2.dll拷贝到自己项目中
5. 调用代码:
#include <iostream>
#include <time.h>
#define OPENCV
#define GPU
#include <opencv2/opencv.hpp>
#include "yolo_v2_class.hpp"
#pragma comment(lib, "yolo_cpp_dll.lib")
// 绘制box函数
void draw_boxes(cv::Mat mat_img, std::vector<bbox_t> result_vec, std::vector<std::string> obj_names, unsigned int fps = 0) {
cv::Scalar color(60, 160, 260);
for (auto &i : result_vec) {
cv::rectangle(mat_img, cv::Rect(i.x, i.y, i.w, i.h), color, 1);
if (obj_names.size() > i.obj_id)
putText(mat_img, obj_names[i.obj_id], cv::Point2f(i.x, i.y - 10), cv::FONT_HERSHEY_COMPLEX_SMALL, 1, color);
if (i.track_id > 0)
putText(mat_img, std::to_string(i.track_id), cv::Point2f(i.x + 5, i.y + 15), cv::FONT_HERSHEY_COMPLEX_SMALL, 1, color);
// 绘制fps
std::string str1 = "FPS: " + std::to_string(fps);
std::string str2 = ", predict time: " + std::to_string((int)(1000/fps));
std::string fps_str = str1 + str2;
putText(mat_img, fps_str, cv::Point2f(200, 20), cv::FONT_HERSHEY_COMPLEX_SMALL, 1, color);
// 输出结果
void show_result(std::vector<bbox_t> const result_vec, std::vector<std::string> const obj_names) {
for (auto &i : result_vec) {
if (obj_names.size() > i.obj_id) std::cout << obj_names[i.obj_id] << " - ";
std::cout << "obj_id = " << i.obj_id << ", x = " << i.x << ", y = " << i.y
<< ", w = " << i.w << ", h = " << i.h
<< std::setprecision(3) << ", prob = " << i.prob << std::endl;
// 获取检测对象名称
std::vector<std::string> objects_names_from_file(std::string const filename) {
std::ifstream file(filename);
std::vector<std::string> file_lines;
if (!file.is_open()) return file_lines;
for (std::string line; file >> line;) file_lines.push_back(line);
std::cout << "object names loaded \n";
return file_lines;
int main()
std::string names_file = "coco.names";
std::string cfg_file = "yolov4-tiny.cfg";
std::string weights_file = "D:\\MyWeights\\yolov4\\yolov4-tiny.weights";
Detector detector(cfg_file, weights_file);//初始化检测器
auto obj_names = objects_names_from_file(names_file);//获得分类对象名称
cv::VideoCapture capture;
capture.open("challenge.mp4");
if (!capture.isOpened())
printf("文件打开失败");
//获取整个帧数
long totalFrameNumber = capture.get(cv::CAP_PROP_FRAME_COUNT);
cv::Mat frame;
cv::namedWindow("video");
clock_t start, end;
for (size_t i = 0; i < totalFrameNumber; i++)
capture >> frame;
start = clock();
std::vector<bbox_t> result_vec = detector.detect(frame);
int fps = (int)(CLOCKS_PER_SEC / (clock() - start));
draw_boxes(frame, result_vec, obj_names, fps);
cv::imshow("video", frame);
cv::waitKey(20);
return 0;
如果喜欢,请点赞哦!
主题1:YoloV4的安装1. 安装过程基于https://github.com/AlexeyAB/darknet所说的windows下编译的第一种方法,即运行.\build.ps1,其中build.ps1是windows下的power shell脚本文件,类似于linux下的makefile,里边build.ps1的内容就不细说主要包括:// 首先获得Program Files(x86)的文件夹路径function getProgramFiles32bit(){}// 然后从Program
文章目录前言1. VS2015新建一个dll项目
前面讲过yolov5的环境配置,源码测试,以及使用TensorRT进行推理加速,但是有时候为了让模型部署在移动端,需要将模型封装成一个动态链接库dll,从而再任意的移动端无需配置环境即可运行,并且通过读取dll方便软件的其他模块进行调用。
1. VS2015新建一个dll项目
......
延续上一篇tTensorRT部署yolov5,大家可以使用生成的yolov5.exe进行终端命令或者VS里面使用命令代码进行检测,但是这样看起来很繁琐很臃肿,有些同学想调用他做一个QT界面啥的,直接调用这个dll就可以进行推理又方便还很快,大家也可以去原博主下面查看,
首选i保证你看了我的第一篇tensort推理yolov5,我们打开cmake编译程序的工程目录:
一.文件创建:
导出库必要文件:dllmain.cpp,framework.h,就在当前工程下面建立这两个文件
// dl....
C#调用YOLOv3算法dll动态链接库
前段时间在搞一个软件,目标是实现细胞计数的功能,当时我细胞计数的算法用到的是YOLOv3目标检测算法,所以就涉及到怎么实现模型落地的问题。当时有个同学在帮老师做项目,他比较懂,我于是向他寻求帮助,但是…可能涉及到了商业机密吧,于是我就自己研究。
我看了很多博客,感觉讲的也不是很到位,或者说没有给出一些干货,今天我来给大家带点干货,当然我是用**C#**调用的YOLOv3动态链接库,如果有需要的小伙伴就拿去吧。
yolov3编译成动态库
大家按照这个链接去GitHub
前面一篇文章我们介绍了怎么在win10下搭建Yolo v3的开发环境。
这篇文章我们将着重介绍YOLO动态链接库的编译,还有如何正确的使用编译出来的Yolo动态链接库进行目标的识别。
首先是编译,对应的工程是“yolo_cpp_dll.sln”,其环境的配置跟上篇文章所讲的“darknet.sln”可以说完全一样,因此不再赘述。需要注意的是这里我们直接编译“release x64”版本,不去管...
要使用C++编写yolov5推理并导入ONNX模型,您需要使用一个深度学习框架来加载和运行模型。我建议使用OpenCV和TensorFlow C++ API来实现这个任务。
以下是基本步骤:
1. 安装OpenCV和TensorFlow C++ API:
- OpenCV可以通过在官方网站上下载安装包来安装。
- TensorFlow C++ API可以通过源码编译或者使用预编译的二进制文件来安装。具体安装方法可以参考TensorFlow官方文档。
2. 下载yolov5模型,将其转换为ONNX格式。
3. 使用OpenCV加载ONNX模型:
cv::dnn::Net net = cv::dnn::readNetFromONNX("path/to/your/onnx/model");
4. 使用OpenCV读取图像并进行预处理:
cv::Mat image = cv::imread("path/to/your/image");
cv::Mat blob = cv::dnn::blobFromImage(image, scale_factor, size, mean, swap_rb, crop);
5. 将数据传递给模型,并运行推理:
net.setInput(blob);
cv::Mat output = net.forward();
6. 将输出结果解析为yolov5的检测结果:
- 可以使用OpenCV的cv::dnn::NMSBoxes函数进行非极大值抑制(NMS)。
- 可以使用OpenCV的cv::Mat::ptr函数获取每个检测框的信息。
7. 将C++代码封装为动态链接库(DLL)。
8. 使用LabVIEW调用DLL,将图像数据传递给DLL,并获取检测结果。
希望这些步骤能对您有所帮助。
python报错ValueError: The truth value of an array with more than one element is ambiguous. Use a.any()
10307