c++调用yolov5模型
时间: 2023-10-14 17:30:05 浏览: 105
C++ OnnxRuntime部署yolov8模型【步骤完整详细】
5星 · 资源好评率100%
要在C++中调用Yolov5模型,可以使用以下步骤:
1. 安装OpenCV和Libtorch库。OpenCV用于图像处理,Libtorch用于深度学习模型的加载和预测。
2. 下载并加载Yolov5模型。可以使用PyTorch将预训练的Yolov5模型转换为Libtorch格式,然后在C++中加载它们。加载模型时,需要指定输入图像的大小和通道数,并设置模型的推理模式为eval。
3. 准备输入图像。将输入图像读入内存并转换为Libtorch张量。
4. 运行模型。将输入张量传递给模型,并使用forward函数进行推理。模型将返回一个输出张量,其中包含检测到的物体的位置和类别。
5. 解析输出结果。从输出张量中提取检测结果,并将它们绘制到图像上,或者将它们输出到控制台。
这里是一个简单的示例代码,演示如何加载Yolov5模型并运行它:
```c++
#include <torch/script.h>
#include <opencv2/opencv.hpp>
int main()
{
// Load model
torch::jit::script::Module module = torch::jit::load("yolov5s.pt");
// Input image size
const int input_size = 640;
// Input channels
const int input_channels = 3;
// Set model to evaluation mode
module.eval();
// Prepare input image
cv::Mat image = cv::imread("test.jpg");
cv::resize(image, image, cv::Size(input_size, input_size));
cv::cvtColor(image, image, cv::COLOR_BGR2RGB);
torch::Tensor input_tensor = torch::from_blob(image.data, {1, input_size, input_size, input_channels}, torch::kByte);
input_tensor = input_tensor.permute({0, 3, 1, 2}).to(torch::kFloat).div(255);
// Run model
std::vector<torch::jit::IValue> inputs;
inputs.push_back(input_tensor);
torch::Tensor output_tensor = module.forward(inputs).toTensor();
// Parse output results
const int num_classes = 80;
const float conf_threshold = 0.5;
const float nms_threshold = 0.5;
std::vector<cv::Rect> boxes;
std::vector<int> classes;
std::vector<float> scores;
auto output = output_tensor.squeeze().detach().cpu();
auto idxs = output.slice(1, 4, 5).argmax(1);
auto confs = output.slice(1, 4, 5).index_select(1, idxs).squeeze();
auto mask = confs.gt(conf_threshold);
auto boxes_tensor = output.slice(1, 0, 4).masked_select(mask.unsqueeze(1).expand_as(output.slice(1, 0, 4))).view({-1, 4});
auto scores_tensor = confs.masked_select(mask).view({-1});
auto classes_tensor = output.slice(1, 5).masked_select(mask).view({-1});
torch::Tensor keep = torch::empty({scores_tensor.size(0)}, torch::kBool);
torch::argsort(scores_tensor, 0, true, keep);
auto keep_vec = keep.cpu().numpy();
for (int i = 0; i < keep_vec.shape[0]; i++) {
int index = keep_vec[i];
int cls = classes_tensor[index].item<int>();
float score = scores_tensor[index].item<float>();
cv::Rect box;
box.x = boxes_tensor[index][0].item<int>();
box.y = boxes_tensor[index][1].item<int>();
box.width = boxes_tensor[index][2].item<int>() - box.x;
box.height = boxes_tensor[index][3].item<int>() - box.y;
boxes.push_back(box);
classes.push_back(cls);
scores.push_back(score);
}
// Non-maximum suppression
std::vector<int> indices;
cv::dnn::NMSBoxes(boxes, scores, conf_threshold, nms_threshold, indices);
// Draw detection results
for (int i = 0; i < indices.size(); i++) {
int idx = indices[i];
cv::rectangle(image, boxes[idx], cv::Scalar(0, 255, 0), 2);
cv::putText(image, cv::format("%s %.2f", "class", scores[idx]), cv::Point(boxes[idx].x, boxes[idx].y - 10), cv::FONT_HERSHEY_SIMPLEX, 0.5, cv::Scalar(0, 255, 0), 2);
}
// Display detection results
cv::imshow("Detection", image);
cv::waitKey();
return 0;
}
```
其中,test.jpg是输入图像的文件名,yolov5s.pt是预训练的Yolov5模型文件名。在该代码中,我们使用OpenCV对输入图像进行处理,并使用Libtorch加载和运行模型,最终将检测结果绘制到图像上。
阅读全文