mmdetection3d调用votenet来进行3d预测

需要使用的官方的文档链接如下:
1:https://github.com/open-mmlab/mmdetection3d/tree/master/data/sunrgbd
2:https://github.com/open-mmlab/mmdetection3d/blob/master/docs/getting_started.md

总的来说,按照官方文档的步骤进行操作,踩了挺多坑的,并非一帆风顺,还好,最后搞定了。

大坑:该框架只支持linux和mac,我最初以为测试的步骤啥的只是处理数据集,那么只涉及到一些文件的读取,然后就直接在windows下面运行官网上的一些命令,但是,后来发现,无论怎么弄,都不行,即使找到bug所在,但由于我对matlab不熟,也没办法找到解决方案。后面没法了,就去ubuntu下去试那些命令行,果不其然,运行没问题了。所以,不要在windows下运行该框架,听官网的话。

小坑:在进行数据预处理的时候,是使用的matlab来处理的,然后其中的extract_rgbd_data_v2.m这个文件里面第37行代码,parfor imageId = 1:10335,我不知道什么原因,我在这个文件debug的时候,运行到这里matlab就直接蹦了。因为parfor是并行运算,我本以为是我配置 不给力,但是如果我单独建立一个.m文件,然后就在这里运行一块parfor的命令,也能运行,搞来搞去,实在想不出招了,只能将parfor变成for,不使用并行运算了。改了之后,文件能正常运行了,但是,速度很慢,基本要一个多小时才能将这个文件跑完。

流程:
因为要使用到matlab去处理数据集,我们首先要做的就是在liunx下安装matlab,我这里给个链接:https://www.cnblogs.com/hEllOwOrlD2017/p/6936768.html?utm_source=itdadao&utm_medium=referral
,按照这个链接里面来安装吧,我安装下来没问题。
然后,找到matlab的安装路径,一般在安装的过程中会看见,我的安装目录是:/usr/local/MATLAB/R2017a/bin/matlab,你们根据自己的情况调整。最后我们使用下面的命令让matlab可以在终端执行:

sudo ln -s /usr/local/MATLAB/R2017a/bin/matlab  /usr/local/bin/matlab

执行完后,我们就可以在终端直接输入matlab直接启动这个软件了,也可以在终端输入相关命令直接运行.m文件。

matlab安装好之后,要按照作者给的流程去测试的话,需要下载数据集,最开始想按照第二个链接给的那样,去测试scannet数据集,但是这个数据集不好获得,我给scannet的人发邮件了,但是一直没有回我,后面在第一个链接里面看见作者给了下载sunrgbd的数据集,于是打算测试后者。当我们下载数据集之后,我们只需要在sunrgbd下新建一个OFFICIAL_SUNRGBD的文件夹就行了,然后将数据集按照下面的文件目录放置。另外的文件夹和文件会在运行作者的命令的时候生成。然后再进行一系列操作得到权重文件。我感觉应该不是训练数据集,因为如果是从头开始训练,训练时长不会这么短,但是如果不按照上面第一个链接那么操作,直接按照第二个链接操作,会提示缺少某个文件,而那个文件就是第一个链接中执行完命令后得到的文件。
在这里插入图片描述
执行的命令如下:

cd matlab
matlab -nosplash -nodesktop -r 'extract_split;quit;'
matlab -nosplash -nodesktop -r 'extract_rgbd_data_v2;quit;'
matlab -nosplash -nodesktop -r 'extract_rgbd_data_v1;quit;'
cd ..
python sunrgbd_data.py --gen_v1_data
cd ../..
python tools/create_data.py sunrgbd --root-path ./data/sunrgbd --out-dir ./data/sunrgbd --extra-tag sunrgbd

如果一切顺利,经过两三个小时(主要是extract_rgbd_data_v2这个文件,如果将parfor改为for,只能一个一个文件执行,速度贼慢。还有就是create_data.py,这个文件好像也要半个多小时才能执行完毕),就可以的得到上面图片中的文件夹和文件,我们可以开始进行测试阶段了。

测试之前,我们需要去下载已经训练好的votenet关于sunrgbd的模型,下载链接:https://github.com/open-mmlab/mmdetection3d/tree/master/configs/votenet,在这个页面你能找到下载位置,经测试,不需要翻墙出去下载。记住你下载的这个文件的位置,我们按照官网的说明,将其放到checkpoints这个文件夹下面。然后,我们就可以执行下面的命令了:

python tools/test.py configs/votenet/votenet_16x8_sunrgbd-3d-10class.py checkpoints/votenet_16x8_sunrgbd-3d-10class_20200620_230238-4483c0c0.pth --show --show-dir ./data/sunrgbd/show_results1

这行命令会在./data/scannet/show_results下生成非常多的文件夹,然后每个文件夹下面有两个文件:…obj和…ply文件。这两个文件是专门的3d点云数据保存的形式,初次看见这个,我也很懵逼,还好网络大佬多,百度了一下,大概就知道这文件啥意思了,给大家一个链接:ply文件解释,建议大家自己用Python或者其他语言打开这个文件去看看数据,打开ply的方式在后面会给出。

还有一种命令:

python tools/test.py configs/votenet/votenet_16x8_sunrgbd-3d-10class.py checkpoints/votenet_16x8_sunrgbd-3d-10class_20200620_230238-4483c0c0.pth  --eval mAP --options 'show=True' 'out_dir=./data/sunrgbd/show_results1'

这个命令会输出三个文件,…obj, …gt.ply, …pred.ply,而且最后还会输出map的结果,值得注意一下的是,这些生成的文件是在整个命令结束后才会生成,不是边运行边生成的。在官方给的解释中,obj文件是原始的点云数据,…pred.ply是预测的结果,…gt.ply是预测的边框这些,个人感觉,…gt.ply是在…pred.ply的基础上进行筛选的,就跟2d目标检测的时候利用nms来筛选。这几个生成的文件,当前,只能通过第三方的软件来显示,比如meshlab这个软件,官方给的前景是后续会给出相应的接口来显示点云数据。我们就使用这个软件看看效果吧,效果如下:
初始点云的显示:
在这里插入图片描述预测点云的显示:
在这里插入图片描述大家可以看见很多3d的边框,那就是预测的结果。

筛选后,也就是…gt.ply的点云数据显示:
在这里插入图片描述可以看出,第三张照片比第二张少了很多边框,就是筛选后的结果。

刚开始的时候,我得到这些图片一直有些不理解,为什么不像其它的3d检测预测一样,将最后的3d边框直接画在正常的图像上面。也就是rgb图像上,后面我又去看了看votenet这个网络模型,才知道votenet设计的初衷就是只利用点云数据来进行预测,这是他的一个创新点,所以最后这样显示也就可以理解了。

为了方便我们直接调用votenet的模型去预测,官方也给了相应的接口,接口如下:

from mmdet3d.apis import init_detector, inference_detector

config_file = 'configs/votenet/votenet_8x8_scannet-3d-18class.py'
checkpoint_file = 'checkpoints/votenet_8x8_scannet-3d-18class_20200620_230238-2cea9c3a.pth'

# build the model from a config file and a checkpoint file
model = init_detector(config_file, checkpoint_file, device='cuda:0')

# test a single image and show the results
point_cloud = 'test.bin'
result, data = inference_detector(model, point_cloud)
# visualize the results and save the results in 'results' folder
model.show_results(data, result, out_dir='results')

但是值得注意一个地方,那就是这个接口是直接预测点云数据的,而ply文件里面除了点云数据,还有额外的东西,所以需要对ply文件进行处理,将Ply转化为纯粹的点云,转化代码如下:

import numpy as np
import pandas as pd
from plyfile import PlyData

def conver_ply(input_path, output_path):
    plydata = PlyData.read(input_path)  # read file
    data = plydata.elements[0].data  # read data
    data_pd = pd.DataFrame(data)  # convert to DataFrame
    data_np = np.zeros(data_pd.shape, dtype=np.float)  # initialize array to store data
    property_names = data[0].dtype.names  # read names of properties
    for i, name in enumerate(
            property_names):  # read data by property
        data_np[:, i] = data_pd[name]
    data_np.astype(np.float32).tofile(output_path)

我一直很奇怪的是,官网只是将最后预测的boundingbox的点云数据给出来了,但是,每个boundingbox对应的标签,我查看官网的文档,一直没有找到解释,上面测试生成的ply文件,里面也没有标签数据。所以,还得进一步去看看源代码或者看看官网文档,毕竟这个最后预测的类别的数据还是很重要的。

2020 8.13
ps:利用官方的接口inference_detector(model, point_cloud),最后返回的数据中,results里面是有标签数据的,同时,返回的预测的boundingbox的array中,每行有七列,分别对应的是中心的的x,y,z,以及boundingbox的长,宽,高,以及整个boundingbox和z的航向角。

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值