利用libtorch和c++完成retinanet的预测部分

利用libtorch和c++完成retinanet的预测部分

写在前面

一、探索过程和错误

错误一:E0135 namespace “torch::jit” 没有成员 “load”
解决方式:添加头文件<torch/script.h>

来源:https://blog.csdn.net/jacke121/article/details/93322398

错误二:E0020 未定义标识符 “CV_BGR2RGB”
解决方式:CV已经改为COLOR(在cvtcolor()函数中)

来源:https://zouzhongliang.com/index.php/2019/08/19/opencv-yansekongjianzhuanhuanhanshucvtcoloryunyong/

错误三:E0135 class “at::DeprecatedTypeProperties” 没有成员 “tensorFromBlob”
原因:该为旧版代码,新版需要更改:
 //auto img_tensor = torch::CPU(torch::kFloat32).tensorFromBlob(float_image.data, { 1, img_size, img_size, 3 });   //将cv::Mat转成tensor,大小为1,224,224,3
        //img_tensor = img_tensor.permute({ 0, 3, 1, 2 });  //调换顺序变为torch输入的格式 1,3,224,224
        img_tensor[0][0] = img_tensor[0][0].sub_(0.485).div_(0.229);  //减去均值,除以标准差
        img_tensor[0][1] = img_tensor[0][1].sub_(0.456).div_(0.224);
        img_tensor[0][2] = img_tensor[0][2].sub_(0.406).div_(0.225);
//新改的:     
        auto img_tensor = torch::from_blob(image.data, { 1, img_size, img_size, 3 }).permute({ 0, 3, 1, 2 }).to(torch::kCUDA);
        

        auto img_var = torch::autograd::make_variable(img_tensor, false);  //不需要梯度

来源:https://blog.csdn.net/jacke121/article/details/93487947

错误四:E0312 不存在用户定义的从 “const std::experimental::filesystem::v1::path” 到 “std::string” 的适当转换
错误五: E0349 没有与这些操作数匹配的 “!=” 运算符 操作数类型为: torch::jit::script::Module != std::nullptr_t
torch::jit::script::Module module = torch::jit::load(model_path);  //load model
module.to(at::kCUDA);  // put model to gpu
assert(module != nullptr);
解决方案和原因:由于新版本更新,module已经不是指针,所以直接删去这句话即可
错误六: E0035 #error 指令: The <experimental/filesystem> header providing std::experimental::filesystem is deprecated by Microsoft and will be REMOVED. It is superseded by the C++17 header providing std::filesystem. You can define _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING to acknowledge that you have received this warning.
解决方案和原因:将头文件#include <experimental/filesystem>改为#include 即可

来源:https://www.cnblogs.com/qq2806933146xiaobai/p/12153852.html

错误七:namespace std 没有filesystem 成员
解决方案:更改属性为最新标准

image.png
来源:https://blog.csdn.net/weixin_39450145/article/details/104691189

延续错误:不存在’std :: filesystem :: path’到’std :: string’的转换

原因:在msvs编译器,Windows下,std::filesystem::path隐式转换为wstring。

错误八: E0266 “ACCESS_MASK” 不明确 Project2 C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\um\winioctl.h 11122

错误原因和解决方案:与opencv的cv命名空间有冲突,取消using namespace cv,改为使用cv::function的方式就可以了。

错误八九的代码:

出处:https://blog.csdn.net/liminwang0311/article/details/79975174(已更改,见下面)

#include <Windows.h>
//将string转换成wstring  
wstring string2wstring(string str)  
{  
    wstring result;  
    //获取缓冲区大小,并申请空间,缓冲区大小按字符计算  
    int len = MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.size(), NULL, 0);  
    TCHAR* buffer = new TCHAR[len + 1];  
    //多字节编码转换成宽字节编码  
    MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.size(), buffer, len);  
    buffer[len] = '\0';             //添加字符串结尾  
    //删除缓冲区并返回值  
    result.append(buffer);  
    delete[] buffer;  
    return result;  
}  
  
//将wstring转换成string  
string wstring2string(wstring wstr)  
{  
    string result;  
    //获取缓冲区大小,并申请空间,缓冲区大小事按字节计算的  
    int len = WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), wstr.size(), NULL, 0, NULL, NULL);  
    char* buffer = new char[len + 1];  
    //宽字节编码转换成多字节编码  
    WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), wstr.size(), buffer, len, NULL, NULL);  
    buffer[len] = '\0';  
    //删除缓冲区并返回值  
    result.append(buffer);  
    delete[] buffer;  
    return result;  
} 
错误九:E0266 “byte” 不明确 Project2 C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\shared\rpcndr.h 192

参考:http://www.mamicode.com/info-detail-191940.html,未验证,没有再使用上面的代码。
更改使用:http://www.cppblog.com/kenwell/archive/2008/05/21/50661.html

错误十(警告):C4996 ‘mbstowcs’: This function or variable may be unsafe. Consider using mbstowcs_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. Project2 E:\C++\retinanet_c\Project2\Project2\main.cpp 48

或者:
错误 C4996 ‘std::is_podc10::impl::PODLocalTensorTypeSet’: warning STL4025: std::is_pod and std::is_pod_v are deprecated in C++20. The std::is_trivially_copyable and/or std::is_standard_layout traits likely suit your use case. You can define _SILENCE_CXX20_IS_POD_DEPRECATION_WARNING or _SILENCE_ALL_CXX20_DEPRECATION_WARNINGS to acknowledge that you have received this warning. Project2 E:\C++\retinanet_c\libtorch\include\c10\core\impl\LocalTensorTypeSet.h 45

解决方案:屏蔽警告
#pragram warning(disable : 4996)
//写在main.cpp的最前面

或者查询后更改。
官方解释:https://docs.microsoft.com/zh-cn/cpp/preprocessor/warning?view=vs-2019

错误十一:C2871 “chrono”: 具有该名称的命名空间不存在 Project2 E:\C++\retinanet_c\Project2\Project2\main.cpp 16

解决方案:可以直接去掉using namespace chrono

错误十二:缺少.pdb文件:

类似这样:image.png
或者:未加载kernelbase.pdb

解决方案:1.已知.pdb位置,找到并复制到main.cpp文件同一目录下即可;
2.未知的,可以参考https://blog.csdn.net/u011251940/article/details/89521518,不一定有效

代码:

torch::jit::script::Module module = torch::jit::load(model_path);
我的原因和有效解决方案:model_path的实际内容不正确,不是torch script生成的.pt文件,造成的,更改了一个torch script生成的.pt文件就解决了。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值