如何客製化企業 RAG 知識庫?— 從資料庫到知識整合的實戰技術
|

如何讓Jetson Nano順利執行OpenCV中CUDA函式

   

作者:Jack Hsu

本篇文章教大家如何讓 Jetson Nano 能順利執行 OpenCV4.1.0 中 CUDA 相關函式,該下載什麼、輸入什麼指令,全部詳細告訴你,有一樣困擾的人快來看看。

今( 2019 )年在好友 James Wu 贊助下,直接從美國帶回最新的 Jetson Nano (以下簡稱 Nano ),一拿到手就迫不急待的開箱測試,沒想到從官網下載映像檔( image )並燒進 SD 卡插入後開機就可使用,內建 Ubuntu 18.04LTS 並自帶 CUDA10.0 、 OpenCV 3.3 、 TensorRT 及多個加速計算庫等基本常用工具包,實在非常方便,不可同日而語。

雖然官方說 16GB 的 SD 卡就夠用,但裝完後大概所剩無幾,於是我改用 32GB SD 卡,方便後面安裝 OpenCV、QT 及其它相關套件。而電源部份因為暫時沒有要大量執行,所以暫時使用 5V/2A 的變壓器供電,不會有當機或開不起來問題。

當大家都想著如何用 Nano 來玩深度學習,但我卻想著 OpenCV 中的那些 GPU(CUDA)加速函式,因為有太多計算量大的視覺問題(如立體匹配等)只要靠那些 GPU(CUDA)加速函式就足夠應付一秒二十到三十張的計算,解決 ARM CPU 計算速度不夠快及不易撰寫多執行緒的問題。

OpenCV 4.1.0 CUDA加速函式庫(圖片來源:Jack提供)

雖然 OpenCV3.3 版後就已加入 DNN 模組,讓原本習慣寫 C++ 的人能輕易整合原先函式,但其支援性直到最新的 4.1 版本才有明顯改善。不過可惜的是目前 OpenCV 中 CUDA 加速模組並不支援 DNN 模組,感覺上 NVIDIA 還是傾向直接使用一般框架(TensorFlow、TensorRT…)會更直接些。除此之外新版更對 OpenVINO 的支援性大幅提升,因此立馬決定要直接把 OpenCV 4.1.0 及 QT5 重新安裝到 Nano ,怎知惡夢再次降臨。

本來以為上次在樹莓派( 3B+ )上已經有裝 OpenCV 4.0 + QT 5 的經驗及步驟,但照著做一遍卻卡在 CMAKE 段,無法成功,上網查了好久,連最知名的 PyImageSearch 都還故作神祕說再等等,最後皇天不負苦心人,讓我找到一些參考資料解決了這個大麻煩。接下來就帶著大家一步一步完成。

一、修正共享桌面錯誤

為了方便遠端操作 Nano ,不接螢幕、鍵盤、滑鼠,第一個想到就是安裝 TeamViewer ,不過卻無法順利執行,就先略過。後來發現 Nano 有提供「共享桌面」功能,沒想到一執行就發出錯誤訊息,上網查了一下才發現是官方版映像檔與舊的 Gnome 桌面不相容,要另外修正後才能使用。首先用文字編輯器(vi, nano, gedit…)開啟 org.gnome.Vino.gschema.xml 。

sudo nano /usr/share/glib-2.0/schemas/org.gnome.Vino.gschema.xml

然後把下列內容加入 xml 檔中,並存檔離開。

<key name='enabled' type='b'>
<summary>Enable remote access to the desktop</summary>
<description>
If true, allows remote access to the desktop via the RFB
protocol. Users on remote machines may then connect to the
desktop using a VNC viewer.
</description>
<default>false</default>
</key>

再來編譯 Gnome schemas ,執行下列指令。

sudo glib-compile-schemas /usr/share/glib-2.0/schemas

完成後,再次進入【設定】啟動【共享桌面】就可順利看到如下圖所示畫面。勾選「允許其它使用者觀看及控制你的桌面」,再點選桌面左上角【搜尋應用程式】,輸入[ Startup ]搜尋啟動設定程式,進入設定畫面按「新增」,隨便輸入一個名字「 Vino 」及註解「 VNC Server 」,最重要的是在命令欄位中輸入「/usr/lib/vino/vino-server」最後按下存檔完成設定。

共享桌面設定流程圖(圖片來源:Jack提供)

不過此時 VNC 還是無法連線,因為須禁用加密功能,打開「終端機」執行下面命令後,重啟Nano,並登入,即可在別台電腦使用VNC Viewer(不限那一種)來和Nano連線了。這裡有個地方要注意,Nano若沒有使用者登入是無法連線的,所以建議把使用者設定成自動登入,VNC才不會連不進。

gsettings set org.gnome.Vino require-encryption false
gsettings set org.gnome.Vino prompt-enabled false
sudo reboot

另外若想確認系統是否已有正確啟動 VNC Server ,可先安裝 nmap ,再用這個工具來檢查。

sudo apg-get install nmap
nmap 主機名稱或編址(IP)

若正常的話,應會看到下面資訊。

5900/tcp open  vnc

二、變更遠端連線桌面解析度

在沒有設定好第一項時只能乖乖在有 HDMI 螢幕及有鍵盤、滑鼠情狀況下操作,由於沒有裝 USB WiFi上網,只好暫時用有線網路測試,當設定好後,而確認 VNC 有啟動,但從另一台筆電始終連不上,一開始以為是防火牆擋住了,試了好多種方案都不行,最後一檢查閘道( Gateway ) IP 才發現是自己搞了一個大烏龍, Nano 和筆電分別在兩個閘道下難怪連不到,最後把 Nano 搬到同一個 HUB 後就解決 VNC 連不上的問題。

好不容易可以用 VNC Viewer (RealVNC)連上線,此時發現因為沒插實體 HDMI 螢幕,所以解析度被降至很低,根本無法操作,因為很多內容都超出可見範圍。經過一番努力終於找到如何修正。只要打開終端機輸入下面指令即可調整成自己想要的解析度。至於更多 xrandr 用法請自行上網了解這裡不多做說明。

sudo xrandr --fb 1280x960

三、增加交換磁區大小

雖然 Nano 有 4GB 的 DDR4 ,但為了後續編譯 OpenCV 及執行大型深度學習網路能正常運作,在這裡強烈建議再多開一些交換磁區(Swap File),至於要多少一般網友建議至少 2~4GB ,以下就以 4GB 舉例。這裡和樹莓派做法不一樣較為複雜些,首先建立一個專屬路徑(不能用sudo權限),進入後再以 fallocate 配置,再以 chmod 變更交換磁區的操作權限為 600 ,最後再以 mkswap、 swapon 將指定路徑變為交換磁區。

mkdir ~/swap/
cd ~/swap/
fallocate -l 4G swapfile
ls -lh swapfile
sudo chmod 600 swapfile
ls -lh swapfile
sudo mkswap swapfile
sudo swapon swapfile
swapon -s

最後為了使每次開機都能自動配置,所以要編輯/etc/fstab

sudo nano /etc/fstab

加入下列路徑,存檔後離開。

/home/ubuntu/swap/swapfile none swap sw 0 0

四、安裝必要套件

這個部份和之前發表過的文章「樹莓派(Pi 3+)安裝OpenCV 4 / QT5填坑心得」一樣,這裡就不多做說明。不過不一樣的是CMAKE部份要修正如下第五項說明。

五、調整 CMAKE 參數進行編譯

此次為了讓 OpenCV 能順利使用 GPU(CUDA),所以編譯時要加入 CUDA 相關設定,包括 WITH_CUDA、CUDA_FAST_MATH、CUDA_ARCH_BIN、CUDA_ARCH_PTX 等等,而之前 ENABLE_VFP3 一定要刪掉,不能 CMAKE 會失敗,猜想應該是 NVIDIA 的 ARM CPU 和標準的有些不同吧?完整 CMAKE 指令如下。

sudo cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \
-D ENABLE_NEON=ON \
-D WITH_CUDA=ON \
-D CUDA_FAST_MATH=1 \
-D CUDA_ARCH_BIN="5.3" \
-D CUDA_ARCH_PTX="" \
-D WITH_GSTREAMER=ON \
-D WITH_LIBV4L=ON \
-D BUILD_opencv_python2=ON \
-D BUILD_opencv_python3=ON \
-D WITH_FFMPEG=ON \
-D BUILD_TESTS=OFF \
-D WITH_QT=ON \
-D OPENCV_ENABLE_NONFREE=ON \
-D BUILD_PERF_TESTS=OFF \
-D INSTALL_PYTHON_EXAMPLES=OFF \
-D INSTALL_C_EXAMPLES=OFF \
-D BUILD_EXAMPLES=OFF ..

如須包含第四項內容的完整安裝程序,可至 GITHUB 下載JetsonNano_OpenCV410_QT5_CUDA_Install.sh,直接執行即可一次搞定。此次編譯(Make)時比上次樹莓派好多了,不用到一整天,大約只需二小時(含第四項再加一至二個小時,視網路速度而定)就可完成。另外發現一個小狀況,雖 Ubuntu 已有設定不進入睡眠,鎖定後也不用密碼,但遇到某些項目執行太久時還是會要 sudo 的密碼,請大家安裝時還是要偶而關心一下進度。

Nano 預設是使用 OpenCV 3.3、Python (2.7),而 Python3 要另行設定。而執行完上述所有程序後應該會把 Python 及 Python3 的環境都重設好,所以若使用 Python 的朋友可以測試一下用 Python 和 Python3 進入後執行下列指令確認 OpenCV 版本。

import cv2
cv2.__version__

六、設定 QT 工作環境

接下來就可以啟動 QT Creator 了,啟動後從主選單進入【工具】─【選項】─【建置並執行】發現【Comilers】和【Kits】的桌面環境都已設定好,直接就就可使用。

QT Creator工作環境設定(圖片來源:Jack提供)

七、撰寫及測試 GPU 加速函式

接下來就用 QT 來實現一個完整的測試例子,這裡主要是利用雙向濾波(Bilateral Filter)這項功能來測試 CPU 版和 GPU(CUDA)版計算速度的差異。主程式主要配置一個可用於顯示 cv::Mat 格式的 QLabel ,另外搭配幾個簡單按鍵,用於載入圖像及計算雙向濾波。

範例程式主畫面(圖片來源:Jack提供)

在 OpenCV 中,不是用 GPU(CUDA)計算就一定會比 CPU 快,主要問題在於計算內容平行展開的程度(如矩陣計算),再來是影像是否一定停在 GPU 記憶體中計算,若不是則 GPU 常會表現得很差。在這個測試例中為了讓較清楚看出 GPU 性能表現,故意將雙向濾波的參數值加大。經測試後得到 CPU 執行時間約 675ms(視作業系統忙碌狀況)變化不大。而 GPU 計算第一次會耗費較多的時間(391ms)而第二次執行少了約 30% 的時間(259ms),之後再執行則在 200~300ms 之間,因此得知 GPU 可能在第一次要配置相關記憶體及參數所以要花費較多時間。

CPU執行雙向濾波結果(圖片來源:Jack提供)

GPU(CUDA)執行雙向濾波結果(圖片來源:Jack提供)

完整安裝腳本、範例程式及程式說明請至下方連結下載。

GITHUB OmniXRI/Jetson_Nano_OpenCV410_QT5

小結

經過這次的實測後確認 OpenCV 上 CUDA 的相關函式的確可以正常運行在 Jetson Nano 上,且明顯提升了不少計算效率,未來若再加上深度學習(DNN)模組,相信可玩出更多實用的案例,讓電腦視覺應用能更加便宜。

(本文轉載自歐尼克斯實境互動工作室原文連結;責任編輯:楊子嫻)

許 哲豪

訂閱MakerPRO知識充電報

與40000位開發者一同掌握科技創新的技術資訊!

Author: 許 哲豪

工作經驗超過二十年,主要專長機電整合、電腦視覺、人機互動、人工智慧、專利分析及新創輔導。曾任機電整合工程師、機器視覺研發副理、技轉中心商業發展經理。目前擔任多家公司兼任技術顧問並積極推廣實境互動相關技術。 主持歐尼克斯實境互動工作室(OmniXRI):http://omnixri.blogspot.com Edge AI Taiwan邊緣智能交流區:https://www.facebook.com/groups/edgeaitw/

Share This Post On
468 ad

Submit a Comment

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *