windows11編譯OpenCV4.5.0 with CUDA
從OpenCV4.2.0 版本開始允許使用 Nvidia GPU 來加速推理。本文介紹最近使用windows11系統(tǒng)編譯帶CUDA的OpenCV4.5.0的過程。
- 文中使用【特別注意:…】為大家標識出容易出錯的地方。
- 安裝成功后,使用CPU與GPU調(diào)用yolov4模型進行推理的耗時測試結(jié)果:
GPU | CPU |
---|---|
4ms | 311ms |
- 從差距上看,還是值得花時間編譯一下的:)
- 耗時測試環(huán)境:
- 調(diào)用筆記本自帶攝像頭獲取視頻
- Notebook GTX3080顯卡
1.準備環(huán)境
1.1 下載OpenCV4.5.0
- 編譯需要OpenCV4.5.0的源碼
- 下載地址(3項可選):
https://opencv.org/releases/
https://github.com/opencv/opencv/releases/tag/4.5.0
https://sourceforge.net/projects/opencvlibrary/files/4.5.0/opencv-4.5.0-vc14_vc15.exe/download - 下載完成后是一個exe程序,雙擊即可解壓,解壓后:
- source文件夾就是源碼
- build文件夾是編譯好的不帶CUDA加速的OpenCV4.5.0(本文不使用)
1.2 下載OpenCV4.5.0 contrib
- Contrib Modules是OpenCV的擴展模塊,包含了很多用于實現(xiàn)特定算法
- 編譯OpenCV需要用到contirb模塊
- 特別注意:務(wù)必下載與源碼對應(yīng)版本的contrib模塊
- 下載地址(第1個為官方下載地址,第2個為國內(nèi)某同學搭建的下載庫,速度較快):
https://github.com/opencv/opencv_contrib/tags
https://www.raoyunsoft.com/opencv/opencv_contrib/opencv_contrib-4.5.0.zip
1.3 準備.cache文件
- 編譯過程中需要聯(lián)網(wǎng)下載一些依賴庫,并存放于sourc.cache文件夾中
- 特別注意:因要連到外網(wǎng),因此速度比較慢,有時斷網(wǎng)造成編譯失敗,所以可以提前準備好這些文件
- OpenCV4.5.0的.cache文件下載地址:
https://download.csdn.net/download/iracer/85695997
- 使用方法:
- 將.cache文件夾拷貝到source文件夾下,與原.cache文件夾合并
1.4 安裝Visual Studio 2019
- 安裝CUDA需要vs,這里選擇vs2019
- 安裝步提要:
- Download Visual Studio 2019 Community Edition
- Select Desktop Development with C++ option and click on install
1.5 安裝CUDA和cuDNN
- NVIDIA官方指南:
https://docs.nvidia.com/deeplearning/cudnn/install-guide/index.html#install-windows
- 本次在windows11上安裝的CUDA和cuDNN版本為:
- CUDA 11.3:cuda_11.3.1_465.89_win10.exe
- duDNN 8.4:cudnn-windows-x86_64-8.4.0.27_cuda11.6-archive.zip
- 特別注意:zlib庫需要下載并添加到系統(tǒng)環(huán)境變量path中,因為cdDNN需要調(diào)用該庫。
- zlib庫下載地址:
www.winimage.com/zLibDll/zlib123dllx64.zip
下載完成后解壓zip文件,并將zlibwapi.dll所在目錄添加到系統(tǒng)環(huán)境變量path中 - 查看CUDA安裝結(jié)果:
C:\Users\irace>nvcc --version nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2021 NVIDIA Corporation Built on Mon_May__3_19:41:42_Pacific_Daylight_Time_2021 Cuda compilation tools, release 11.3, V11.3.109 Build cuda_11.3.r11.3/compiler.29920130_0
1.6 安裝CMake
- 本次是用的是3.22版本,3.19以上版本應(yīng)該都可以(未逐一測試)
- 下載地址:
https://github.com/Kitware/CMake/releases/download/v3.22.5/cmake-3.22.5-windows-x86_64.msi
2. 編譯
2.1 CMake生成解決方案
-
雙擊解壓OpenCV4.5.0.exe,解壓后的source目錄即OpenCV4.5.0的源碼
-
解壓opencv_contrib-4.5.0
-
新建一個編譯目錄
D:\opencv\oepncv4.5.0cuda\build
-
打開CMake
-
配置source code:
D:/opencv/opencv4.5.0/sources
-
配置目標目錄:
D:\opencv\oepncv4.5.0cuda\build
-
第1次點擊[Configure]
-
彈出窗口選擇vs2019作為編譯器:
Visual Studio 16 2019
-
generate平臺選擇x64
-
第2次點擊[Configure]后,搜cuda帶cuda的都勾選,
- BUILD_CUDA_STUBS
- BUILD_opencv_cudaarithm
- BUILD_opencv_cudabgsegm
- BUILD_opencv_cudacodec
- BUILD_opencv_cudafeatures2d
- BUILD_opencv_cudafilters
- BUILD_opencv_cudaimgproc
- BUILD_opencv_cudalegacy
- BUILD_opencv_cudaobjdetect
- BUILD_opencv_cudaoptflow
- BUILD_opencv_cudastereo
- BUILD_opencv_cudawarping
- 除此之外此外以下兩項數(shù)學加速選項也勾選:
- CUDA_FAST_MATH
-
ENABLE_FAST_MATH
- CMake界面上Search欄搜modules,設(shè)置contrib模塊路徑
D:\opencv\oepncv4.5.0cuda\opencv_contrib-4.5.0\modules
-
第3次點擊[Configure],完成后,再次搜索cuda,配置CUDA_ARCH_BIN中將顯卡的算力內(nèi)容改成自己顯卡的算力,t如下網(wǎng)址查詢自己顯卡的算力,我保留了7.5;8.0;8.6
- 查詢顯卡算力鏈接
GeForce 筆記本
GPU Compute Capability GeForce RTX 3080 8.6 GeForce RTX 3070 8.6 GeForce RTX 3060 8.6 GeForce RTX 3050 Ti 8.6 GeForce RTX 3050 8.6 Geforce RTX 2080 7.5 Geforce RTX 2070 7.5 Geforce RTX 2060 7.5 GeForce GTX 1080 6.1 GeForce GTX 1070 6.1 GeForce GTX 1060 6.1 GeForce and TITAN 臺式機
GPU Compute Capability Geforce RTX 3060 Ti 8.6 Geforce RTX 3060 8.6 GeForce RTX 3090 8.6 GeForce RTX 3080 8.6 GeForce RTX 3070 8.6 GeForce GTX 1650 Ti 7.5 NVIDIA TITAN RTX 7.5 Geforce RTX 2080 Ti 7.5 Geforce RTX 2080 7.5 Geforce RTX 2070 7.5 Geforce RTX 2060 7.5 NVIDIA TITAN V 7.0 -
搜索并勾選
BUILD_opencv_world,可生成一個整的dll方便使用
OPENCV_ENABLE_NONFREF
-
解壓.cache.rar,將.cache目錄拷貝到source目錄:
D:\opencv\oepncv4.5.0\source\.cache >
NVIDIA GPU arch: 75 80 86
NVIDIA PTX archs:
cuDNN: YES (ver 8.4.0)
-
點擊[Open Project],會自動打開vs2019,開始編譯
2.2 VS2019編譯OpenCV
-
使用VS2019打開剛剛編譯工程后,等待左下角顯示的項全部加載完畢才可以繼續(xù)操作
-
選擇Release x64版本
-
找到解決方案資源管理器中的“CmakeTargets”下的“ALL_BUILD”,右鍵→“生成”,然后開始漫長的等待……
-
解決方案資源管理器—>CMakeTargets—>INSTALL—>生成”然后又是等,好在這次時間很短。完成后你的build文件夾中會出現(xiàn)一個install文件夾,這就是完成了。
2.3 生成文件
-
生成完成后會出現(xiàn)如下文件夾
D:\opencv\oepncv4.5.0cuda\build\install
-
build/install目錄的目錄結(jié)構(gòu)(部分)
├─etc
├─include
│ └─opencv2
│ ├─core
│ ├─cudalegacy
│ ├─cudev
│ ├─datasets
│ ├─dnn
│ ├─face
│ ├─features2d
└─x64
└─vc16
├─bin
└─lib文章來源:http://www.zghlxwxcb.cn/news/detail-657661.html -
tips:在當前目錄中運行cmd,使用tree命令,即可生成目錄樹文章來源地址http://www.zghlxwxcb.cn/news/detail-657661.html
D:\opencv\oepncv4.5.0cuda\build\install>tree
3. 測試
3.1 配置OpenCV with cuda
- 配置OpenCV4.5.0cuda,與一般OpenCV的配置方法一致,可參考:
- Win7系統(tǒng)Visual Studio 2013配置OpenCV3.1圖文詳解
3.2 YOLOv4 示例程序
- 測試程序可以直接用《OpenCV4機器學習算法原理與編程實戰(zhàn)》書中的代碼(部分):
#include<opencv2\opencv.hpp>
#include<opencv2\dnn.hpp>
#include<fstream>
#include<iostream>
using namespace std;
// 檢測結(jié)果后處理
void postProcess(
cv::dnn::Net& net,
cv::Mat& frame,
const vector<cv::Mat>& outs,
vector<cv::Rect>& boxes,
vector<int>& classIds,
vector<int>& indices,
double confThreshold,
double nmsThreshold
);
// 檢測繪制結(jié)果
void drawPred(
cv::Mat& frame,
vector<cv::Rect>& boxes,
vector<int>& classIds,
vector<int>& indices,
vector<string>& classNamesVec);
// 程序設(shè)置
bool USE_IMAGE = false; // true: 測試圖像; false: 測試視頻
bool USE_YOLOv4 = true; // true: YOLOv4; false: YOLOv4_tiny
bool USE_CUDA = true; // true: GPU, false: CPU
float confidenceThreshold = 0.3; // 置信度設(shè)置
float nmsThreshold = 0.2; // 置信MNS門限
int main()
{
// [1]模型文件路徑設(shè)置
cv::String model, config;
if (USE_YOLOv4)
{
model = "D:/models/yolov4/yolov4.weights"; // 模型權(quán)重文件
config = "D:/models/yolov4/yolov4.cfg"; // 模型配置文件
}
else // use yolov4-tiny
{
model = "D:/models/yolov4/yolov4-tiny.weights";
config = "D:/models/yolov4/yolov4-tiny.cfg";
}
cv::String framework = "Darknet"; // 深度學習框架
cv::String label_file = "D:/models/yolov4/coco.names";// 類別標簽文件
//[2] 加載類別
ifstream classNamesFile(label_file);
vector<string> classNamesVec;
if (classNamesFile.is_open())
{
string className = "";
while (std::getline(classNamesFile, className))
{
classNamesVec.push_back(className);
}
}
// [3]載入模型
cv::dnn::Net net = cv::dnn::readNet(config, model, framework);
if (USE_CUDA)
{
net.setPreferableTarget(cv::dnn::DNN_TARGET_CUDA);
net.setPreferableBackend(cv::dnn::DNN_BACKEND_CUDA);
}
else
{
net.setPreferableTarget(cv::dnn::DNN_TARGET_OPENCL);
net.setPreferableBackend(cv::dnn::DNN_BACKEND_OPENCV);
}
// ...
}
4. 相關(guān)鏈接
- OpenCV4機器學習算法原理與編程實戰(zhàn)(附部分模型下載地址)
- 本文更新鏈接
- 轉(zhuǎn)載請注明出處。
到了這里,關(guān)于windows11編譯OpenCV4.5.0 with CUDA(附注意事項)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!