前言
之前我们通过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.h和Darknet.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-----------
有用可以点个大拇指哦 🤭
【作者有话说】
以上内容仅为博主自主整理分享,很多内容也是来源于网络,若有侵权,请私聊告知
大家有任何问题可在评论区讨论交流~