PVN3D——WIN10 PyTorch1.8 Linemod-render最全复现

PVN3D——WIN10 PyTorch1.8 Linemod-render最全复现研究6d位姿估计,复现经典代表性论文pvn3d,在win10和Ubuntu20.04两个平台上实现,遇到数不清的bug,凭借记忆对bug进行记录

目录

前言

一、资源下载

二、环境配置

提示

pytorch版本设置的原因

需要安装系统cuda!!

win10

conda基本环境配置

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(双卡服务器)

新手发博,欢迎指正,期待交到志同道合的朋友。

一、资源下载

pytorch版本过高或过低在安装库的时候都比较容易出现问题,因此我采用pytorch1.5分支的了论文源码,论文源码地址:ethnhe/PVN3D at pytorch-1.5 (github.com)

该论文可以在多个数据集上跑,比如Linemod_preprocessed(约10GB)、YCB-Video Dataset(约100GB)、OCC linemod Dataset等,前两者是比较常用的,我当时考虑到Linemod内存占用比较小,因此选择了Linemod_preprocessed进行实验,但是后面发现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,用于后续pointnet2_ops库的安装。

模型比较复杂,包含了一个语义分割网络,Linemod数据集的数据量并不能直接满足要求,因此需要对此进行扩充,需要用到raster_triangle,一个做融合数据的函数,将SUN2012pascalformat 数据集作为背景,与Linemod数据集的对象进行融合,进行数据增强,提高语义分割网络的鲁棒性。该函数在windows运行需要微调,融合效果如下:

PVN3D——WIN10 PyTorch1.8 Linemod-render最全复现

PVN3D——WIN10 PyTorch1.8 Linemod-render最全复现​融合效果图与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

二、环境配置

有关环境配置我参考了以下两篇博客:

PVN3D学习(一):跑通PVN3D_kk_forward的博客-CSDN博客

配置PVN3D_pvn3d复现_童鸢的博客-CSDN博客

提示

pytorch版本设置的原因

两个系统采用的CUDA环境配置不同,原本都是采用pytorch1.7,但是pytorch1.7最高只能兼容Anaconda下的cudatoolkit11.0,由于4090显卡太过于强大,4090似乎最低只能兼容Anaconda下的cudatoolkit11.1,其对应的pytorch版本至少为1.8,因此搭配4090的win10只能使用pytorch1.8啦,虽然一些源码编译的库说不支持pytorch1.8,但是我还是装成功了。

需要安装系统cuda!!

注意要分清楚系统的cuda与conda的cuda,系统的cuda一般是需要在Nvidia官网下载安装包安装并配置环境变量的,conda的cuda是在conda环境中conda install cudatoolkit安装的,是系统cuda的阉割版,专门为了支持pytorch这种深度学习框架而生的,一般不需要系统cuda也可以运行pytorch,但是系统cuda在源码安装某些库的时候是有关键作用的,比如安装pointnet2_pytorch时,因此,是需要安装系统cuda的,否则源码编译安装时会报错!!!

win10

conda基本环境配置

  • 创建虚拟环境,python版本为3.8(多篇博客都在3.8版本复现)。
#创建虚拟环境
conda create -n pvn3d python=3.8
#激活环境
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中一个处理点云的库,需要系统安装pcl支持。python-pcl的维护比较差,不能兼容最新版本的pcl,只能兼容pcl版本为1.6至1.9的版本(1.9版本只支持1.9.1),而且只有3.6、3.7版本支持whl安装,其他版本只能够源码安装。

以下提供源码安装的方案。

我参考了以下博客:Win10平台python-pcl环境搭建 – 一杯明月 – 博客园 (cnblogs.com)

  • 安装pcl:从pcl-1.9.1下载pcl安装包以及pdb压缩包

如下图所示选择自己系统对应的文件。

PVN3D——WIN10 PyTorch1.8 Linemod-render最全复现

点击exe文件进行pcl的安装,注意安装过程中提示添加环境变量Path时,记得勾选给所有用户添加环境变量,否则系统可能无法识别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文件进行安装。

环境变量需要额外配置!!!!!请参照我上面参考的博客。

  • 安装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路径下生成三个文件夹如下。

PVN3D——WIN10 PyTorch1.8 Linemod-render最全复现ma’s

 激活环境,在环境中执行以下代码:

python setup.py build_ext -i

结果如下图所示:(没有报错即可)

PVN3D——WIN10 PyTorch1.8 Linemod-render最全复现

若出现以下错误,说明pcl没配置成功,请检查版本及环境变量,版本最好下载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

执行以下代码。

python setup.py install
pip list

观察输出的库列表是否包含版本号为0.3.0rc1的python-pcl。并进入python环境下,尝试导入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(文件管理器)在系统中搜索缺失的dll文件,并将他们集体拷贝至“D:\anaconda3\envs\pvn3d\Lib\site-packages\python_pcl-0.3.0rc1-py3.8-win-amd64.egg\pcl”,错误消除!!!python-pcl安装成功。此处可能并未显示确实什么dll文件,大家可以直接在python-pcl或pcl的安装目录下直接搜dll文件,把所有dll文件都拷贝过去就可以了。

当然,这个过程还会遇到很多零碎的错误,但是基本都可以找到解决的方法,让我困扰最久的就是这个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库安装错误

我记录了一些比较难缠的错误,如下:

PVN3D——WIN10 PyTorch1.8 Linemod-render最全复现这个错误很难缠,找的非常辛苦,可以解决。

PVN3D——WIN10 PyTorch1.8 Linemod-render最全复现在这里遇到一些nvcc的错误,我通过正确配置CUDA_HOME的环境变量修复了。

#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这里建议我更改系统CUDA的版本,不一定要卸载原来的系统CUDA,可以直接安装,小心配置好环境变量就可以,更改为它建议的系统CUDA版本后错误消除。

PVN3D——WIN10 PyTorch1.8 Linemod-render最全复现算力不匹配的一种解决方法,改改文件也可以解决。

  • 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!!!不是pointnet2_ops_lib!!!输入下列指令。

python setup.py build_ext

此处一般情况下没有什么问题,环境搭建结束。

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没有linux那样的软链接,直接将Linemod_preprocessed转移至raster_triangle根目录,会自动在Linemod_preprocessed中生成fuse和render的融合数据,生成好之后再拷贝回pvn3d源码中的datasets\linemod下。

raster_triangle是面向linux设计的,其中linux动态链接库rastertriangle_so.so不能被windows使用,windows需要使用.dll为后缀的动态链接库,需要用visual studio将rastertriangle_so.cpp与rastertriangle.h编译生成动态链接库dll。

此处附上我编译生成的动态链接库dll,系统位数为64位。(不确定32位系统能否编译)

阿里云盘分享https://www.aliyundrive.com/s/39KS2WNPDGr同时,需要修改raster_triangle目录下的rgbd_renderer.py(访问过动态链接库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)

激活环境,在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数据集放置路径。

四、模型训练

编译器运行环境与数据集准备就绪后,对论文源码进行微调即可开始训练。

源码微调

  • 将pvn3d\train\train_linemod_pvn3d.py移动至pvn3d\train_linemod_pvn3d.py(否则导致有的外部库无法索引到)
  • windows系统不支持用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”修改为“spawn”即可
ValueError: cannot find context for 'forkserver'
  • 如果遇到以下错误,说明环境的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

以上每一个地方不修改,都会遇到一些麻烦与难以发现的错误,我目前只记得这么多了,剩余的一般可以搜到。各位如果遇到其他bug,欢迎评论区留言大家讨论。

训练开始

运行train_linemod_pvn3d.py,超参数在py文件的前面调整,也可以通过终端调整,最终运行的效果如下图。

PVN3D——WIN10 PyTorch1.8 Linemod-render最全复现


训练时间比较长,batchsize设置为8时一次迭代需要运行2小时,最长训练迭代数为1000次,而源码规定最低损失至少下降25次才可以认为模型训练结束,估计至少需要3天不间断训练。

目前仍然在训练网络中,如果训练不出论文的结果可以直接在Github源码上下载作者训练之后的结果,链接:onedrive link, baiduyun link (access code(提取码): 8kmp)

已经在淘宝3d打印了一个linemod duck的模型,将尝试用intel的深度相机与Diana 7机械臂测试论文的效果,祝我好运。

PVN3D——WIN10 PyTorch1.8 Linemod-render最全复现

效果展示

抓取效果

PVN3d复现效果展示

总结

本文目前通过windows系统复现了6d位姿估计算法pvn3d,特此记录复现过程中出现的bug以及一些dbug的心得体会,新手发帖,各位大佬请指教!

qq:1259809511 欢迎交流沟通!

今天的文章PVN3D——WIN10 PyTorch1.8 Linemod-render最全复现分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/85892.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注