Jetson AGX Xavier刷机+安装opencv+使用TensorRT加速推理yolo全过程+心路历程
? ? 為了完成導(dǎo)師交代的任務(wù),卑微的打工人開始了沒(méi)有停息的斗爭(zhēng)。盡管沒(méi)有人阻礙你劃水摸魚,但是問(wèn)題一天不解決,自由就一天也不會(huì)來(lái)到。
? ? 我 向 往 自 由 !!!!!!!!!!
? ? 通往自由的道路就是在Xavier上加速yolo的推理。至于你用什么辦法,剪枝還是量化,用哪個(gè)網(wǎng)絡(luò),tiny不tiny,沒(méi)人管,也沒(méi)人在乎。
? ? 涉世未深的我哪里知道通往自由的道路哪條最短,于是只能一樣樣試。
? ? Xavier是arm架構(gòu),這引發(fā)了許多原本沒(méi)有的問(wèn)題。我們依次來(lái)解決。文章主要給第一次操作的朋友避免走彎路用。
? ? 器材準(zhǔn)備:一臺(tái)全新的AGX Xavier,一臺(tái)裝了虛擬機(jī)的筆記本,網(wǎng)線一根。
一、刷機(jī)
? ? 網(wǎng)上有許多刷機(jī)的教程,其流程大抵相似:從nvidia官網(wǎng)上把sdkmanager的包下載下來(lái),然后dpkg -i安裝一下,然后命令行sdkmanager,接下來(lái)手動(dòng)操作。這其中你網(wǎng)速快慢,nvidia要不要注冊(cè)個(gè)賬號(hào),都只是影響你的速度而已,并無(wú)大的坑。已有的內(nèi)容我不再重復(fù)。我只說(shuō)那些文章中沒(méi)有說(shuō)的。
(1)網(wǎng)絡(luò)
? ? 我第一次刷機(jī)是在家里,慢的令人窒息的網(wǎng)速令刷機(jī)的速度慢如蝸牛,實(shí)際上我們知道當(dāng)一個(gè)數(shù)無(wú)限接近于0那就可以理解為是0。于是我當(dāng)然想到了給寬帶升個(gè)級(jí),一頓央求父親大人母親大人之后寬帶終于升級(jí)到了千兆,于是我愉快地打開了sdknamger,期待地看著進(jìn)度條。
? ? 它還是不動(dòng)!!!而且step 1到step 2有時(shí)候都能卡死。。。
? ? 掛vpn!它進(jìn)度條還是不動(dòng)啊不動(dòng)!!!
? ? 中間過(guò)程略去不說(shuō)...反正后來(lái)回了學(xué)校,用區(qū)區(qū)百兆的教育網(wǎng),分分鐘進(jìn)度條就刷刷地漲。。。
? ? 結(jié)論:? ? 在學(xué)校用教育網(wǎng)刷機(jī)。可能學(xué)校跟Nvidia有什么合作吧,誰(shuí)知道呢。
(2)虛擬機(jī)內(nèi)存
? ? 我當(dāng)時(shí)在VMware中創(chuàng)建了60G的虛擬機(jī)內(nèi)存,心想這怎么著也夠了。沒(méi)想到裝完ubuntu之后就只剩二十多個(gè)G了,而刷機(jī)的鏡像要求約莫32g內(nèi)存,所以最好預(yù)留40g以上。
可能性一:你還沒(méi)有創(chuàng)建虛擬機(jī):創(chuàng)建一個(gè)100g的虛擬機(jī)并安裝ubuntu系統(tǒng)。
可能性二:你已經(jīng)創(chuàng)建了虛擬機(jī),但內(nèi)存不夠用:
? ? 千萬(wàn)不需要通過(guò)傳統(tǒng)linux的方法去擴(kuò)展硬盤!不是說(shuō)不可以,而是說(shuō)沒(méi)必要。傳統(tǒng)的方法是先創(chuàng)建物理卷,然后變成卷組,然后邏輯卷,然后邏輯卷組BALABALA...中間出了點(diǎn)差錯(cuò)的話你就忙吧。ubuntu用戶就用ubuntu的方法啊喂。
? ? 方案:1.虛擬機(jī)關(guān)機(jī),刪除快照,點(diǎn)擊編輯虛擬機(jī)設(shè)置,點(diǎn)擊擴(kuò)展磁盤容量。
? ? 2. sudo apt-get install gparted
? ? ? ? gparted
? ? ? ? 確保新空間未上鎖。如果之前通過(guò)命令行操作使得新空間成為了別的狀態(tài)(物理卷等),則需按原路返回,刪除分區(qū),直至gparted顯示未加鎖。
? ? 3.使用較為不錯(cuò)的智商手動(dòng)操作合并磁盤空間。
(3)按部就班完成刷機(jī)。其中step 3 我使用的是手動(dòng)模式,沒(méi)有想象的那么煩,按照網(wǎng)上已有的教程就可以了。刷完機(jī)后,你的xavier中就應(yīng)該已經(jīng)有TensorRT了+cuda+cudnn了。
教程:https://zhuanlan.zhihu.com/p/98807348
? ? ? ? ? ?https://blog.csdn.net/DraemSky/article/details/103823201
? ? ? ? ? ?https://blog.csdn.net/haoqimao_hard/article/details/83447696
(4)Xavier的網(wǎng)絡(luò)連接? 有幾種辦法:
? ? ? ? ?1.用沒(méi)有密碼的網(wǎng)線連接
? ? ? ? ?2.JetPack4.2后支持無(wú)線網(wǎng)卡? 我刷機(jī)的時(shí)候JetPack已經(jīng)是4.5了
? ? ? ? ?3.手動(dòng)配置網(wǎng)線連接的教育網(wǎng)(比較麻煩而且我按照步驟最后把賬號(hào)密碼輸進(jìn)去了看起來(lái)完全正確但是依然沒(méi)有網(wǎng)
? ? ? ? ?4.教育網(wǎng)有密碼配置起來(lái)煩的要死,又不想自己掏錢另外買無(wú)線網(wǎng)卡,使用一根網(wǎng)線完成筆記本和Xavier的網(wǎng)絡(luò)共享。使用筆記本連接無(wú)線網(wǎng)絡(luò),進(jìn)入主機(jī)的網(wǎng)絡(luò)連接,設(shè)置WLAN屬性。
? ? ? 里面這樣設(shè)置:
? ? 此時(shí)用網(wǎng)線連接電腦和Xavier,順利的話Xavier已經(jīng)連上網(wǎng)了。不過(guò)一旦重啟就會(huì)失去連接。
? ? 解決辦法:將/etc/NetworkManager? ?里面的NetworkManager.conf 中的managed屬性修改為true,點(diǎn)擊保存。
(5)換源 注意Xavier是arm架構(gòu),不可換amd的源。https://blog.csdn.net/X_kh_2001/article/details/89198134? ?
? ? ? ? ?進(jìn)入root模式
? ? cp /etc/apt/sources.list /etc/apt/sources.list.bak
? ? gedit?/etc/apt/sources.list
?刪掉或者全部注釋掉,換成:
? ? deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-updates main restricted universe multiverse
? ? deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-updates main restricted universe multiverse
? ? deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-security main restricted universe multiverse
? ? deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-security main restricted universe multiverse
? ? deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-backports main restricted universe multiverse
? ? deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-backports main restricted universe multiverse
? ? deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic main universe restricted
? ? deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic main universe restricted
點(diǎn)擊保存
apt-get update
二、安裝opencv
? ? 為了使用TensorRT完成之后的識(shí)別功能,也為了推理的更快,我們當(dāng)然必須要安裝opencv。
? ? 如果是愣頭青不要命地直接就開干,那肯定是涼涼。
? ? 我們當(dāng)然要先看教程了!!
? ? 教程1:https://www.cnblogs.com/gloria-zhang/p/13819297.html
? ? 這篇教程總體來(lái)說(shuō)是不錯(cuò)的。但是犯了致命錯(cuò)誤!
1.原文中~如果直接復(fù)制出去會(huì)變中文下的~? ?2.原教程里OPENCV_EXTRA_MODULES_PATH 前竟然沒(méi)寫-D!!? 如此嚴(yán)重的問(wèn)題,網(wǎng)絡(luò)教程不可盡信啊?3.root模式下的~會(huì)移動(dòng)到root文件夾下? 因此建議直接寫/home/用戶名
? ??問(wèn)題1:安裝libjasper依賴失敗。
? ??修改源,ubuntu18.04是bionic,對(duì)應(yīng)的清華源里面沒(méi)有l(wèi)ibjasper,網(wǎng)上主流的方案是直接加一條語(yǔ)句,但我實(shí)測(cè)行不通。還有人直接去debian官網(wǎng)下,但我點(diǎn)他那個(gè)鏈接進(jìn)去發(fā)現(xiàn)官網(wǎng)都沒(méi)這個(gè)軟件包了。
? ? 方案:將清華源中(假設(shè)是清華源)帶security的兩行中的bionic降級(jí)到xenial(原地改寫就行)
? ??deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial-security main restricted universe multiverse
? ? deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial-security main restricted universe multiverse
? ??進(jìn)入root模式
? ??apt-get update
? ? apt-get install libjasper1 libjasper.dev
? ? 完事兒再把源換回來(lái)。
? ? 接著按照這個(gè)教程來(lái)將可以使你在c++和python2中順利使用opencv,yolo的MakeFile文件中的OPENCV=1也可以設(shè)置然后運(yùn)行了。但是你會(huì)發(fā)現(xiàn)進(jìn)入python3環(huán)境后import cv2提示你沒(méi)有這個(gè)module,這很奇怪啊,剛剛一頓編譯不是挺好的嗎?實(shí)際上你如果看cmake命令后的顯示(由于是在Xavier上進(jìn)行的操作,因此就沒(méi)有圖了),其中有一塊地方顯示了各語(yǔ)言的支持度,(拿英文寫的,好歹是給人看的語(yǔ)言因此慢慢看就可以了)python3是不支持編譯的,而python2卻可以。因此需要?jiǎng)h除CMakeCache.txt,重新寫cmake語(yǔ)句進(jìn)行編譯。
問(wèn)題2.部分文件下載失敗。解決方案:https://blog.csdn.net/weixin_43727678/article/details/108775097
問(wèn)題3: opencv2/xfeatures2d/cuda.cpp文件缺失
https://www.tqwba.com/x_d/jishu/195647.html
找到stitching的cmakelist.txt里加入:
INCLUDE_DIRECTORIES("/home/open/opencv/opencv-3.4/opencv_contrib/modules/xfeatures2d/include")路徑對(duì)應(yīng)自己改? ? 教程2:https://blog.csdn.net/limuyuanrs/article/details/107988682
? ? 直接拉到教程最下方,我們發(fā)現(xiàn)里面有幾處地方需要注意:
-D BUILD_opencv_python3=YES
-D PYTHON3_EXECUTABLE=/usr/bin/python3?
-D PYTHON_LIBRARIES=/usr/lib/arm-linux-gnueabihf/libpython3.5m.so?
-D PYTHON3_NUMPY_INCLUDE_DIRS=/home/rpdzkj/.local/lib/python3.5/site-packages/
? ? 由于該作者使用的平臺(tái)與Xavier不同,因此路徑上有差異。應(yīng)仔細(xì)查看路徑后重寫2-4條。我的Xavier上敲的命令如下(如果同為Xavier,刷機(jī)過(guò)程也一樣,大概率也是一樣的):
在~/opencv3.4.3/release目錄下敲:
cmake -D WITH_CUDA=ON -D CUDA_ARCH_BIN="7.2" ?-D CUDA_ARCH_PTX="" -D WITH_GSTREAMER=ON -D WITH_LIBV4L=ON -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_EXAMPLES=OFF -D CMAKE_BUILD_TYPE=RELEASE -D BUILD_opencv_python3=YES -D PYTHON3_EXECUTABLE=/usr/bin/python3 -D PYTHON_LIBRARIES=/usr/lib/aarch64-linux-gnu/libpython3.6m.so -D PYTHON3_NUMPY_INCLUDE_DIRS=/usr/local/lib/python3.6/dist-packages/ -D CMAKE_INSTALL_PREFIX=/usr/local? -D OPENCV_EXTRA_MODULES_PATH=~/path/opencv-3.4.3/opencv_contrib-3.4.3/modules ..
? ??
2021/7/15 注:OPENCV_EXTRA_MODULES_PATH后面的路徑也要按照自己的路徑來(lái),不要照抄。這條命令作用是引入了一部分extra mudules,即便敲錯(cuò),也能順利import cv2,但在使用extra mudules? 如 xfeatures2d時(shí)會(huì)報(bào)找不到,因此隱蔽性極高。打開CMakeCache.txt,搜索extra,看看OPENCV_EXTRA_MODULES_PATH,檢查到底寫進(jìn)去沒(méi)有。
?
上面的路徑都是絕對(duì)路徑,opencv3.4.3文件夾在哪就對(duì)應(yīng)著來(lái)敲。
趕緊python3 import cv2試試,于是試試就逝世,報(bào)錯(cuò):非法指令(核心已轉(zhuǎn)儲(chǔ))。
? ?開始自閉。(開始吐血
? ? (然后開始試圖使用pip3 install opencv-python來(lái)解決,一頓操作后安裝成功后還是報(bào)非法指令,然后發(fā)現(xiàn)這會(huì)不會(huì)是網(wǎng)上他們tensorflow用戶cpu版本不支持avx指令集的問(wèn)題一樣的呢?然后發(fā)現(xiàn)xavier好像還真不支持avx,然后開始搜索opencv和avx指令,發(fā)現(xiàn)人家opencv是不會(huì)因?yàn)槟悴恢С謅vx就整個(gè)失敗的,然后就又自閉了...
? ? 答案是:這是因?yàn)閛pencv底層使用了OPENBLAS基礎(chǔ)線性代數(shù)子程序庫(kù),而這個(gè)庫(kù)默認(rèn)是非ARM架構(gòu)的,那么你Xavier肯定就不行了。實(shí)際上你會(huì)發(fā)現(xiàn)import numpy也不行的,道理一樣。
? ? 那么為什么python2可以import cv2呢?
? ? 這個(gè)問(wèn)題我也沒(méi)辦法回答你。。。我猜想是python3 和python2對(duì)opencv的使用方式是不同的。
方案:gedit?~/.bashrc
? ? ? ? ? ?底部加入如下語(yǔ)句:export OPENBLAS_CORETYPE=ARMV8? ? ? ? 點(diǎn)擊保存
? ? ? ? ? ?source ~/.bashrc
問(wèn)題解決。
不過(guò)還有個(gè)小tip就是如果你gedit是在root模式下的話最好先退出root模式再進(jìn)行操作,否則重啟后可能會(huì)出錯(cuò),原因不明。
三、完成模型->onnx->trt的轉(zhuǎn)變(Darknet版yolo)
? ? 教程:https://github.com/jkjung-avt/tensorrt_demos
? ? 把這個(gè)東西git clone下來(lái),放到Xavier里面去,教程按照其Readme中的來(lái)。
? ? 當(dāng)然,其中總會(huì)產(chǎn)生問(wèn)題。在./install_pycuda.sh這步前,實(shí)際上應(yīng)先sudo apt-get install protobuf-compiler,當(dāng)然你不需要預(yù)先知道這個(gè),如果按照步驟來(lái)的話,只需要報(bào)什么錯(cuò)就把什么裝上即可,而且這部分出的錯(cuò)網(wǎng)上都容易找到解決的辦法。需要注意的有一點(diǎn):
? ? onnx的版本不要隨意改動(dòng),1.5.0以上版本的onnx后面編譯是不會(huì)成功的,要問(wèn)為什么,那就是官方不支持。。
? ? 注意點(diǎn):
1.把你的cfg文件和weights文件復(fù)制到tensorrt_demos/yolo文件夾下,然后把名字改了,改成yolov3-416.cfg,yolov3-416.weights這樣的格式。
2.原命令python3 yolo_to_onnx.py -m yolov4-416 后需加 -c 類別數(shù)? ??
? ? 這部分操作實(shí)際上看似非常復(fù)雜,出錯(cuò)的幾率卻比之前的幾步要小的多。|
? ? 結(jié)束后可以進(jìn)行測(cè)試,先測(cè)一張圖看看。
? ??python3 trt_yolo.py --image 某路徑/dog.jpg -m yolov4-416 -c 類別數(shù)
? ??要測(cè)多張圖的話還需要修改原來(lái)的代碼,不過(guò)這部分相比起坑爹的工程問(wèn)題都是小兒科了。
? ? 后續(xù)還可以改成int8精度加速,不過(guò)我現(xiàn)在還沒(méi)試,不過(guò)料想應(yīng)該不至于比前面的幾步更難了。
補(bǔ)充:目前已完成int8加速。在Xavier上加速很可觀:
原速度:yolov3完整版,輸入尺寸416*416:15-18fps? ->30fps(單精度浮點(diǎn)數(shù))? ->50fps(int8)
? ??
四、結(jié)語(yǔ)
? ? 由于你按照了正的順序來(lái)沒(méi)有走彎路,實(shí)際上你到這并沒(méi)有花很多的時(shí)間。其中容易繞彎路的點(diǎn)簡(jiǎn)直數(shù)不勝數(shù),還容易搞錯(cuò)問(wèn)題的方向,隨便往錯(cuò)誤的方向上試試就是幾個(gè)小時(shí)。我沒(méi)有看到一篇教程能覆蓋其中多個(gè)彎路的,因此感到還是需要記錄一下,給后來(lái)者省下一些時(shí)間。
? ? 總需要人寫下這樣的記錄,我既在樹下受人陰涼之惠,自當(dāng)為后來(lái)者省卻來(lái)時(shí)功夫。
總結(jié)
以上是生活随笔為你收集整理的Jetson AGX Xavier刷机+安装opencv+使用TensorRT加速推理yolo全过程+心路历程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 咸鱼硬件—ZTMS开发板固件安装
- 下一篇: 如何领取鸿蒙开发板,如何获取鸿蒙开发板?