You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C++中实现PyTorch分割模型的对应预处理逻辑?

PyTorch分割模型C++部署:Python预处理转LibTorch/OpenCV等效代码

以下是将你提供的Python预处理/后处理逻辑转换为C++(基于LibTorch和OpenCV)的完整实现,每一步严格对应原Python逻辑:

必要头文件

#include <opencv2/opencv.hpp>
#include <torch/torch.h>
#include <torch/script.h>

完整代码实现

// 加载预转换的TorchScript模型
torch::jit::script::Module model = torch::jit::load("your_model.pt");
model.to(torch::kCUDA);
model.eval(); // 切换到推理模式,禁用训练相关层

// 替换为你的实际参数
std::vector<float> channel_means = {0.5};    // 单通道均值,彩色图设为3个RGB对应值
std::vector<float> channel_stds = {0.5};     // 单通道标准差,彩色图设为3个RGB对应值
cv::Size input_size(512, 512);               // 模型输入尺寸 (width, height)
cv::Mat img = cv::imread("input_image.jpg", cv::IMREAD_GRAYSCALE); // 读入单通道图,彩色用IMREAD_COLOR
int img_width = img.cols;
int img_height = img.rows;

// 1. Resize到模型输入尺寸(对应Python的cv.resize)
cv::Mat img_resized;
cv::resize(img, img_resized, input_size, 0, 0, cv::INTER_AREA);

// 2. 转换为LibTorch Tensor(对应Python的ToTensor())
// OpenCV Mat是HWC格式,转CHW并将0-255 uint8转为0-1 float32
torch::Tensor tensor = torch::from_blob(img_resized.data, 
                                       {img_resized.rows, img_resized.cols, img_resized.channels()}, 
                                       torch::kUInt8)
                          .to(torch::kFloat32)
                          .div(255.0)
                          .permute({2, 0, 1}); // HWC -> CHW

// 3. 归一化(对应Python的Normalize)
torch::Tensor mean = torch::tensor(channel_means).view({1, -1, 1, 1});
torch::Tensor std = torch::tensor(channel_stds).view({1, -1, 1, 1});
tensor = tensor.sub(mean).div(std);

// 4. 增加Batch维度并转到CUDA(对应Python的unsqueeze(0).cuda())
tensor = tensor.unsqueeze(0).to(torch::kCUDA);

// 5. 模型推理
torch::NoGradGuard no_grad; // 禁用梯度计算,节省显存
torch::Tensor mask_tensor = model.forward({tensor}).toTensor();

// 6. 后处理(对应Python的sigmoid、转CPU、Resize回原图)
// 提取单通道结果并计算sigmoid
mask_tensor = torch::sigmoid(mask_tensor.select(0, 0).select(0, 0))
                  .to(torch::kCPU)
                  .contiguous();

// 将Tensor转为OpenCV Mat
cv::Mat mask(img_resized.rows, img_resized.cols, CV_32F, mask_tensor.data_ptr<float>());

// Resize回原图尺寸
cv::Mat mask_resized;
cv::resize(mask, mask_resized, cv::Size(img_width, img_height), 0, 0, cv::INTER_AREA);

// 可选:转换为0-255的uint8格式用于可视化/保存
cv::Mat mask_uint8;
mask_resized.convertTo(mask_uint8, CV_8U, 255.0);

关键细节说明

  • 彩色图适配:若处理彩色图像,只需将cv::IMREAD_GRAYSCALE改为cv::IMREAD_COLOR,同时将channel_means和channel_stds设为3个RGB通道对应的值。
  • 内存安全:torch::from_blob直接复用OpenCV Mat的内存,若需避免原Mat被释放导致的错误,可调用tensor.clone()复制数据。
  • 推理优化:model.eval()会关闭Dropout、BatchNorm等训练专属层;torch::NoGradGuard禁止梯度计算,大幅降低显存占用。

内容的提问来源于stack exchange,提问作者Mohamed Hedeya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 07:09:19