日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

Pytorch的C++接口实践

發布時間:2023/12/10 c/c++ 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Pytorch的C++接口实践 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Pytorch1.1版本已經提供了相對穩定的c++接口,網上也有了眾多的資料供大家參考,進行c++的接口的初步嘗試。

可以按照對應的選項下載,下面我們要說的是:

如何利用已經編譯好的官方libtorch庫和其他的opencv庫等聯合編寫應用?

其實很簡單,大概的步驟有三步:

第一步:在python環境下將模型導出為jit的模型

第二步:編寫對應的c++ inference 程序。

第三步:直接在VS上(已經成功實驗VS2015,高版本的應該也可以)配置相應的libtorch環境,主要是:

dll路徑:?

PATH=H:\deeplearning_framework\Pytorch\libtorch\libtorch-win-shared-with-deps-debug-latest_cpu\libtorch\lib%3bD:\opencv\build\x64\vc14\bin%3b$(PATH)? 相應地去修改即可,不需要在PC的path環境下加入libtorch的路徑,而是在這里加更加簡單。

include路徑:

H:\deeplearning_framework\Pytorch\libtorch\libtorch-win-shared-with-deps-debug-latest_cpu\libtorch\include\torch\csrc\api\include;H:\deeplearning_framework\Pytorch\libtorch\libtorch-win-shared-with-deps-debug-latest_cpu\libtorch\include;D:\opencv\build\include\opencv2;D:\opencv\build\include\opencv;D:\opencv\build\include;%(AdditionalIncludeDirectories)

主要是加粗線那兩個。

注意一定要去掉SDL的檢查項,否則會出現錯誤警告。

lib路徑:

H:\deeplearning_framework\Pytorch\libtorch\libtorch-win-shared-with-deps-debug-latest_cpu\libtorch\lib;D:\opencv\build\x64\vc14\lib;%(AdditionalLibraryDirectories)

詳細的工程見:https://download.csdn.net/download/xiamentingtao/11486608

這里我們主要改編自:《Win10+VS2017+PyTorch(libtorch) C++ 基本應用》

主要代碼參考:?https://github.com/zhpmatrix/load-pytorch-model-with-c-

一些 常見的問題:

1. opencv的mat讀入libtorch

根據我的實踐,這里的最佳寫法是:

src = imread(s, cv::IMREAD_COLOR); //讀圖// 圖像預處理 注意需要和python訓練時的預處理一致 int org_w = src.cols; int org_h = src.rows;torch::Tensor img_tensor = torch::from_blob(src.data, { org_h, org_w,3 }, torch::kByte); //將cv::Mat轉成tensor,大小為448,448,3 img_tensor = img_tensor.permute({ 2, 0, 1 }); //調換順序變為torch輸入的格式 3,448,448 img_tensor = img_tensor.toType(torch::kFloat32).div_(255);

注意要先將uint8的圖像先讀入,再轉換成float型。

2. Tensor 轉換成cv::Mat

cv::Mat input(img_tensor.size(1), img_tensor.size(2), CV_32FC1, img_tensor.data<float>());

注意這里一定是CV_32FC1而不是CV_32FC3

另外的方式見:https://discuss.pytorch.org/t/convert-torch-tensor-to-cv-mat/42751/2

torch::Tensor out_tensor = module->forward(inputs).toTensor(); assert(out_tensor.device().type() == torch::kCUDA); out_tensor=out_tensor.squeeze().detach().permute({1,2,0}); out_tensor=out_tensor.mul(255).clamp(0,255).to(torch::kU8); out_tensor=out_tensor.to(torch::kCPU); cv::Mat resultImg(512, 512,CV_8UC3); std::memcpy((void*)resultImg.data,out_tensor.data_ptr(),sizeof(torch::kU8)*out_tensor.numel());

3. model的輸出處理

如果只有一個返回值,可以直接轉tensor:auto outputs = module->forward(inputs).toTensor();如果有多個返回值,需要先轉tuple:auto outputs = module->forward(inputs).toTuple(); torch::Tensor out1 = outputs->elements()[0].toTensor(); torch::Tensor out2 = outputs->elements()[1].toTensor();

4.Tracing fails because of “parameter sharing”?

看這個案例:https://discuss.pytorch.org/t/help-tracing-fails-because-of-parameter-sharing/40324

其中的部分代碼如上,問題就出現在這些畫框的地方,主要是這里初始化重復使用了相同的模塊進行賦值,例如self.encoder與self.conv1。

解決的辦法就是在構造slef.conv1時,對self.encoder[0]加入deepcopy修飾。

即:

from copy import deepcopy self.conv1 = nn.Sequential(deepcopy(self.encoder[0]),deepcopy(self.relu),deepcopy(self.encoder[2]),deepcopy(self.relu))

參考:https://github.com/pytorch/pytorch/issues/8392#issuecomment-431863763

5. 關于python導出模型的問題

如果訓練的pytorch模型保存在cpu上,想在測試時使用gpu模式,則我們需要設置python端保存模型在gpu上,然后才能c++上使用gpu測試。

主要的方法就是:

checkpoint = torch.load(model_path, map_location="cuda:0") #very important# create modelmodel = TheModelClass(*args, **kwargs)model.load_state_dict(checkpoint)model.to(device)model.eval()x = torch.rand(1, 3, 448, 448)x = x.to(device) # very importanttraced_script_module = torch.jit.trace(model.model, x)traced_script_module.save("**.pt")

然后才能在c++上使用gpu模式,方法為:

std::shared_ptr<torch::jit::script::Module> module = torch::jit::load(argv[1]);module->to(at::kCUDA);assert(module != nullptr);std::cout << "ok\n";// 建立一個輸入,維度為(1,3,224,224),并移動至cudastd::vector<torch::jit::IValue> inputs;inputs.push_back(torch::ones({1, 3, 224, 224}).to(at::kCUDA));// Execute the model and turn its output into a tensor.at::Tensor output = module->forward(inputs).toTensor();

參考:

?

pytorch跨設備保存和加載模型(變量類型(cpu/gpu)不匹配原因之一)

https://pytorch.org/tutorials/beginner/saving_loading_models.html

https://blog.csdn.net/IAMoldpan/article/details/85057238

參考文獻:

1.利用Pytorch的C++前端(libtorch)讀取預訓練權重并進行預測

2.Pytorch的C++端(libtorch)在Windows中的使用

3.?https://pytorch.org/tutorials/advanced/cpp_frontend.html

4.?https://zhpmatrix.github.io/2019/03/01/c++-with-pytorch/

5.?Windows使用C++調用Pytorch1.0模型

6.?用cmake構建基于qt5,opencv,libtorch項目

7.?c++調用pytorch模型并使用GPU進行預測?(較好的例子)

8.?Ptorch 與libTorch 使用過程中問題記錄

9.?c++ load pytorch 的數據轉換

?

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的Pytorch的C++接口实践的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。