vs2019使用Darknet调用YOLOV3模型并测试(CPU+GPU)

前言

之前我们通过libtorch实现了在C++项目中调用pytorch网络模型。

下面将分享使用另一种方法(Darknet)实现yolo模型的调用,其大概思路和libtorch方法差不多,都是先在pycharm上训练模型,然后在C++端调用模型。
但具体实现方法有一些区别:

Libtorch方法:

1、pycharm训练模型,保存pth权值文件
2、将模型和pth文件保存为pt模型文件
3、在c++端调用pt模型

Darknet方法:

1、pycharm训练模型,保存pth权值文件
2、将pth文件转换为weights文件
3、下载yolo模型结构文件(.cfg格式)
3、在c++端调用模型

实现步骤

1

训练模型,将.pth权值文件转换为.weights权值文件,实际就是按照网络结构保存每层的权值
----如果仅仅只需要看yolo检测的效果,可以在网络上下载已经在公开数据集上训练好的.weights文件,这里的转换,是为了方便导入自己训练好的模型。
在这里插入图片描述

需要代码文件的话,可以在评论区给我留言。😃

:可能在进行转换时,会报以下错误。
在这里插入图片描述
显示键值错误--------这是因为我网络里的每层的名称和你的名称不一样

解决方法
在导入net的代码下打一个断点,用debug方式运行py文件。如下:
在这里插入图片描述
点开net,即可看见每层的名称,在代码相应位置将名称修改成和自己网络的一致就ok了。😀
在这里插入图片描述

2

下载yolov3.cfg 文件,里面是模型的网络结构信息。
因为在后续导入模型时,需要从.cfg文件中获取模型结构,所以需要提前准备好
yolov3.cfg(提取码:bjyx)

tip:若自己在训练网络时,更改了anchors等参数,记得在文档中相应位置也要修改(注意共有三处)
在这里插入图片描述

3

在vs项目里导入模型,需要用到Darknet结构体,所以需要准备好Darknet.hDarknet.cpp文件。
Darknet(提取码:bjyx)

CPU: 使用cpu运算,可直接创建项目进行编译
1.导入头文件

#include "Darknet.h"

2.设置使用cpu或gpu (darknet的构造函数需要,可自行重写构造函数,此处不做详述)

torch::DeviceType device_type;
if (torch::cuda::is_available() ) {        
    device_type = torch::kCUDA;
    std::cout << "Using cuda..." << endl;
} else {
    device_type = torch::kCPU;
    std::cout << "Using cpu..." << endl;
}
torch::Device device(device_type);

3.加载模型

int input_image_size =608;

Darknet net("../models/yolov3.cfg", &device);      //.cfg

map<string, string> *info = net.get_net_info();

info->operator[]("height") = std::to_string(input_image_size);

net.load_weights("../models/12_13_yolov3.weights");        //.weights
std::cout << "模型导入成功 ..." << endl;

4.图片预测

auto output = net.forward(img_tensor);         //直接传入tensor进行预测
std::cout << "图像已预测完成。。" << endl;
// filter result by NMS 
// class_num = 23
// confidence = 0.5
// nms_conf = 0.3
auto result = net.write_results(output, 23, 0.5, 0.3);      //对预测结果进行筛选

当被测图像中没有目标时,result维度为1;含有目标时,维度为2,第0维的size数目标个数
如:在这里插入图片描述

GPU: 使用gpu运算时,需要利用cmake进行编译,相关操作可看我另一篇文章
☞直通车
.cpp文件写法和cpu方法中一样。可以参考的cmakelists.txt写法:

cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
project(yolo-app)

find_package( OpenCV REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} )

find_package(Torch REQUIRED)

aux_source_directory(. DIR_SRCS)

add_executable(yolo-app ${DIR_SRCS})
target_link_libraries(yolo-app "${TORCH_LIBRARIES}" "${OpenCV_LIBS}")
set_property(TARGET yolo-app PROPERTY CXX_STANDARD 14)

--------tbc-----------
有用可以点个大拇指哦 🤭

【作者有话说】
以上内容仅为博主自主整理分享,很多内容也是来源于网络,若有侵权,请私聊告知
大家有任何问题可在评论区讨论交流~

### YOLOv3 模型部署教程和最佳实践 #### 准备工作 为了成功部署YOLOv3模型,需先准备好环境。这通常涉及安装必要的依赖项以及下载预训练权重文件[^1]。 对于开发环境而言,推荐使用Anaconda来管理Python包及其版本。创建一个新的虚拟环境并激活它之后,按照官方文档中的指导安装PyTorch和其他所需的库,比如OpenCV等工具,它们有助于图像处理和支持实时视频分析任务。 #### 导入与加载模型 一旦完成了上述准备工作,则可以通过如下方式导入YOLOv3: ```python from models import * # 假设这是自定义模块所在位置 import torch device = 'cuda' if torch.cuda.is_available() else 'cpu' model = Darknet('cfg/yolov3.cfg', img_size=(416, 416)).to(device) if device == 'cuda': model.load_darknet_weights('weights/yolov3.weights') else: weights = torch.load('weights/yolov3.pth')['state_dict'] model.load_state_dict(weights) ``` 这段代码展示了如何实例化Darknet类对象,并指定配置文件路径(`yolov3.cfg`);接着判断当前是否有可用GPU加速计算过程——如果有就调用`load_darknet_weights()`方法读取原始`.weights`格式的参数值;反之则尝试加载转换后的PyTorch checkpoint (`pth`) 文件。 #### 推理阶段优化建议 当考虑实际应用场景下的性能表现时,可采取一些措施提高效率: - **量化感知训练(QAT)** 或者 静态/动态量化的技术能够减少存储空间需求的同时保持较高的精度水平; - 利用TensorRT这样的专用推理引擎进一步提升速度; - 将模型转化为更轻便的形式如ONNX以便跨平台移植性更好[^3]。 例如,在完成QAT流程后保存新的整数量化版checkpoint再用于后续推断环节中。 #### 实际案例分享 以Android端为例介绍具体做法。考虑到移动端资源有限的特点,除了采用ncnn框架外还可以探索其他适合手机运行的选择,像MNN、SNPE等等。针对特定硬件特性做出适当调整往往能带来意想不到的效果。此外,利用C++编写native层逻辑配合JNI接口传递数据给Java部分也是常见方案之一[^4]。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

8倍

谢谢大佬~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值