RACN残差超分辨模型在C++中部署踩坑记录
使用版本CUDA12.4,VS2022,Libtorch-2.4Debug版本
首先在pycharm中保存.pt格式的模型文件
在C++中读取.pt格式文件进行推理遇到的问题:
输入图像(128×128)
输出图像(256×256)
找了好长时间问题所在,代码没有报错,C++调用模型在CPU上跑没有这个问题,在CUDA上就会输出上图黑白拼接的图像
解决办法:
问题在输出Tensor格式转CV格式的时候出现内存不连续,应该是数据在CPU和GPU中传输时的问题,可以使用contiguous()这个函数
sr_tensor = sr_tensor.squeeze(0).permute({ 1, 2, 0 }).cpu().contiguous(); // 去除批次维度并确保内存连续
贴出CV格式图片和Tensor相互转换的完整函数:
// 图像转张量的函数
torch::Tensor imageTotensor(cv::Mat& lr_image) {
cv::cvtColor(lr_image, lr_image, cv::COLOR_BGR2RGB);
torch::Tensor lr_tensor = torch::from_blob(lr_image.data, { 1, lr_image.rows, lr_image.cols, 3 }, torch::kByte);
lr_tensor = lr_tensor.permute({ 0, 3, 1, 2 }); // 调整张量维度 (N, C, H, W)
lr_tensor = lr_tensor.toType(torch::kFloat).div(255); // 归一化到[0,1]
return lr_tensor;
}
// 张量转图像的函数
cv::Mat tensorToimage(torch::Tensor& sr_tensor) {
sr_tensor = sr_tensor.squeeze(0).permute({ 1, 2, 0 }).cpu().contiguous(); // 去除批次维度并确保内存连续
sr_tensor = sr_tensor.mul(255.0).clamp(0, 255).to(torch::kU8); // 将张量缩放回[0,255]
cv::Mat sr_image(sr_tensor.size(0), sr_tensor.size(1), CV_8UC3, sr_tensor.data_ptr());
cv::cvtColor(sr_image, sr_image, cv::COLOR_RGB2BGR); // 转回BGR格式以便保存
return sr_image;
}