關於深度學習實時檢測的三種方法(一)——libtorch構建網絡並直接預測

碼道人 2021-08-15 20:42:05 阅读数:754

本文一共[544]字,预计阅读时长:1分钟~
深度 方法 libtorch 直接

簡介

樓主在這一年從事的圖像實時檢測中涉及到深度學習的內容,於是在沒有積累的情况下自己探索了三種方法,接下來分為三篇文章依次進行介紹並對比分析它們的優點。

目前使用比較廣泛的深度學習框架有pytorch和TensorFlow兩種,我選擇使用的是pytorch,但原本的工程是基於C++實現的,為了適配於pytorch我發現了libtorch。libtorch可以說是pytorch的C++移植版本,其安裝和使用簡單,也不需要複雜的環境配置。本文章將介紹如何用libtorch實現構建神經網絡並且加載模型進行預測。

libtorch安裝

pytorch官網我們可以直接下載libtorch的發行版本,這裏提供CPU版本的下載地址

https://download.pytorch.org/libtorch/cpu/libtorch-cxx11-abi-shared-with-deps-1.9.0%2Bcpu.zip

直接下載壓縮包後解壓即可

官方有提供cmake鏈接libtorch庫的教程,大家可以參考教程進行配置,這裏也簡單介紹以下。

項目工程的cmakelists下鏈接libtorch只需要完成下列幾個步驟:

1.指定libtorch目錄

set(CMAKE_PREFIX_PATH ~/libtorch)

2.搜索libtorch的package

find_package(Torch REQUIRED)

3.鏈接libtorch庫

target_link_libraries(需要鏈接庫的名稱 Libtorch)

4.檢驗是否配置成功

運行下列cpp代碼:

#include <torch/torch.h>
#include <iostream>
int main() {
torch::Tensor tensor = torch::rand({2, 3});
std::cout << tensor << std::endl;
}

若結果為:

0.2063 0.6593 0.0866
0.0796 0.5841 0.1569

即配置成功。

libtorch構建網絡

這裏簡要介紹一下libtorch構建神經網絡的方法,以簡單的LeNet5網絡為例:

調用libtorch我們需要先引入兩個頭文件

#include <torch/script.h> // One-stop header.
#include <torch/torch.h>

定義網絡結構並封裝成庫

struct LeNet5 : torch::nn::Module
{
LeNet5(){};
LeNet5(int num_class, int padding);
torch::Tensor forward(torch::Tensor X);
torch::nn::Conv2d C1{nullptr};
torch::nn::Conv2d C2{nullptr};
torch::nn::Linear FC1{nullptr};
torch::nn::Linear FC2{nullptr};
torch::nn::Linear FC3{nullptr};
void Train();
void Test(const string& address);
void SaveModel(torch::serialize::OutputArchive& archive, const string& path);
};

網絡結構的內部實現

/** * @brief LeNet5 構造函數 * 共七層 * @note */
LeNet5::LeNet5(int num_class, int padding)
{
this->C1 = register_module("C1", torch::nn::Conv2d(torch::nn::Conv2dOptions(1, 6, {5, 5}).padding(padding)));
this->C2 = register_module("C2", torch::nn::Conv2d(torch::nn::Conv2dOptions(6, 16, {5, 5})));
this->FC1 = register_module("FC1", torch::nn::Linear(torch::nn::LinearOptions(400, 120)));
this->FC2 = register_module("FC2", torch::nn::Linear(torch::nn::LinearOptions(120, 84)));
this->FC3 = register_module("FC3", torch::nn::Linear(torch::nn::LinearOptions(84, num_class)));
}
/** * @brief 前饋函數,計算權重 */
torch::Tensor LeNet5::forward(torch::Tensor X)
{
//卷積池化層
X = this->C1->forward(X);
X = torch::nn::functional::relu(X);
//最大池化
X = torch::max_pool2d(X, {2, 2}, 2);
X = this->C2->forward(X);
X = torch::nn::functional::relu(X);
//最大池化
X = torch::max_pool2d(X, {2, 2}, 2);
//全連接層
X = X.view({X.size(0), -1});
X = FC1->forward(X);
X = torch::nn::functional::relu(X);
X = FC2->forward(X);
X = torch::nn::functional::relu(X);
X = FC3->forward(X);
return X;
}

損失函數和優化器

損失函數可以在torch::nn中選擇,優化器在torch::optim中也有定義,示例:

// 損失函數定義成交叉熵損失
auto criterion = torch::nn::CrossEntropyLoss();
// 優化器選擇SGD優化器
auto optimizer = torch::optim::SGD(this->parameters(), torch::optim::SGDOptions(0.005).momentum(0.9));

保存模型

libtorch的模型需要保存為torch::serialize::OutputArchive類型,所以可以參考一下方法:

// 實例化保存模型類型
torch::serialize::OutputArchive archive;
// 保存模型參數
this->save(archive);
// 設置保存路徑
archive.save_to(path);

總結

libtorch雖然使用簡單方便,但是對於深度學習領域C++對比Python本就不占優勢,且移植過程也有很多不適配的地方,所以libtorch在一些方面性能上略差於原本的pytorch,對於實時要求很高的檢測中並不適用。

參考內容

INSTALLING C++ DISTRIBUTIONS OF PYTORCH

版权声明:本文为[碼道人]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/08/20210815204156382a.html