目錄
前言
一、資源下載
二、環(huán)境配置
提示
pytorch版本設置的原因
需要安裝系統(tǒng)cuda?。?/p>
win10
conda基本環(huán)境配置
python-pcl配置
pointnet2_ops配置
Ubuntu20.04
三、融合數據生成
四、模型訓練
源碼微調
訓練開始
總結
前言
研究6d位姿估計,復現經典代表性論文pvn3d,因實驗需求,在win10和Ubuntu20.04兩個平臺上實現,遇到數不清的bug,不少bug網上記錄較少或記錄不清楚,因此憑借記憶對bug進行記錄。
win10:NVIDIA GeForce RTX 4090、Driver Version: 526.47
Ubuntu20.04:NVIDIA GeForce RTX 3090和NVIDIA GeForce RTX 4090(雙卡服務器)
新手發(fā)博,歡迎指正,期待交到志同道合的朋友。
一、資源下載
pytorch版本過高或過低在安裝庫的時候都比較容易出現問題,因此我采用pytorch1.5分支的了論文源碼,論文源碼地址:ethnhe/PVN3D at pytorch-1.5 (github.com)
該論文可以在多個數據集上跑,比如Linemod_preprocessed(約10GB)、YCB-Video Dataset(約100GB)、OCC?linemod Dataset等,前兩者是比較常用的,我當時考慮到Linemod內存占用比較小,因此選擇了Linemod_preprocessed進行實驗,但是后面發(fā)現Linemod需要數據增強,占用內存會增加至150GB,因此各位需要考慮好自己是否有這個硬件資源,batch-size設置為8(源碼為24)將直接占滿24GB的GPU內存。
Linemod_preprocessed數據集地址可以在以下地址下載:(建議后者)Linemod_preprocessed數據集 - 飛槳AI Studio (baidu.com)https://aistudio.baidu.com/aistudio/datasetdetail/34928
DenseFusion - Google 云端硬盤https://drive.google.com/drive/folders/19ivHpaKm9dOrr12fzC8IDFczWRPFxho7
下載Linemod后,將Linemod_preprocessed文件夾放在PVN3D-pytorch-1.5\pvn3d\datasets\linemod文件夾中即可。
反正我兩個都下過,飛槳的顯示有一些數據損壞了,不知道是否有影響。
由于論文用到了pointnet++網絡,因此需要下載Pointnet2_PyTorch,用于后續(xù)pointnet2_ops庫的安裝。
模型比較復雜,包含了一個語義分割網絡,Linemod數據集的數據量并不能直接滿足要求,因此需要對此進行擴充,需要用到raster_triangle,一個做融合數據的函數,將SUN2012pascalformat 數據集作為背景,與Linemod數據集的對象進行融合,進行數據增強,提高語義分割網絡的魯棒性。該函數在windows運行需要微調,融合效果如下:
?
?融合效果圖與raster_triangle源碼摘自 :ethnhe/raster_triangle: A simple renderer with z-buffer for synthesis data generating. (github.com)https://github.com/ethnhe/raster_triangle
SUN2012pascalformat數據集地址:(存放至raster_triangle根目錄)http://groups.csail.mit.edu/vision/SUN/releases/SUN2012pascalformat.tar.gzhttp://groups.csail.mit.edu/vision/SUN/releases/SUN2012pascalformat.tar.gz
下載sample pose并存放至raster_triangle下的sampled_poses文件夾。
https://hkustconnect-my.sharepoint.com/:f:/g/personal/yhebk_connect_ust_hk/End-Ha7PuQFNktD_ZqBIuQgBwR0wNVDPi-Bneulo7Dy-JA?e=WQba57https://hkustconnect-my.sharepoint.com/:f:/g/personal/yhebk_connect_ust_hk/End-Ha7PuQFNktD_ZqBIuQgBwR0wNVDPi-Bneulo7Dy-JA?e=WQba57
二、環(huán)境配置
有關環(huán)境配置我參考了以下兩篇博客:
PVN3D學習(一):跑通PVN3D_kk_forward的博客-CSDN博客
配置PVN3D_pvn3d復現_童鳶的博客-CSDN博客
提示
pytorch版本設置的原因
兩個系統(tǒng)采用的CUDA環(huán)境配置不同,原本都是采用pytorch1.7,但是pytorch1.7最高只能兼容Anaconda下的cudatoolkit11.0,由于4090顯卡太過于強大,4090似乎最低只能兼容Anaconda下的cudatoolkit11.1,其對應的pytorch版本至少為1.8,因此搭配4090的win10只能使用pytorch1.8啦,雖然一些源碼編譯的庫說不支持pytorch1.8,但是我還是裝成功了。
需要安裝系統(tǒng)cuda??!
注意要分清楚系統(tǒng)的cuda與conda的cuda,系統(tǒng)的cuda一般是需要在Nvidia官網下載安裝包安裝并配置環(huán)境變量的,conda的cuda是在conda環(huán)境中conda install cudatoolkit安裝的,是系統(tǒng)cuda的閹割版,專門為了支持pytorch這種深度學習框架而生的,一般不需要系統(tǒng)cuda也可以運行pytorch,但是系統(tǒng)cuda在源碼安裝某些庫的時候是有關鍵作用的,比如安裝pointnet2_pytorch時,因此,是需要安裝系統(tǒng)cuda的,否則源碼編譯安裝時會報錯?。?!
win10
conda基本環(huán)境配置
- 創(chuàng)建虛擬環(huán)境,python版本為3.8(多篇博客都在3.8版本復現)。
#創(chuàng)建虛擬環(huán)境
conda create -n pvn3d python=3.8
#激活環(huán)境
activate pvn3d
- 安裝依賴庫,如果安裝報錯,需要自行百度whl文件,通過pip install <whl文件路徑>安裝。?
pip3 install numpy Cython h5py pyyaml enum34 future scipy Scikit-learn opencv_contrib_python
pip3 install matplotlib transforms3d scikit_image lmdb setuptools cffi easydict plyfile glumpy tqdm
- torch、torchvision、cudatoolkit安裝。
網上說pointnet2需要比較高的版本(高于torch1.5、1.6),而torch向下兼容性比較好,不需要理會源碼是torch1.5了,大家盡量選擇torch1.7或者1.8吧!conda的cuda版本根據自己的硬件衡量,我的理解是conda的cuda不要低于你硬件支持的最高版本太多,總之要檢查你的GPU、pytorch、cuda是否匹配。實測RTX 4090安裝cuda11.0會出問題,RTX3090安裝cuda10.2也會出問題。
出現RuntimeError: CUDA error: no kernel image is available for execution on the device的情況我通過更換torch至1.8并升級cuda至11.1解決了,是算力不匹配的問題,通過修改一些文件可以解決,但是不如檢查一下你的GPU、pytorch、cuda是否匹配吧。
在conda配置torch、torchvision、cudatoolkit如下。
conda install pytorch==1.8.0 torchvision==0.9.0 cudatoolkit=11.1 -c pytorch -c conda-forge
若網絡較慢,建議在網站download.pytorch.org/whl/torch_stable.html下載whl文件,用pip下載。
直接搜索:(其他版本同理)
cu111/torch-1.8.0%2Bcu111-cp38-cp38-win_amd64.whlhttps://download.pytorch.org/whl/cu111/torch-1.8.0%2Bcu111-cp38-cp38-win_amd64.whl
cu111/torchvision-0.9.0%2Bcu111-cp38-cp38-win_amd64.whlhttps://download.pytorch.org/whl/cu111/torchvision-0.9.0%2Bcu111-cp38-cp38-win_amd64.whl
#cd到whl文件路徑下
pip install cu111/torchvision-0.9.0%2Bcu111-cp38-cp38-win_amd64.whl
pip install cu111/torch-1.8.0%2Bcu111-cp38-cp38-win_amd64.whl
conda基本配置完畢。
python-pcl配置
python-pcl是python中一個處理點云的庫,需要系統(tǒng)安裝pcl支持。python-pcl的維護比較差,不能兼容最新版本的pcl,只能兼容pcl版本為1.6至1.9的版本(1.9版本只支持1.9.1),而且只有3.6、3.7版本支持whl安裝,其他版本只能夠源碼安裝。
以下提供源碼安裝的方案。
我參考了以下博客:Win10平臺python-pcl環(huán)境搭建 - 一杯明月 - 博客園 (cnblogs.com)
- 安裝pcl:從pcl-1.9.1下載pcl安裝包以及pdb壓縮包
如下圖所示選擇自己系統(tǒng)對應的文件。
點擊exe文件進行pcl的安裝,注意安裝過程中提示添加環(huán)境變量Path時,記得勾選給所有用戶添加環(huán)境變量,否則系統(tǒng)可能無法識別pcl。
pcl安裝結束后會自動跳轉至OpenNI2的安裝,將OpenNI2安裝至“D:\PCL 1.9.1\3rdParty”路徑下,其中PCL 1.9.1是你自己安裝的pcl路徑,若沒有自動彈出OpenNI2則自行進入PCL 1.9.1\3rdParty\OpenNI2路徑下尋找OpenNI-Windows-x64-2.2.msi文件進行安裝。
環(huán)境變量需要額外配置?。。。?!請參照我上面參考的博客。
- 安裝python-pcl
下載python-pcl源碼,下載地址:python-pcl源碼
下載gtk,下載地址:GTK+ (tarnyko.net)
打開下載的gtk壓縮包,比如:gtk+-bundle_3.10.4-20131202_win64.zip,將壓縮包的bin目錄下的全部文件解壓到python-pcl-master的pkg-config路徑下,運行腳本InstallWindowsGTKPlus.bat,會在pkg-config路徑下生成三個文件夾如下。
ma's
?激活環(huán)境,在環(huán)境中執(zhí)行以下代碼:
python setup.py build_ext -i
結果如下圖所示:(沒有報錯即可)
若出現以下錯誤,說明pcl沒配置成功,請檢查版本及環(huán)境變量,版本最好下載1.9.1或者1.8.0。
setup.py: error: cannot find PCL, tried pkg-config pcl_common-1.7 pkg-config pcl_common-1.6 pkg-config pcl_common
執(zhí)行以下代碼。
python setup.py install
pip list
觀察輸出的庫列表是否包含版本號為0.3.0rc1的python-pcl。并進入python環(huán)境下,嘗試導入pcl庫,使用import pcl,觀察是否報錯。
大概率會報以下錯誤:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "D:\anaconda3\envs\pvn3d\Lib\site-packages\python_pcl-0.3.0rc1-py3.8-win-amd64.egg\pcl\__init__.py", line 5, in <module>
from ._pcl import *
ImportError: DLL load failed: 找不到指定的模塊。
網上大多方法描述的是在“D:\PCL 1.9.1\3rdParty\OpenNI2\Samples\Bin”路徑下(OpenNI2的安裝路徑)找到OpenNI2.dll,并拷貝至“D:\anaconda3\envs\pvn3d\Lib\site-packages\python_pcl-0.3.0rc1-py3.8-win-amd64.egg\pcl”路徑下。但是這樣并沒有解決我的問題,但是我也確實缺少這個文件。
尋找不到解決的方法,我直接用everything(文件管理器)在系統(tǒng)中搜索缺失的dll文件,并將他們集體拷貝至“D:\anaconda3\envs\pvn3d\Lib\site-packages\python_pcl-0.3.0rc1-py3.8-win-amd64.egg\pcl”,錯誤消除?。?!python-pcl安裝成功。
當然,這個過程還會遇到很多零碎的錯誤,但是基本都可以找到解決的方法,讓我困擾最久的就是這個dll缺失的錯誤了。
pointnet2_ops配置
在以下地址下載pointnet2_ops源碼:https://github.com/erikwijmans/Pointnet2_PyTorch
進入Pointnet2_PyTorch-master文件中,在anaconda終端輸入以下代碼安裝依賴庫。
pip install -r requirements.txt
依賴庫中,pointnet2_ops_lib庫需要通過“Pointnet2_PyTorch-master\pointnet2_ops_lib”下的源碼進行安裝,我在安裝這個庫的時候遇到了巨大的阻力。
- pointnet2_ops_lib庫安裝錯誤
我記錄了一些比較難纏的錯誤,如下:
出現錯誤“subprocess.CalledProcessError: Command ‘[‘ninja‘, ‘-v‘]‘ returned non-zero exit status 1”解決方法_放屁帶出翔丶的博客-CSDN博客出現錯誤“subprocess.CalledProcessError: Command ‘[‘ninja‘, ‘-v‘]‘ returned non-zero exit status 1”解決方法https://blog.csdn.net/fq9200/article/details/125362088這個錯誤很難纏,找的非常辛苦,可以解決。
fatal error C1083: 無法打開包括文件: “cuda_runtime_api.h”: No such file or directory報錯_梟玉龍的博客-CSDN博客fatal error C1083: 無法打開包括文件: “cuda_runtime_api.h”: No such file or directory報錯配置正確的CUDA_HOME ,配置下面的地址$env:CUDA_HOME = "E:\USEAPP\CUDA111\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1"$env:CUDA_HOME = $env:CUDA_PATH_V11_1 # if CUDA_PATH_V11_1https://blog.csdn.net/qq_46107892/article/details/121793105在這里遇到一些nvcc的錯誤,我通過正確配置CUDA_HOME的環(huán)境變量修復了。
#error: STL1002: Unexpected compiler version, expected CUDA 10.1 Update or newer · Issue #61 · Xtra-Computing/thundergbm (github.com)https://github.com/Xtra-Computing/thundergbm/issues/61這里建議我更改系統(tǒng)CUDA的版本,不一定要卸載原來的系統(tǒng)CUDA,可以直接安裝,小心配置好環(huán)境變量就可以,更改為它建議的系統(tǒng)CUDA版本后錯誤消除。
問題解決:nvcc fatal : Unsupported gpu architecture ‘compute_75‘_Kobaayyy的博客-CSDN博客https://blog.csdn.net/Kobaayyy/article/details/110818561算力不匹配的一種解決方法,改改文件也可以解決。
- pointnet_ops安裝
由于此處的setup.py是為linux設計的,因此有一些linux命令需要改為windows下的命令。將46行附近的代碼用以下代碼替代。
#重新修改地址表達,linux的地址表達與windows不同
src_pth="build\lib.win-amd64-cpython-38\pointnet2_utils\_ext.cp38-win_amd64.pyd "
tg_pth="pvn3d\lib\pointnet2_utils\_ext.cp38-win_amd64.pyd"
#os.system('ln {} {}'.format(src_pth, tg_pth)) 原本是linux命令
os.system('copy {} {}'.format(src_pth, tg_pth))
在anaconda中,cd到你的Pointnet2_PyTorch-master目錄下,注意,是Pointnet2_PyTorch-master?。。?/strong>不是Pointnet2_PyTorch-master?。?!輸入下列指令。
python setup.py build_ext
此處一般情況下沒有什么問題,環(huán)境搭建結束。
Ubuntu20.04
由于內容比較多,Ubuntu的部分以后慢慢補充。
三、融合數據生成
Linemod數據集的數據量不足以訓練pvn3d如此龐大的網絡,為了增強網絡語義分割部分的魯棒性,需要對Linemod數據集進行數據增強,論文采用融合數據的方法,本文在(一、資源下載)已經介紹過,這里不贅述了。
分別在以下三個鏈接下載raster_triangle、SUN2012pascalformat、sample pose。
ethnhe/raster_triangle: A simple renderer with z-buffer for synthesis data generating. (github.com)https://github.com/ethnhe/raster_triangle
http://groups.csail.mit.edu/vision/SUN/releases/SUN2012pascalformat.tar.gzhttp://groups.csail.mit.edu/vision/SUN/releases/SUN2012pascalformat.tar.gz
https://hkustconnect-my.sharepoint.com/:f:/g/personal/yhebk_connect_ust_hk/End-Ha7PuQFNktD_ZqBIuQgBwR0wNVDPi-Bneulo7Dy-JA?e=WQba57https://hkustconnect-my.sharepoint.com/:f:/g/personal/yhebk_connect_ust_hk/End-Ha7PuQFNktD_ZqBIuQgBwR0wNVDPi-Bneulo7Dy-JA?e=WQba57
將SUN2012pascalformat壓縮包解壓至raster_triangle根目錄下,將sample pose中的文件解壓至“raster_triangle\sampled_poses”路徑下。
由于windows沒有l(wèi)inux那樣的軟鏈接,直接將Linemod_preprocessed轉移至raster_triangle根目錄,會自動在Linemod_preprocessed中生成fuse和render的融合數據,生成好之后再拷貝回pvn3d源碼中的datasets\linemod下。
raster_triangle是面向linux設計的,其中l(wèi)inux動態(tài)鏈接庫rastertriangle_so.so不能被windows使用,windows需要使用.dll為后綴的動態(tài)鏈接庫,需要用visual studio將rastertriangle_so.cpp與rastertriangle.h編譯生成動態(tài)鏈接庫dll。
此處附上我編譯生成的動態(tài)鏈接庫dll,系統(tǒng)位數為64位。(不確定32位系統(tǒng)能否編譯)
阿里云盤分享https://www.aliyundrive.com/s/39KS2WNPDGr同時,需要修改raster_triangle目錄下的rgbd_renderer.py(訪問過動態(tài)鏈接庫so,需修改訪問的方式以及訪問的對象)。
#在文件第81行左右修改self.dll的讀取路徑
#so_p = './rastertriangle_so.so'
#self.dll = np.ctypeslib.load_library(so_p, '.')
path=r'D:\pvn3d\raster_triangle-master\rastertriangle_so.dll'#rastertriangle_so.dll的絕對地址!
os.add_dll_directory(path)
self.dll=ctypes.cdll.LoadLibrary(path)
激活環(huán)境,在raster_triangle目錄下輸入:
#修改'ape'改變生成融合數據的對象,num為生成融合數據的數據量,一般為默認值
python3 fuse.py --cls ape --fuse_num 10000
python3 rgbd_renderer.py --cls ape --render_num 70000
可以觀察到Linemod_preprocessed文件夾下會生成fuse和renders文件夾,等待融合數據生成完畢后,將Linemod_preprocessed移回pvn3d原linemod數據集放置路徑。
四、模型訓練
編譯器運行環(huán)境與數據集準備就緒后,對論文源碼進行微調即可開始訓練。
源碼微調
- 將pvn3d\train\train_linemod_pvn3d.py移動至pvn3d\train_linemod_pvn3d.py(否則導致有的外部庫無法索引到)
- windows系統(tǒng)不支持用resource庫管理文件,在30行左右將有關resource的代碼行注釋。
# import resource
from collections import namedtuple
import pickle as pkl
# rlimit = resource.getrlimit(resource.RLIMIT_NOFILE)
# resource.setrlimit(resource.RLIMIT_NOFILE, (30000, rlimit[1]))
- ?train_linemod_pvn3d.py中所有的num_workers變量設置為0。
- 將pvn3d\ext-src\include中的頭文件全部轉移至pvn3d\ext-src\src。
- 將所有文件中的“yaml.load(xxxxfile)”修改為"yaml.load(xxxxfile,yaml.FullLoader)",若錯誤仍然存在,應該是pyyaml沒有安裝成功。
pip uninstall pyyaml
pip install pyyaml
- 如果遇到以下錯誤,將報錯位置的“forkserver”修改為“spwan”即可
ValueError: cannot find context for 'forkserver'
- 如果遇到以下錯誤,說明環(huán)境的cuda與硬件算力不匹配,我的顯卡算力過高,cuda11.0無法支持如此高的算力,我無奈只能將torch從1.7更新為1.8,將conda的cuda11.0切換為11.1,但是如此以來,pointnet2無法運行,只能刪除lib中下載的pointnet庫并重新編譯下載pointnet2_ops,只能說,這是一個恐怖的錯誤。
RuntimeError: CUDA error: no kernel image is available for execution on the device
以上每一個地方不修改,都會遇到一些麻煩與難以發(fā)現的錯誤,我目前只記得這么多了,剩余的一般可以搜到。各位如果遇到其他bug,歡迎評論區(qū)留言大家討論。
訓練開始
運行train_linemod_pvn3d.py,超參數在py文件的前面調整,也可以通過終端調整,最終運行的效果如下圖。
訓練時間比較長,batchsize設置為8時一次迭代需要運行2小時,最長訓練迭代數為1000次,而源碼規(guī)定最低損失至少下降25次才可以認為模型訓練結束,估計至少需要3天不間斷訓練。
目前仍然在訓練網絡中,如果訓練不出論文的結果可以直接在Github源碼上下載作者訓練之后的結果,鏈接:onedrive link,?baiduyun link?(access code(提取碼): 8kmp)
已經在淘寶3d打印了一個linemod duck的模型,將嘗試用intel的深度相機與Diana 7機械臂測試論文的效果,祝我好運。
效果展示
抓取效果
PVN3d復現效果展示
總結
本文目前通過windows系統(tǒng)復現了6d位姿估計算法pvn3d,特此記錄復現過程中出現的bug以及一些dbug的心得體會,新手發(fā)帖,各位大佬請指教!文章來源:http://www.zghlxwxcb.cn/news/detail-782474.html
qq:1259809511 歡迎交流溝通!文章來源地址http://www.zghlxwxcb.cn/news/detail-782474.html
到了這里,關于PVN3D——WIN10 PyTorch1.8 Linemod-render最全復現的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!