QT Creator + Opencv4.x + Libtorch1.7配置


前言

純c++用戶而言如果要自研產品,會一個圖形界面編程工具還是有必要的。大多數c++用戶,如果在Windows平台開發則多使用微軟全家桶,如果是Linux平台則可能是其他工具再cmake。這篇博客將記錄Windows平台,QT Creator中Opencv和Libtorch的配置。網上有較多關於使用Mingw編譯Opencv源碼以供QT Creator使用的,事實上,只是基於Opencv和Libtorch的api做開發的話,無需編譯。正確的流程為:安裝QT Creator時,勾選MSVC編譯器,下載opencv的exe文件和libtorch的官方版壓縮包,隨后配置Release版本的項目即可。如要直接看正確步驟,前往本文“正確步驟”小節即可。各工具版本:

  • QT Creator 4.11.0 (Community)
  • QT 5.14.1
  • OpenCV 4.5.0(官網) 4.1.1 x64(MingW輪子庫版)
  • Libtorch 1.7.0(官網)
  • CUDA 10.2
  • CUDNN(適配CUDA10.2版本)

QT Creator安裝不全,編譯器選擇錯誤,OpenCv使用困難

由於自己以前主力開發工具是微軟全家桶,主要Visual Studio寫c++,VS code寫python這樣,QT Creator大致了解后簡單裝了下,只有MingW x64編譯器,這導致OpenCV不能像在Visual Studio一樣直接官網下載.exe解壓添加動態庫即可。由於不了解QT Creator,配置時直接按照網上部分博客在.pro中修改,導致出錯。

直接下載opencv官網.exe,使用MingW編譯主要錯誤表現為:

  1. 控制台無法輸出,即QT Creator最下方3 應用程序輸出只有Debugging starts和Debugging has finished字樣。
  2. cv::Mat可以使用,但是imread和imshow均無法使用,右鍵項目重新構建時出現 undefined reference to `cv::imread(cv::String const....

錯誤undefined reference to也就是“未定義的標識符”錯誤,這是因為沒有正確關聯.lib文件,工程只能找到函數聲明,無法找到定義。然后一頓折騰,以為自己.pro文件中的INCLUDEPATH和LIBS配置不對,各種魔改都沒有效果。最后看某個博客說因為OpenCV官網提供的是MSVC編譯的,如果想基於MingW開發,需要前往這個GitHub上下載需要版本。OpenCV在2.4.10及之后版本不再提供MingW編譯的Lib。如果要跨平台做基於OpenCV的開發,要么自己用MingW編譯一次OpenCV源碼,要么用網上已有的輪子。

選用輪子庫里的MinGW-OpenCV-4.1.1-x64,在.pro文件中配置好庫文件如下:

INCLUDEPATH += your path to\MinGW-OpenCV-4.1.1-x64\include

LIBS+=your path to\MinGW-OpenCV-4.1.1-x64\x64\mingw\lib\libopencv_*.a

*是正則表示任意字符串。QT Creator中的配置路徑很有趣,同時接受/,//,\和\。在.pro文件改好后,選擇構建build,執行qmake,然后再右鍵項目,選擇重新構建,此時無論項目配置使用Release或者Debug編譯均可通過。同時,也可以在Linux中做OpenCV開發。

Libtorch只能用MSVC編譯器直接調用

有了配置成功OpenCV的經驗,就自然想繼續用MingW配置Libtorch,找到pytorch官網提供的libtorch下載Debug或者Release版本。以Release版本為例配置.pro如下:

INCLUDEPATH += your path to\MinGW-OpenCV-4.1.1-x64\include \
your path to\libtorch17release\include \
your path to\libtorch17release\include\torch\csrc\api\include

LIBS+=your path to\MinGW-OpenCV-4.1.1-x64\x64\mingw\lib\libopencv_*.a \
your path to\libtorch17release\lib\*.lib \
your path to\libtorch17release\lib\*.dll

qmake, 重新構建,產生159個warning,12個error。警告不用管,項目配置Debug或者Release編譯,錯誤都有有:

  1. include\c10\macros\Macros.h:287: error: '__assert_fail' was not declared in this scope __assert_fail
  2. include\ATen\core\ivalue_inl.h:719: error: expected unqualified-id before '(' token TORCH_CHECK(obj->slots().size() == 1,

重裝QT Creator,配置MSVC編譯器

可以在QT安裝路徑中使用QT manager補裝,但是比較麻煩。直接在控制面版中卸載QT Creator,官網下載或者搜索其他網址下載,官網加載很慢可以搜索下載。

參考QT Creator安裝,重裝時,在選擇組件部分除了默認的Develper and Designer Tools中的MingW和CDB,還要勾選MSVC部分。

安裝好MSVC編譯器,還要配置,配置時需要cdb.exe。選擇工具->選項->構建套件(Kits)->MSVC 2017 x64->調式器,添加cdb.exe。如果沒有,下載安裝即可。裝好后在添加cdb調試器。

重新用MSVC 2017編譯器,配置OpenCV和Libtorch

配置好MSVC編譯器后,在.pro文件加入配置如下:

INCLUDEPATH += your path to\opencv-4.5.0-vc14_vc15\opencv\build\include \
your path to\libtorch17debug\include \
your path to\libtorch17debug\include\torch\csrc\api\include

LIBS+=your path to\opencv-4.5.0-vc14_vc15\opencv\build\x64\vc15\lib\opencv_world450d.lib \
your path to\libtorch17debug\lib\*.lib

執行qmake,重新構建。發現報錯主要來自IValue.h和IValue_init.h文件,顯示7個錯誤

  • 語法錯誤: 標識符“IValue”
  • 意外的標記位於“;”之前
  • “c10::IValue”:非法的成員初始化
  • “Tag”:不是類或命名空間名稱
  • 語法錯誤,缺少“;”等。

解決方法參考引用3,分兩步

  1. 在引用 #include <torch/torch.h> 的地方,這樣寫
#undef slots
#include <torch/torch.h>
#define slots Q_SLOTS
  1. 在報錯的D:\libtorch\include\ATen/core/ivalue.h頭文件和IValue_init.h文件中
    找出如下3行內容,注釋掉。共有多處
/// \cond DOXYGEN_CANNOT_HANDLE_CONSTRUCTORS_WITH_MACROS_SO_EXCLUDE_THIS_LINE_FROM_DOXYGEN
C10_DEPRECATED_MESSAGE("IValues based on std::vector<T> are potentially slow and deprecated. Please use c10::List<T> instead.")
/// \endcond

至此,重新構建不再出錯。但是運行報錯:cdb process terminated。排查錯誤來源,發現只使用OpenCV是沒有問題的,但是加入libtorch則出錯。沒辦法,只能將項目配置Debug轉成Release。或者運行也不報錯,但是當運行代碼中有libtorch相關的模型操作,無論加載或者forward,均會終止運行。

正確步驟

至此,坑已經全部踩完。CUDA和CUDNN的安裝網上方法很多,就不贅述。安裝好后,QT完整的深度學習配置步驟為:

  1. 下載安裝QT Creator,配置好環境。官網下載或者搜索其他網址下載,官網加載很慢可以搜索下載。注意安裝時勾選MSVC編譯器組件。項目選用MSVC編譯,在工具->選項->構建套件(Kits)->MSVC 2017 x64配置MSVC 2017 x64,選擇c和c++編譯器為amd64。

  2. 如果電腦沒有cdb.exe文件(Everything搜查),則下載安裝,安裝完畢后選擇工具->選項->構建套件(Kits)->MSVC 2017 x64->Debugger(調式器),添加cdb.exe。

  3. 下載OpenCVlibtorch。將正確路徑配置到項目的.pro文件中,在.pro文件末尾添加

INCLUDEPATH += your path to\opencv-4.5.0-vc14_vc15\opencv\build\include \
your path to\libtorch17release\include \
your path to\libtorch17release\include\torch\csrc\api\include

LIBS += -Lyour path to\opencv-4.5.0-vc14_vc15\opencv\build\x64\vc15\lib -lopencv_world450 \
-Lyour path to\libtorch17release\lib -lc10 -ltorch -lc10_cuda -lcaffe2_detectron_ops_gpu -lc10d -ltorch_cpu \
-ltorch_cuda -lgloo -lcaffe2_module_test_dynamic -lasmjit -lcaffe2_nvrtc -lclog -lcpuinfo -ldnnl -lfbgemm -lgloo_cuda \
-lmkldnn -INCLUDE:?warp_size@cuda@at@@YAHXZ

將your path to替換為你本地路徑。

  1. 項目配置為Release模式,運行qmake成功,右鍵項目重新構建。可能產生錯誤有:
    語法錯誤: 標識符“IValue”;
    意外的標記位於“;”之前;
    “c10::IValue”:非法的成員初始化;
    “Tag”:不是類或命名空間名稱;
    語法錯誤,缺少“;”。
    解決方法參考引用3,在引用 #include <torch/torch.h> 的地方,這樣寫
#undef slots
#include <torch/torch.h>
#define slots Q_SLOTS

在報錯的D:\libtorch\include\ATen/core/ivalue.h頭文件和IValue_init.h文件中
找出如下3行內容,注釋掉。共有多處

/// \cond DOXYGEN_CANNOT_HANDLE_CONSTRUCTORS_WITH_MACROS_SO_EXCLUDE_THIS_LINE_FROM_DOXYGEN
C10_DEPRECATED_MESSAGE("IValues based on std::vector<T> are potentially slow and deprecated. Please use c10::List<T> instead.")
/// \endcond

至此,重新構建不再出錯

  1. 成功運行,測試的main.cpp文件代碼如下:
#include "mainwindow.h"
#include<opencv2/opencv.hpp>
#include <QApplication>
#include<iostream>
#undef slots
#include<torch/script.h>
#include<torch/torch.h>
#define slots Q_SLOTS

class ConvReluBnImpl : public torch::nn::Module {
public:
    ConvReluBnImpl(int input_channel=3, int output_channel=64, int kernel_size = 3);
    torch::Tensor forward(torch::Tensor x);
private:
    // Declare layers
    torch::nn::Conv2d conv{ nullptr };
    torch::nn::BatchNorm2d bn{ nullptr };
};
TORCH_MODULE(ConvReluBn);

ConvReluBnImpl::ConvReluBnImpl(int input_channel, int output_channel, int kernel_size) {
    conv = register_module("conv", torch::nn::Conv2d(torch::nn::Conv2dOptions(input_channel, output_channel, kernel_size).padding(1)));
    bn = register_module("bn", torch::nn::BatchNorm2d(output_channel));

}

torch::Tensor ConvReluBnImpl::forward(torch::Tensor x) {
    x = torch::relu(conv->forward(x));
    x = bn(x);
    return x;
}

int main(int argc, char *argv[])
{
    //test torch
    auto device = torch::Device(torch::kCUDA);
    auto model = ConvReluBn(3,4,3);
    model->to(device);
    auto input = torch::zeros({1,3,12,12},torch::kFloat).to(device);
    auto output = model->forward(input);
    std::cout<<output.sizes()<<std::endl;

    //test opencv
    cv::Mat M(200, 200, CV_8UC3, cv::Scalar(0, 0, 255));
    if(!M.data)
        return 0;
    cv::imshow("ddd",M);
    cv::waitKey(0);
    cv::destroyAllWindows();
    //test qt
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

運行成功,並且顯示200*200的紅色圖案。

  1. 然而,仍然存在兩個問題,一個是cout無輸出,一個是無法調試。解決辦法為:第一個在.pro文件后添加一句
CONFIG += console

第二個則相對復雜,參考博客修改。如果需要查看變量,則用博客中方法修改QT安裝路徑下的msvc-desktop.conf,如果不需要查看變量,能斷點就行,則直接在.pro文件添加:

QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
QMAKE_CFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO
QMAKE_LFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO

至此,配置完成。

References

OpenCV+MingW編譯
QT Creator安裝
win10 64bit+ qt5.12.0 + msvc2017 + libtorch(pytorch)+cuda10.1+cudnn7.6配置
QT creator Release模式下可調試

分享不易,如果有用請不吝給我一個👍,轉載注明出處:https://allentdan.github.io/
代碼見LibtorchTutorials


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM