Jetson邊緣計算主板:Ubuntu 環境配置 CUDA 與 cudNN 推理環境 + OpenCV 與 C++ 進行目標分類

最近由于業務需求,接觸到了Jetson邊緣AI計算主板,博主使用的是Jetson Orin NX 16GB這個版本,可以看到其算力達到了100TOPS,這是一個非常恐怖的算力了,接下來便是博主對其的環境配置過程,博主要在該主板上運行一個旋轉檢測模型,過程如下:

在這里插入圖片描述
Jetson使用的是Arm架構,所以在配置時會存在差異
在使用Jetson系列設備時,為了實時查看CPUGPU,我們首先應該安裝Jtop軟件

1. 安裝Jtop監測軟件

1.1 安裝 pip3

因為我們需要使用pip3來安裝jtop,所以需要在系統中先安裝pip3

sudo apt install python3-pip

在這里插入圖片描述

1.2 安裝 jtop

sudo -H pip3 install -U jetson-stats

在這里插入圖片描述

隨后直接輸入jtop即可:

在這里插入圖片描述

隨后我們點擊INFO,查看系統信息:
可用看到,此時CUDAcuDNN都是沒有的,OpenCV也是不支持CUDA加速的。

在這里插入圖片描述

那么,我們接下來該怎么做呢,難道要像WindowUbuntu下那樣安裝CUDAcudNN嗎,不不不,Jetson為方便開發者,提供了 Jetpack開發套件,其幫了我們大忙

2. 安裝JETPACK套件

為啥安裝 Jetpack,那就是 JetpackNvidiaJetson系列開發板開發的一款軟件開發包,常用的開發工具基本都包括了,并在在安裝 Jetpack的時候,會自動安裝匹配版本的CUDAcuDNNTensorRT等。

在這里插入圖片描述

我們耐心等待即可,安裝完成后,再次調用 JTop 查看,此時我們看到CUDAcuDNN已經裝好了,接下來便是對其進行配置,并重新編譯OpenCV,使其能夠支持CUDA加速

在這里插入圖片描述
目前,我們只是安裝了CUDA和cuDNN,接下來我們需要對其進行配置

3. CUDA與cuDNN配置

cuDNN 默認安裝路徑在 /usr/lib/aarch64-linux-gnu
CUDA 默認安裝路徑在 /usr/local/cuda

3.1 CUDA配置

配置Cuda環境變量:
CUDA 已經默認安裝在了/usr/local/cuda下,運行如下指令:

sudo vim ~/.bashrc		# 打開~/.bashrc#在文本末輸入如下代碼:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64
export PATH=$PATH:/usr/local/cuda/bin
export CUDA_HOME=$CUDA_HOME:/usr/local/cudasource ~/.bashrc	#保存環境變量

在這里插入圖片描述

我們使用nvcc-V查看一下CUDA配置:

在這里插入圖片描述

3.2 cuDNN配置

雖然安裝了cuDNN,但沒有將對應的頭文件、庫文件放到cuda目錄。

cuDNN的頭文件在:/usr/include,庫文件位于:/usr/lib/aarch64-linux-gnu。將頭文件與庫文件復制到cuda目錄下:

# 復制文件到cuda目錄下
cd /usr/include && sudo cp cudnn* /usr/local/cuda/include
cd /usr/lib/aarch64-linux-gnu && sudo cp libcudnn* /usr/local/cuda/lib64

在這里插入圖片描述

隨后創建軟鏈接,這個步驟不能少,否則在OpenCV 編譯時會報錯,因為其找不到cuDNN

# 修改文件權限,修改復制完的頭文件與庫文件的權限,所有用戶都可讀,可寫,可執行:
sudo chmod 777 /usr/local/cuda/include/cudnn.h 
sudo chmod 777 /usr/local/cuda/lib64/libcudnn*# 重新軟鏈接,這里的9.3.0和9對應安裝的cudnn版本號和首數字
cd /usr/local/cuda/lib64sudo ln -sf libcudnn.so.9.3.0 libcudnn.so.9sudo ln -sf libcudnn_ops_train.so.9.3.0 libcudnn_ops_train.so.9
sudo ln -sf libcudnn_ops_infer.so.9.3.0 libcudnn_ops_infer.so.9sudo ln -sf libcudnn_adv_train.so.9.3.0 libcudnn_adv_train.so.9
sudo ln -sf libcudnn_adv_infer.so.9.3.0 libcudnn_adv_infer.so.9sudo ln -sf libcudnn_cnn_train.so.9.3.0 libcudnn_cnn_train.so.9
sudo ln -sf libcudnn_cnn_infer.so.9.3.0 libcudnn_cnn_infer.so.9sudo ldconfig

3.3 測試cuDNN

執行下面的命令:

sudo cp -r /usr/src/cudnn_samples_v9/ ~/  #將系統中自帶的 cuDNN 示例代碼文件夾 cudnn_samples_v8 復制到你的用戶主目錄(~/)  方便測試
cd ~/cudnn_samples_v9/mnistCUDNN
sudo chmod 777 ~/cudnn_samples_v9  #給整個 cudnn_samples_v8 目錄賦予“所有用戶”完全權限(讀、寫、執行
sudo make clean && sudo make  #清理之前的編譯產物并重新編譯示例程序
./mnistCUDNN

默認會復制到這個路徑下:

在這里插入圖片描述

如果測試通過的話,會最終輸出:

在這里插入圖片描述

如果在執行sudo make clean && sudo make時報錯:

在這里插入圖片描述

那么就表示缺少對應的庫,安裝下面的庫即可:

sudo apt-get install libfreeimage3 libfreeimage-dev

安裝完成之后再進行sudo make,基本上就可以編譯成功了。

4. OpenCV with CUDA編譯

先前我們安裝的OpenCV無法通過CUDA編譯,因此我們要考慮是否是OpenCV版本不匹配導致的,先前我們按照的是OpenCV 4.9,而我們的CUDAcuDNN版本分別是12.69.3,我們需要查看一下與之匹配的OpenCV版本:

理論上博主使用OpenCV 4.9 應該是沒有問題的,奈何就是不行,果斷使用最新版本的OpenCV,即4.13,直接上就完了。

在這里插入圖片描述

4.1 運行 CMake 配置

下載對應的 opencv 源碼和 opencv_contrib 源碼,然后創建,這里博主把 opencv_contrib 放到了opencv 下面,然后創建build文件目錄,開始CMake配置。
注意,一定要下載opencv_contrib的源碼,否則會報錯,下面博主在執行時便遇到了這個問題。

因為OpenCV 的一些 CUDA 功能(如內存管理、底層工具)被移到了 opencv_contrib 倉庫中的 cudev 模塊中,所以我們需要下載opencv_contrib
將下載后的opencv_contrib放到opencv文件夾下:

在這里插入圖片描述

隨后切換到build文件夾下,執行下面的腳本:

cmake -D CMAKE_BUILD_TYPE=RELEASE \-D CMAKE_INSTALL_PREFIX=/usr/local \-D WITH_CUDA=ON \-D OPENCV_DNN_CUDA=ON \-D ENABLE_FAST_MATH=ON \-D CUDA_FAST_MATH=ON \-D WITH_CUBLAS=ON \-D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules \-D BUILD_opencv_cudev=ON \..

完成后的效果如下:

在這里插入圖片描述

4.2 OpenCV with CUDA 編譯與安裝

生成CMake文件后,進行編譯并安裝

make -j$(nproc)  #調用最大CPU可用數量,用于加速make編譯

在這里插入圖片描述

這個過程會比較漫長,預計得半個多小時 。。。。。

最終編譯完成后效果:

在這里插入圖片描述

在完成后,我們執行安裝命令:

sudo make install

安裝成功:

在這里插入圖片描述

安裝完成后,我們就可以進行測試了,我們依舊選擇一個分類模型進行測試:
cd/opencv/samples/cpp/example_cmake目錄下,然后打開opencv_example.cpp文件,替換為下面的代碼,這個代碼執行的便是 加載分類ONNX模型進行推理。

#include <opencv2/opencv.hpp>
#include <opencv2/dnn.hpp>
#include <iostream>
#include <vector>
#include <cmath>// Softmax 函數
void softmax(const float* data, float* output, int size) {float max_val = -INFINITY;for (int i = 0; i < size; ++i) {max_val = std::max(max_val, data[i]);}float sum_exp = 0.0f;for (int i = 0; i < size; ++i) {sum_exp += std::exp(data[i] - max_val);}for (int i = 0; i < size; ++i) {output[i] = std::exp(data[i] - max_val) / sum_exp;}
}int main() {// 檢查是否有可用的 CUDA 設備if (cv::cuda::getCudaEnabledDeviceCount() == 0) {std::cerr << "沒有檢測到 CUDA 設備,請檢查 OpenCV 是否啟用了 WITH_CUDA 和 OPENCV_DNN_CUDA" << std::endl;return -1;} else {std::cout << "CUDA is Used,Detected " << cv::cuda::getCudaEnabledDeviceCount() << "  GPU" << std::endl;}// 加載模型std::string modelPath = "juan_cls.onnx";cv::dnn::Net net = cv::dnn::readNetFromONNX(modelPath);if (net.empty()) {std::cerr << "無法加載模型,請檢查路徑是否正確" << std::endl;return -1;}// 設置網絡后端為 CUDAnet.setPreferableBackend(cv::dnn::DNN_BACKEND_CUDA);net.setPreferableTarget(cv::dnn::DNN_TARGET_CUDA);// 圖像輸入cv::Mat img = cv::imread("img.jpg");if (img.empty()) {std::cerr << "無法加載圖像 img.jpg" << std::endl;return -1;}// 預處理int inputWidth = 640;int inputHeight = 640;cv::Mat blob = cv::dnn::blobFromImage(img, 1.0, cv::Size(inputWidth, inputHeight),cv::Scalar(), true, false);net.setInput(blob);// 推理(GPU)cv::Mat out = net.forward();std::cout << "Inference Shape: " << out.size << std::endl;// 假設輸出是 [1 x C x H x W]int batchSize = out.size[0];   // 1int channels = out.size[1];    // 2int height = out.size[2];      // 640int width = out.size[3];       // 640std::vector<float> avgScores(channels, 0.0f);for (int c = 0; c < channels; ++c) {double sum = 0.0;float* ptr = out.ptr<float>(0, c);  // batch=0, channel=cfor (int h = 0; h < height; ++h) {for (int w = 0; w < width; ++w) {sum += ptr[h * width + w];}}avgScores[c] = static_cast<float>(sum / (height * width));}// Softmax 歸一化float probs[2];softmax(avgScores.data(), probs, 2);// 輸出結果std::cout.precision(4);std::cout << std::fixed;std::cout << "\nResult" << std::endl;std::cout << "Cls 0 Score: " << probs[0] << std::endl;std::cout << "Cls 1 Score: " << probs[1] << std::endl;std::cout << "Cls: " << (probs[0] > probs[1] ? 0 : 1) << std::endl;return 0;
}

隨后執行下面的命令:

cmake .
make
./opencv_example

最終效果如下,可以看到檢測到了一個GPU,并且在執行時能夠明顯感覺到速度提升了。

在這里插入圖片描述

此時我們再使用jtop查看環境,可用看到此時的OpenCV便是可用使用CUDA的了。

在這里插入圖片描述

踩坑

當我們沒有下載opencv_contrib代碼時,我們在CMake時執行這段編譯代碼:

cmake -D CMAKE_BUILD_TYPE=RELEASE \-D CMAKE_INSTALL_PREFIX=/usr/local \-D WITH_CUDA=ON \-D OPENCV_DNN_CUDA=ON \-D ENABLE_FAST_MATH=ON \-D CUDA_FAST_MATH=ON \-D WITH_CUBLAS=ON \-D BUILD_opencv_cudacodec=OFF \-D BUILD_EXAMPLES=OFF ..

在這里插入圖片描述

會發生報錯:

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/89631.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/89631.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/89631.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CLIP模型實現中的其他細節

之前已經完整的拆解了CLIP中所用到的ResNet、ViT和Transformer三個模型&#xff08;CLIP拆解-CSDN博客&#xff09;&#xff0c;這篇將講解model.py實現中的其他細節。 1.關于ResNet模型中vision_head的設置 ResNet: vision_heads vision_width * 32 // 64 ViT: vision_h…

國科大深度學習作業1-手寫數字識別實驗

背景介紹&#xff1a;單位實習&#xff0c;趁機摸魚&#xff0c;由于電腦只安裝了VSCode&#xff0c;所以算是從環境搭建寫起。 目錄 一、環境搭建 1. 安裝Anaconda 2. 創建Python環境 3. 安裝PyTorch 4. 安裝其他必要庫 二、在 VSCode 中配置環境 1. 安裝Pytho…

基于Spring Boot的綠園社區團購系統的設計與實現

第1章 摘 要 本設計與實現的基于Spring Boot的綠園社區團購系統&#xff0c;旨在為社區居民提供一套高效、便捷的團購購物解決方案。隨著電子商務的發展和社區居民對便捷購物需求的增加&#xff0c;傳統的團購模式已無法滿足用戶的個性化需求。本系統通過整合現代化技術&…

【51單片機四位數碼管從0循環顯示到99,每0.5秒增加一個數字,打擊鍵計數】2022-6-11

緣由 #include "REG52.h" unsigned char code smgduan[]{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0,64,15,56}; //共陰0~F消隱減號 unsigned char Js0, miao0;//中斷計時 秒 分 時 毫秒 unsigned int shu0; //bit Mb0;//…

如何通過python腳本向redis和mongoDB傳點位數據

向MongoDB傳數據 from pymongo import MongoClient #導入庫對應的庫localhost "172.16.0.203" #數據庫IP地址 baseName "GreenNagoya" client MongoClient(localhost, 27017, username"admin", password"zdiai123") #數…

昆侖通泰觸摸屏Modbus TCP服務器工程 || TCP客戶端工程

目錄 一、Modbus TCP服務端 1.設備地址 2.實操及數據 二、Modbus TCP客戶端 1.結果及協議解析 一、Modbus TCP服務端 1.設備地址 --單元標識符 DI輸入/4個離散輸入 DO輸出/單個線圈輸出 輸入寄存器 讀輸入寄存器操作&#xff0c;寫輸入寄存器操作 保持寄存器 …

PyTorch 安裝使用教程

一、PyTorch 簡介 PyTorch 是由 Facebook AI Research 團隊開發的開源深度學習框架。它以動態圖機制、靈活性強、易于調試而著稱&#xff0c;廣泛應用于自然語言處理、計算機視覺和學術研究。 二、安裝 PyTorch 2.1 通過官網選擇安裝命令&#xff08;推薦&#xff09; 訪問官…

開源功能開關(feature flags) 和管理平臺之unleash

文章目錄 背景Flagsmith 和 Unleash什么是unleash架構Unleash Edge 安裝和使用Unleash SDKs開放API Tokens訪問**Server-side SDK (CLIENT)****查詢所有 Feature Toggles****查詢特定 Toggle** API token typesClient tokensFrontend tokensPersonal access tokensService acco…

細胞建模“圖靈測試”:解析學習虛擬細胞挑戰賽

一、AI能否預測細胞的未來&#xff1f; 想象一下&#xff0c;有一天我們不必一管管地做實驗&#xff0c;就能在計算機中模擬細胞對基因敲除、藥物處理乃至微環境變化的反應。這不再是科幻&#xff0c;而是“虛擬細胞”&#xff08;Virtual Cell&#xff09;研究的宏大目標。然…

centos9安裝docker Dify

CentOS | Docker Docs yum -y install gcc gcc-c yum-utils Docker 官方的 YUM 軟件倉庫配置文件到系統,設置存儲庫 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 也可以從阿里云下(我選擇上面的) yum-config-manager --add-re…

基于Jenkins和Kubernetes構建DevOps自動化運維管理平臺

目錄 引言 基礎概念 DevOps概述 Jenkins簡介 Kubernetes簡介 Jenkins與Kubernetes的關系 Jenkins與Kubernetes的集成 集成架構 安裝和配置 安裝Jenkins 安裝Kubernetes插件 配置Kubernetes連接 配置Jenkins Agent Jenkins Pipeline與Kubernetes集成 Pipeline定義…

MySQL 8.0 OCP 1Z0-908 題目解析(18)

題目69 Choose three. A MySQL server is monitored using MySQL Enterprise Monitor’s agentless installation. Which three features are available with this installation method? □ A) MySQL Replication monitoring □ B) security-related advisor warnings □ …

【mongodb】安裝和使用mongod

文章目錄 前言一、如何安裝&#xff1f;二、使用步驟1. 開啟mongod服務2. 客戶端連接數據庫3. 數據庫指令 總結 前言 Mongodb的安裝可以直接安裝系統默認的版本&#xff0c;也可以安裝官網維護的版本&#xff0c;相對而言更推薦安裝官網維護的版本&#xff0c;版本也相當更新。…

云效DevOps vs Gitee vs 自建GitLab的技術選型

針對「云效DevOps vs Gitee vs 自建GitLab」的技術選型&#xff0c;我們從核心需求、成本、運維、擴展性四個維度進行深度對比&#xff0c;并給出場景化決策建議&#xff1a; 一、核心能力對比表 能力維度云效DevOpsGitee自建GitLab&#xff08;社區版/企業版&#xff09;代碼…

CentOS 7 安裝RabbitMQ詳細教程

前言&#xff1a;在分布式系統架構中&#xff0c;消息隊列作為數據流轉的 “高速公路”&#xff0c;是微服務架構不可或缺的核心組件。RabbitMQ 憑借其穩定的性能、靈活的路由機制和強大的生態支持&#xff0c;成為企業級消息中間件的首選之一。不過&#xff0c;當我們聚焦 Cen…

Python爬蟲用途和介紹

目錄 什么是Python爬蟲 Python爬蟲用途 Python爬蟲可以獲得那些數據 Python爬蟲的用途 反爬是什么 常見的反爬措施 Python爬蟲技術模塊總結 獲取網站的原始響應數據 獲取到響應數據對響應數據進行過濾 對收集好的數據進行存儲 抵御反爬機制 Python爬蟲框架 Python…

uni-app開發app保持登錄狀態

在 uni-app 中實現用戶登錄一次后在 token 過期前一直免登錄的功能&#xff0c;可以通過以下幾個關鍵步驟實現&#xff1a;本地持久化存儲 Token、使用請求與響應攔截器自動處理 Token 刷新、以及在 App.vue 中結合 pages.json 設置登錄狀態跳轉邏輯。 ? 一、pages.json 配置說…

21、MQ常見問題梳理

目錄 ? 、MQ如何保證消息不丟失 1 、哪些環節可能會丟消息 2 、?產者發送消息如何保證不丟失 2.1、?產者發送消息確認機制 2.2、Rocket MQ的事務消息機制 2.3 、Broker寫?數據如何保證不丟失 2.3.1** ?先需要理解操作系統是如何把消息寫?到磁盤的**。 2.3.2然后來…

MySQL數據庫--SQL DDL語句

SQL--DDL語句 1&#xff0c;DDL-數據庫操作2&#xff0c;DDL-表操作-查詢3&#xff0c;DDL-表操作-創建4&#xff0c;DDL-表操作-數據類型4.1&#xff0c;DDL-表操作-數值類型4.2&#xff0c;DDL-表操作-字符串類型4.3&#xff0c;DDL-表操作-日期時間類型4.4&#xff0c;實例 …

Spring Cloud 服務追蹤實戰:使用 Zipkin 構建分布式鏈路追蹤

Spring Cloud 服務追蹤實戰&#xff1a;使用 Zipkin 構建分布式鏈路追蹤 在分布式微服務架構中&#xff0c;一個用戶請求往往需要經過多個服務協作完成&#xff0c;如果出現性能瓶頸或異常&#xff0c;排查會非常困難。此時&#xff0c;分布式鏈路追蹤&#xff08;Distributed…