环境搭建
conda create -n pvnet python=3.7
conda activate pvnet
conda install pytorch==1.4.0 torchvision==0.5.0 cudatoolkit=10.2 -c pytorch
pip install open3d opencv-python cffi yacs pycocotools tensorboardX
cd clean-pvnet/lib/csrc/
export CUDA_HOME="/usr/local/cuda"#cuda位置
cd ransac_voting
python setup.py build_ext --inplace
cd ../nn
python setup.py build_ext --inplace
if gcc: error: src/nearest_neighborhood.cu.o: 没有那个文件或目录
nvcc src/nearest_neighborhood.cu -c -o src/nearest_neighborhood.cu.o -x cu -Xcompiler -fPIC -O2 -arch=sm_52 -I {"/usr/local/cuda/include"}
# 不知道为什么到单独执行nvcc才能生成.o文件
cd ../fps
python setup.py build_ext --inplace
# 都成功的话会在三个文件夹下分别生成xx.cpython-37m-x86_64-linux-gnu.so
# If you want to run PVNet with a detector
cd ../dcn_v2
python setup.py build_ext --inplace
# If you want to use the uncertainty-driven PnP
cd ../uncertainty_pnp
sudo apt-get install libgoogle-glog-dev
sudo apt-get install libsuitesparse-dev
sudo apt-get install libatlas-base-dev
python setup.py build_ext --inplace
代码流程
- 数据预备
- 计算关键点
- 根据 txt 文件读取对应序列号真值,计算二维关键点
- 所有信息打包到 json 中
- 训练过程
- 加载数据,跑网络
- 计算损失函数=mask 内的向量场 loss + mask 分割 loss,详情可在文件
clean-pvnet/lib/train/trainers/pvnet.py
内查看
- 预测过程
- 加载数据,跑网络
- 根据输出的向量场和 mask 进行 ransac 投票,选择投票得分最高的点作为关键点,详情查看文件
ransac_voting_gpu.py
代码记录
数据预备
- 在
config.py
中修改_heads_factory
,可以改变关键点个数 handle_custom_dataset.sample_fps_points()
会覆盖原有的 fps. txt 文件,已添加args.fps="True"
时,才会执行- 模型、关键点单位均为 m,pose[:, 3]如果除以 1000 是为了 t 单位
- 读取数据格式不同时,可在
handle_custom_dataset.py
中进行修改record
- 注意 center_3d,为物体几何中心,已改为固定值
训练过程
- laod 数据类型在 train、test 的基础上,增加了 val 数据
- 增加了根据损失大小保存模型
- 训练时增加了随机颜色增强,
augment()
函数第一行自行注释/取消 - 因为按 epoch 保存在模型名字里,所以 loadnet 时,epoch 就是指 load 哪个模型,默认是-1,即最高,可改
cfg.test.epoch
来指定 - 修改了
pnp()
函数的 cv2. method 为SOLVEPNP_EPNP
- 增加了评价指标,在
summarize
中添加路径参数,可存储数据 - 增加了对应的可视化数据集接口
pvnet-rendering
pip install easydict lmdb transforms3d openEXR
- 下载并解压 blender2.79a Index of /release/Blender2.79/
- 下载背景数据集并链接
fuse.py
中collect_custom_set_info()
函数可更改读取数据格式,会存储到{}_info.pkl
中,可用 cover 参数决定是否要覆盖render_utils.py
中get_poses()
函数可更改读取位姿格式,每次都会覆盖{}_poses.npy
,可在render_backend.py
中修改render()
函数的相机相关的代码直接改相机位置- 背景图片打包在
background_info.pkl
,除非删除,不会覆盖;同理 render 的bg_imgs.npy
,如果是空删除重新即可 - 没有库的问题 No module named ‘transforms3d’ · Issue #3 · zju3dv/pvnet-rendering · GitHub
wget https://bootstrap.pypa.io/pip/3.5/get-pip.py
./blender-2.79a-linux-glibc219-x86_64/2.79/python/bin/python3.5m ./get-pip.py
./blender-2.79a-linux-glibc219-x86_64/2.79/python/bin/pip install transforms3d easydict
A (dumb) workaround is to copy the missing libraries (packages or modules) from the lib dir of your preferred python interpreter to the blender python lib dir (which can be found in the error message).
For instance, for me, the solution is
cp -r /home/MYNAME/Applications/anaconda3/lib/python3.7/site-packages/transforms3d* /home/MYNAME/Applications/blender-2.79-linux-glibc219-x86_64/2.79/python/lib/python3.5/site-packages/
Above dirs should be changed according to one’s own settings.