RACN残差超分辨模型在C++中部署,输出错误的黑白拼接图

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值