C++libtorch实现模型部署推理
模型
- 全连接模型:公开mnist手写识别数字的十分类
- 卷积模型:自行采集的鲜花四分类
部署
语言环境:C++
对比Python
python是解释性语言,效率很慢,安全性很低
系统开发一般是java、C/C++,python无法直接部署到系统上
pytorch部署
原生部署,不会丢失精度
环境
下载torch-c+±cpu-release版本,下载点击
注意:debug版本用于模型开发
opencv-c++版本,传送门:Releases - OpenCV
推荐安装带星号版本的windows版本
下载CLion,并配置环境,具体步骤可参考之前笔记传送门:安装CLion配置opencv和torch环境
模型打包
torch.jit进行打包
traced_model = jit.trace(model, data)
traced_model.save("model.pt")
C++实现推理
全连接模型推理
#include <opencv2/opencv.hpp>
#include <torch/torch.h>
#include <torch/script.h>
#include <vector>
#include <string>
int main() {
cv::Mat image = cv::imread("img/0.jpg",cv::IMREAD_GRAYSCALE);
torch::Tensor tensor_image = torch::from_blob(image.data,{1,image.rows*image.cols},torch::kByte).toType(torch::kFloat);
tensor_image /= 255.;
// std::cout<<tensor_image<<std::endl;
auto model = torch::jit::load("model/mnist.pt");
std::vector<torch::jit::IValue> inputs;
inputs.push_back(tensor_image);
auto rst = model.forward(inputs).toTensor();
std::cout<< rst << std::endl;
std::cout<< torch::argmax(rst,1) << std::endl;
}
卷积模型推理
#include <torch/script.h> // 包含TorchScript头文件
#include <torch/torch.h>
#include <opencv2/opencv.hpp>
#include <iostream>
#include <memory>
int main() {
// 加载模型
torch::jit::script::Module module;
module = torch::jit::load("model/model.pt");
// 读取并处理图像
cv::Mat image = cv::imread("img/flower_1.jpg");
// 根据模型输入大小调整
cv::resize(image, image, cv::Size(224, 224));
// 将BGR转换为RGB
cv::cvtColor(image, image, cv::COLOR_BGR2RGB);
// 转换图像为Tensor
torch::Tensor img_tensor = torch::from_blob(
image.data,
{1, 3, image.rows, image.cols},
torch::kByte
);
// 转换为浮点
img_tensor = img_tensor.to(torch::kFloat);
// 归一化到[0, 1]
img_tensor = img_tensor.div(255.0);
// 准备输入
std::vector<torch::jit::IValue> inputs;
inputs.push_back(img_tensor);
// 执行模型推理
at::Tensor output = module.forward(inputs).toTensor();
// 输出结果
std::cout << "Model output: " << output << '\n';
return 0;
}
鲜花四分类模型输出四个结果如下,即为成功转换模型