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