Windows下讓cmake找到OpenCV和Eigen

OpenCV

從(cmake 3.12)[https://cmake.org/cmake/help/v3.12/policy/CMP0074.html]之後,可以利用環境變數來告訴cmake套件的位置,在Windows下很方便,因為windows不像linux會把函式庫集中放在一起。設定方法就是利用設定環境變數

1
<PackageName>_ROOT

其中<PackageName>就是你的套件名稱,例如在這裡我們要設的環境變數就是OpenCV_ROOT,注意<PackageName>必須要和你寫在CMakeLists.txt裡面find_package(<PackageName>)大小寫都要一致

設定完後會看到cmake輸出找到的路徑

1
2
3
Environment variable OpenCV_ROOT is set to:

D:\lib\build_opencv

另外由於相容性的關係,cmake預設不會使用環境變數的OpenCV_ROOT,我們必須在CMakeLists.txt中設定打開這個功能

1
cmake_policy(SET CMP0074 NEW)

成功設定後可以看到cmake會有以下輸出

1
2
3
-- Found OpenCV: D:/lib/build_opencv (found version "4.6.0")
-- OpenCV library status:
-- version: 4.6.0

詳細寫法可以參考這個範例
https://gist.github.com/jenhaoyang/924698b31f7e3baede14286c67d6059a

Eigen3.4.0

使用find_package(Eigen3 REQUIRED)後需要get_target_property(EIGEN3_INCLUDE_DIR Eigen3::Eigen INTERFACE_INCLUDE_DIRECTORIES)
,根據這個issue的寫法https://gitlab.com/libeigen/eigen/-/issues/2486


參考:
https://seanzhengw.github.io/blog/cmake/2018/04/23/cmake-find-package.html
https://cmake.org/cmake/help/v3.12/policy/CMP0074.html
https://stackoverflow.com/questions/21314893/what-is-the-default-search-path-for-find-package-in-windows-using-cmake

Ubuntu更新cmake

前一陣子在windows上編譯Nvidia triton-inference-server發現他的編譯腳本有很多方便的的操作方法,升級cmake是其中之一,注意指令中有指定ubuntu版本
cmake官方有關於apt下載的說明

1
2
3
4
5
6
7
8
9
ENV DEBIAN_FRONTEND=noninteractive
RUN apt install software-properties-common -y
RUN wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | \
gpg --dearmor - | \
tee /etc/apt/trusted.gpg.d/kitware.gpg >/dev/null && \
apt-add-repository 'deb https://apt.kitware.com/ubuntu/ focal main' && \
apt-get update && \
apt-get install -y --no-install-recommends \
cmake-data=3.21.1-0kitware1ubuntu20.04.1 cmake=3.21.1-0kitware1ubuntu20.04.1

參考:
https://github.com/triton-inference-server/server/blob/main/Dockerfile.QA#L65

Powershell呼叫7zip

如果在powershell 發現找不到7z 指令,可以用下面的script替代

1
2
3
4
5
6
7
8
9
10
11
12
$7zipPath = "$env:ProgramFiles\7-Zip\7z.exe"

if (-not (Test-Path -Path $7zipPath -PathType Leaf)) {
throw "7 zip file '$7zipPath' not found"
}

Set-Alias 7zip $7zipPath

$Source = "c:\BackupFrom\backMeUp.txt"
$Target = "c:\BackupFolder\backup.zip"

7zip a -v50m -mx=9 $Target $Source #-v50m 代表將檔案分割成每50MB一包

7-zip 指令參考


參考:
https://stackoverflow.com/a/25288780

離線安裝python套件

有時候要部署的伺服器是完全沒有對外網路的,這篇文章將說明如何在無網路狀態下升級pip並且安裝套件。

  1. 確認可以聯網的機器和無網路的機器pip 版本是一樣的,如果有用到venv,那就確定venv裡面的pip版本一樣
    1
    2
    # 確認pip版本
    pip --version
  2. 如果不一樣可以到官網下載想要的pip版本

參考資料:
https://www.ibm.com/docs/en/siffs/2.0.3?topic=python-installing-packages-offline-mode

編譯onnxruntime Tensorrt ExecutionProvider

1. 安裝CUDA、cuDNN、Tensorrt

我的環境

  • Windows10
  • Visual Studio 2019(注意 先安裝visual studio 再安裝CUDA,因為CUDA包含給visual studio使用的原件)
  • cmake: 3.24.0
  • CUDA: 11.4
  • cuDNN: 8.2
  • Tensorrt:8.2.3.0

2.下載onnxruntime github原始碼並且切換到想要的onnxruntime 版本

1
2
git clone https://github.com/microsoft/onnxruntime.git
git checkout v1.11.1

2. 編譯

  1. 不一定要機器上要插著顯卡才能編譯,沒顯卡的機器也可以編譯

  2. 為了保險起見我是用系統管理員權限執行cmd,沒試過普通的cmd可不可以

  3. 基本上官方提供的build.bat 沒特別做什麼事,只是幫你呼叫build.py而已,所以所有參數都可以直接看build.py需要什麼,如果直接下官方文件的指令下會出錯。

  4. onnxrumtime 的github ci pipeline是很好的參考,可以用來作為build.py指令參數的參考例如windows onnxruntime tensorrt

  5. CUDA architectures查詢

1
build.bat --parallel --config Release --build_shared_lib --build_wheel --skip_tests --cudnn_home "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.4" --cuda_home "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.4" --use_tensorrt --tensorrt_home C:\TensorRT-8.2.3.0 --cuda_version 11.4 --cmake_extra_defines "CMAKE_CUDA_ARCHITECTURES=80"
  1. 如果編譯失敗請刪掉程式產生的onnxruntime\build資料夾後再重下指令

  2. docker file我們可以發現如何安裝編譯好的onnx tensorrt

1
pip install <onnxruntime 資料夾>/build/Windows/Release/Release/dist/onnxruntime_gpu-1.11.1-cp38-cp38-win_amd64.whl