点云学习笔记11——VoxelNet算法+代码运行

论文地址https://arxiv.org/pdf/1711.06396.pdf
代码地址:https://github.com/qianguih/voxelnet

一、算法分析

VoxelNet算法论文地址:https://arxiv.org/pdf/1711.06396.pdf
参考文章:
无人驾驶汽车系统入门(二十八)——基于VoxelNet的激光雷达点云车辆检测及ROS实现
自动驾驶|3D目标检测:VoxelNet(一) 任乾

VoxelNet:端到端学习的基于点云的 3D 对象检测

摘要

准确检测 3D 点云中的对象是许多应用程序中的一个核心问题,例如自主导航、家政机器人和增强/虚拟现实。将高度稀疏的 LiDAR 点云与区域生成网络(RPN),大多数现有的努力都有专注于手动生成的特征表示,例如,鸟瞰投影。在这项工作中,我们移除了需要手动特征工程的3D点云检测并提出了VoxelNet,一个通用的 3D 检测网络,将特征提取和边界框预测统一为单阶段、端到端可训练的深度网络。

具体也就是说,VoxelNet 将点云划分为等距的 3D体素并通过新引入的体素特征编码 (VFE) 层将每个体素内的一组点转换为统一的特征表示。

通过这种方式,点云被编码为描述性的体积表示,然后连接到 RPN 以生成检测。在 KITTI 汽车检测基准上的实验表明,VoxelNet 在很大程度上优于最先进的基于 LiDAR 的 3D 检测方法。此外,我们的网络学习了具有各种几何形状的物体的有效判别表示,从而在仅基于 LiDAR 的行人和骑自行车者的 3D 检测中取得了令人鼓舞的结果。

介绍

基于点云的 3D 对象检测是各种现实世界应用的重要组成部分,

例如自主导航、家政机器人和增强/虚拟现实。 与基于图像的检测相比,LiDAR 提供可靠的深度信息,可用于准确定位对象并表征其形状。

然而,与图像不同的是,由于 3D 空间的非均匀采样、传感器的有效范围、遮挡和相对姿态等因素,LiDAR 点云稀疏且点密度变化很大。

扫描二维码关注公众号,回复: 13218218 查看本文章

为了应对这些挑战,许多方法为点云手动制作了特征表示,这些特征表示针对 3D 对象检测进行了调整。

几种方法将点云投影到透视图中并应用基于图像的特征提取技术,其他方法将点云栅格化为 3D 体素网格,并使用手工制作的特征对每个体素进行编码。

然而,这些手动设计选择引入了信息瓶颈,阻止这些方法有效利用 3D 形状信息和检测任务所需的不变性。 图像识别和检测任务的重大突破是由于从手工制作的特征转向机器学习的特征。

最近,Qi 等人提出了 PointNet,这是一种端到端的深度神经网络,可以直接从点云中学习逐点特征。 这种方法在 3D 对象识别、3D 对象部分分割和逐点语义分割任务上取得了令人印象深刻的结果。

在Qi的论文中,引入了 PontNet 的改进版本,使网络能够学习不同尺度的局部结构。为了获得令人满意的结果,这两种方法在所有输入点(约有1k 点)上训练了特征变换器网络。由于使用 LiDAR 获得的典型点云包含约 10 万个点,因此训练架构会导致高计算和内存需求。将 3D 特征学习网络扩展到更多数量级的点和 3D 检测任务是我们在本文中解决的主要挑战。

区域提议网络 (RPN) 是一种高度优化的算法,用于高效的对象检测。 然而,这种方法要求数据密集并以张量结构(例如图像、视频)进行组织。典型的 LiDAR 点云并非如此。 在本文中,我们缩小了用于 3D 检测任务的点集特征学习和 RPN 之间的差距。

我们提出了 VoxelNet,这是一种通用的 3D 检测框架,它同时以端到端的方式从点云中学习判别性特征表示并预测准确的 3D 边界框,如图 2 所示。

图 2. VoxelNet 架构。 特征学习网络将原始点云作为输入,将空间划分为体素,并将每个体素内的点转换为表征形状信息的向量表示。 该空间表示为稀疏的 4D 张量。 卷积中间层处理 4D 张量以聚合空间上下文。 最后,RPN 生成 3D 检测
图 2. VoxelNet 架构。 特征学习网络将原始点云作为输入,将空间划分为体素,并将每个体素内的点转换为表征形状信息的向量表示。 该空间表示为稀疏的 4D 张量。 卷积中间层处理 4D 张量以聚合空间上下文。 最后,RPN 生成 3D 检测

我们设计了一种新颖的体素特征编码 (VFE) 层,通过将逐点特征与局部聚合特征相结合,实现体素内的点间交互。堆叠多个 VFE 层允许学习用于表征局部 3D 形状信息的复杂特征。 具体来说,VoxelNet 将点云划分为等距的 3D 体素,通过堆叠的 VFE 层对每个体素进行编码,然后 3D 卷积进一步聚合局部体素特征,将点云转换为高维体积表示。 最后,RPN 使用体积表示并产生检测结果。 这种高效的算法受益于稀疏点结构和体素网格上的高效并行处理。

我们在 KITTI 基准测试提供的鸟瞰检测和全 3D 检测任务上评估 VoxelNet。 实验结果表明,VoxelNet 在很大程度上优于最先进的基于 LiDAR 的 3D 检测方法。 我们还证明了 VoxelNet 在从 LiDAR 点云检测行人和骑自行车的人方面取得了非常令人鼓舞的结果。

相关工作

3D 传感器技术的快速发展促使研究人员开发有效的表示方法来检测和定位点云中的对象。 一些早期的特征表示方法是 . 当丰富详细的 3D 形状信息可用时,这些手工制作的特征会产生令人满意的结果。 然而,它们无法适应更复杂的形状和场景,也无法从数据中学习所需的不变性,这导致在自主导航等不受控制的场景中取得有限的成功。

鉴于图像提供了详细的纹理信息,许多算法从 2D 图像推断出 3D 边界框。 然而,基于图像的 3D 检测方法的准确性受深度估计的准确性限制。

几种基于 LIDAR 的 3D 对象检测技术利用体素网格表示。 用从体素中包含的所有点导出的 6 个统计量对每个非空体素进行编码。 融合多个局部统计数据来表示每个体素。 计算体素网格上的截断符号距离。
对 3D 体素网格使用二进制编码。 通过计算鸟瞰图中的多通道特征图和正面视图中的圆柱坐标,引入了 LiDAR 点云的多视图表示。 其他几项研究将点云投影到透视图上,然后使用基于图像的特征编码方案。

还有几种多模态融合方法,结合图像和激光雷达来提高检测精度。 与仅使用 LiDAR 的 3D 检测相比,这些方法提供了改进的性能,特别是对于小物体(行人、骑自行车的人)或物体距离较远时,因为相机提供的测量值比 LiDAR 高一个数量级。 然而,需要与 LiDAR 时间同步和校准的额外相机限制了它们的使用,并使解决方案对传感器故障模式更加敏感。 在这项工作中,我们专注于仅 LiDAR 检测

1.2. 贡献

  • 我们为基于点云的 3D 检测提出了一种新颖的端到端可训练深度架构 VoxelNet,它直接对稀疏 3D 点进行操作,避免了手动特征工程引入的信息瓶颈。
  • 我们提出了一种实现 VoxelNet 的有效方法,它受益于稀疏点结构和体素网格上的高效并行处理。
  • 我们在 KITTI 基准测试上进行了实验,并表明 VoxelNet 在基于 LiDAR 的汽车、行人和骑自行车者检测基准测试中产生了最先进的结果。

2、VoxelNet

在本节中,我们将解释 VoxelNet 的架构、用于训练的损失函数以及实现网络的有效算法。

2.1、特征学习网络

提出的 VoxelNet 由三个功能组成块:
(1) 特征学习网络,
(2) 卷积中间层
(3) 区域提议网络
我们将在以下部分详细介绍 VoxelNet。

2.1.1 特征学习网络

体素划分
给定一个点云,我们将 3D 空间细分为等距的体素,如图 2 所示。假设点云包含沿 Z、Y、X 轴分别具有 D、H、W 范围的 3D 空间。 我们相应地定义了大小为 v D 、 v H 和 v W 的每个体素。 生成的 3D 体素网格的大小为 D 0 = D/v D ,H 0 = H/v H ,W 0 =W/v W 。 这里,为简单起见,我们假设 D、H、W 是v D , v H , v W 的倍数。

分组
我们根据点所在的体素对点进行分组。 由于距离、遮挡、物体的相对姿态和非均匀采样等因素,LiDAR 点云是稀疏的,并且在整个空间中具有高度可变的点密度。 因此,在分组之后,体素将包含可变数量的点。 如图 2 所示,其中 Voxel-1 的点明显多于 Voxel-2 和 Voxel-4,而 Voxel-3 不包含任何点。

随机抽样
通常,高清 LiDAR 点云由 10 万个点组成。 直接处理所有点不仅会增加计算平台的内存/效率负担,而且整个空间中高度可变的点密度可能会使检测产生偏差。 为此,我们从包含多于 T 个点的那些体素中随机采样固定数量的点 T。 这种采样策略有两个目的,

  • (1) 计算节省(详见第 2.3 节)
  • (2) 减少体素之间点的不平衡

这减少了采样偏差,并为训练增加了更多变化。

堆叠体素特征编码
关键创新是 VFE 层链。 为简单起见,图 2 说明了一个体素的分层特征编码过程。不失一般性,我们在下一段中使用 VFE 第 1 层来描述细节。 图 3 显示了 VFE 第 1 层的架构。

在这里插入图片描述

后面的就不好翻译和理解了,有别人翻译和理解好的,原文:https://blog.csdn.net/AdamShan/article/details/84837211
在这里插入图片描述

在这里插入图片描述

二、代码复现

代码地址:https://github.com/qianguih/voxelnet

2.1、环境准备

linux下:

python3.5+
TensorFlow (tested on 1.4.1)
opencv
shapely
numba
easydict

环境配置命令:

pip3 install tensorflow==1.14.0
pip3 install easydict
pip3 install scikit-build
pip3 install opencv-python==3.4.3.18
pip3 install llvmlite==0.32.1
python3 -m pip install --upgrade --force pip
pip3 install setuptools==33.1.1
sudo -H pip3 install numba
pip3 install matplotlib
pip3 install shapely

如果安装比较慢,可以在后面加上清华源头,如下:

pip3 install xxx -i https://pypi.tuna.tsinghua.edu.cn/simple

其他一些编译和操作见github的readme。
注意:这里opencv安装最好安装opencv3版本,不然后面画直线会让你将小数转化成整数

2.2、下载数据集

这里下载 3D KITTI 检测数据集。要下载的数据包括:

  • Velodyne 点云 (29 GB):输入数据到 VoxelNet
  • 对象数据集的训练标签 (5 MB):VoxelNet 的输入标签
  • 对象数据集的相机校准矩阵 (16 MB):用于预测的可视化
  • 对象数据集的左侧彩色图像 (12 GB):用于预测的可视化
    在这里插入图片描述
    下载好解压并放置到data/KITTI下,并改名,如下图:
├── data
│   ├── KITTI
│   │   ├── calib
│   │   │   ├── testing
│   │   │   │   └── calib
│   │   │   └── training
│   │   │       └── calib
│   │   ├── image
│   │   │   ├── testing
│   │   │   │   └── image_3
│   │   │   └── training
│   │   │       └── image_3
│   │   ├── label
│   │   │   └── training
│   │   │       └── label_2
│   │   └── point_cloud
│   │       ├── testing
│   │       │   └── velodyne
│   │       └── training
│   │           └── velodyne
│   └── test
│       └── validation
│           ├── image_2
│           ├── label_2
│           ├── velodyne
│           └── velodyne_reduced

我修改后如下:
在这里插入图片描述

2.3 、数据预处理

下载下来的数据,按照原文的说法是不能都直接用的,是需要进行裁剪的。源码中裁剪的方式大致是如下:

第一步是选择具有反射率大于0的点,也就是第四维r值大于0.然后将其置为1,这样就可以使得点云数据直接和相机投影矩阵相乘。方便后续通过image的坐标来除去多余的点云。(2)通过image的坐标参数,只把在相机前面的点(z>0)的点投影到二维上面。投影的方式是直接乘上一个从calib中得到的参数。(3)通过Image的大小来投影的2维图片来对点云进行裁剪,裁剪的同时加入了很多新的信息,包括了color(这个通过投影图片处理得到),归一化后的投影图片等。。(具体的还需要再研究)

在这个项目中,我们使用裁剪后的点云数据进行训练和验证。图像坐标外的点云被移除。更新目录data/crop.py并运行data/crop.py以生成裁剪数据。请注意,裁剪后的点云数据将覆盖原始点云数据。

预处理的下面就只执行该文件,执行前,先修改该文件下的路径信息为你自己的路径信息。

# update the following directories
#IMG_ROOT = '/media/hdc/KITTI/image/training/image_2/'
#PC_ROOT = '/media/hdc/KITTI/point_cloud/raw_bin_files/training/velodyne/'
#CALIB_ROOT = '/media/hdc/KITTI/calib/data_object_calib/training/calib/'

IMG_ROOT = './KITTI/image/training/image_3/'
PC_ROOT = './KITTI/point_cloud/training/velodyne/'
CALIB_ROOT = './KITTI/calib/training/calib/'

执行:

python3 crop.py

等待一段时间,将7481多张点云数据处理完毕…
在这里插入图片描述

训练

测试效果

测试的时候,需要准备测试数据集,数据集格式如下:

data
└── test
    └── validation
        ├── image_2
        ├── label_2
        ├── velodyne
        └── velodyne_reduced

需要在config.py文件中修改,

__C.DATA_DIR = './data/test'

在test.py中修改默认的参数,这里我们使用官方提供的一个车辆模型进行测试,并把可视化打开

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='testing')

    parser.add_argument('-n', '--tag', type=str, nargs='?', default='pre_trained_car',
                        help='set log tag')
    parser.add_argument('--output-path', type=str, nargs='?',
                        default='./predictions', help='results output dir')
    parser.add_argument('-b', '--single-batch-size', type=int, nargs='?', default=2,
                        help='set batch size for each gpu')
    parser.add_argument('-v', '--vis', type=bool, nargs='?', default=True,
                        help='set the flag to True if dumping visualizations')

运行代码

python3 test.py

结果会保存在./predictions/vis/000000_front.jpg 文件夹下,
在这里插入图片描述
在这里插入图片描述

这里贴出我的测试代码和日志,如果日志和我的差不多,说明跑通 了。

#!/usr/bin/env python
# -*- coding:UTF-8 -*-

import glob
import argparse
import os
import time
import tensorflow as tf

from model import RPN3D
from config import cfg
from utils import *
from utils.kitti_loader import iterate_data, sample_test_data


if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='testing')

    parser.add_argument('-n', '--tag', type=str, nargs='?', default='pre_trained_car',
                        help='set log tag')
    parser.add_argument('--output-path', type=str, nargs='?',
                        default='./predictions', help='results output dir')
    parser.add_argument('-b', '--single-batch-size', type=int, nargs='?', default=2,
                        help='set batch size for each gpu')
    parser.add_argument('-v', '--vis', type=bool, nargs='?', default=True,
                        help='set the flag to True if dumping visualizations')
    args = parser.parse_args()
    print("args=",args.tag,args.output_path,args.vis,args.single_batch_size)
    dataset_dir = cfg.DATA_DIR
    val_dir = os.path.join(cfg.DATA_DIR, 'validation')
    save_model_dir = os.path.join('./save_model', args.tag)
    print("add by maohuifei 0000 0001,save_model_dir",save_model_dir)
    # create output folder
    os.makedirs(args.output_path, exist_ok=True)
    os.makedirs(os.path.join(args.output_path, 'data'), exist_ok=True)
    if args.vis:
        os.makedirs(os.path.join(args.output_path, 'vis'), exist_ok=True)


    with tf.Graph().as_default():

        gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=cfg.GPU_MEMORY_FRACTION,
                            visible_device_list=cfg.GPU_AVAILABLE,
                            allow_growth=True)
    
        config = tf.ConfigProto(
            gpu_options=gpu_options,
            device_count={
    
    
                "GPU": cfg.GPU_USE_COUNT,
            },
            allow_soft_placement=True,
        )

        with tf.Session(config=config) as sess:
            model = RPN3D(
                cls=cfg.DETECT_OBJ,
                single_batch_size=args.single_batch_size,
                avail_gpus=cfg.GPU_AVAILABLE.split(',')
            )
            if tf.train.get_checkpoint_state(save_model_dir):
                print("Reading model parameters from %s" % save_model_dir)
                model.saver.restore(
                    sess, tf.train.latest_checkpoint(save_model_dir))
            
            print("add by maohuifei 0000 0002")
            for batch in iterate_data(val_dir, shuffle=False, aug=False, is_testset=False, batch_size=args.single_batch_size * cfg.GPU_USE_COUNT, multi_gpu_sum=cfg.GPU_USE_COUNT):

                if args.vis:
                    print("add by maohuifei 0000 0003")
                    tags, results, front_images, bird_views, heatmaps = model.predict_step(sess, batch, summary=False, vis=True)
                else:
                    print("add by maohuifei 0000 0004")
                    tags, results = model.predict_step(sess, batch, summary=False, vis=False)
                
                # ret: A, B
                # A: (N) tag
                # B: (N, N') (class, x, y, z, h, w, l, rz, score)
                print("add by maohuifei 0000 0005")
                for tag, result in zip(tags, results):
                    print("add by maohuifei 0000 0006")
                    of_path = os.path.join(args.output_path, 'data', tag + '.txt')
                    print("add by maohuifei 0000 0007 of_path=",of_path)
                    with open(of_path, 'w+') as f:
                        labels = box3d_to_label([result[:, 1:8]], [result[:, 0]], [result[:, -1]], coordinate='lidar')[0]
                        for line in labels:
                            print("add by maohuifei 0000 0008,line=",line)
                            f.write(line)
                        print('write out {} objects to {}'.format(len(labels), tag))
                        print("add by maohuifei 0000 0009,tag=",tag)
                # dump visualizations
                if args.vis:
                    for tag, front_image, bird_view, heatmap in zip(tags, front_images, bird_views, heatmaps):
                        #print("add by maohuifei 0000 0010,tag=",tag,front_image, bird_view, heatmap)
                        front_img_path = os.path.join( args.output_path, 'vis', tag + '_front.jpg'  )
                        bird_view_path = os.path.join( args.output_path, 'vis', tag + '_bv.jpg'  )
                        heatmap_path = os.path.join( args.output_path, 'vis', tag + '_heatmap.jpg'  )
                        print("add by maohuifei 0000 0011,front_img_path=",front_img_path, bird_view_path, heatmap_path)
                        cv2.imwrite( front_img_path, front_image )
                        cv2.imwrite( bird_view_path, bird_view )
                        cv2.imwrite( heatmap_path, heatmap )

测试日志:

args= pre_trained_car ./predictions True 2
add by maohuifei 0000 0001,save_model_dir ./save_model/pre_trained_car
Reading model parameters from ./save_model/pre_trained_car
add by maohuifei 0000 0002
data_dir= ./data/test/validation
f_rgb1= ['./data/test/validation/image_2/000000.png', './data/test/validation/image_2/000001.png', './data/test/validation/image_2/000002.png', './data/test/validation/image_2/000003.png', './data/test/validation/image_2/000004.png'] ['./data/test/validation/velodyne/000000.bin', './data/test/validation/velodyne/000001.bin', './data/test/validation/velodyne/000002.bin', './data/test/validation/velodyne/000003.bin', './data/test/validation/velodyne/000004.bin'] ['./data/test/validation/label_2/000000.txt', './data/test/validation/label_2/000001.txt', './data/test/validation/label_2/000002.txt', './data/test/validation/label_2/000003.txt', './data/test/validation/label_2/000004.txt']
f_rgb2= ['./data/test/validation/image_2/000000.png', './data/test/validation/image_2/000001.png', './data/test/validation/image_2/000002.png', './data/test/validation/image_2/000003.png', './data/test/validation/image_2/000004.png'] ['./data/test/validation/velodyne/000000.bin', './data/test/validation/velodyne/000001.bin', './data/test/validation/velodyne/000002.bin', './data/test/validation/velodyne/000003.bin', './data/test/validation/velodyne/000004.bin'] ['./data/test/validation/label_2/000000.txt', './data/test/validation/label_2/000001.txt', './data/test/validation/label_2/000002.txt', './data/test/validation/label_2/000003.txt', './data/test/validation/label_2/000004.txt']
data_tag= ['000000', '000001', '000002', '000003', '000004']
add by maohuifei 0000 0003
predict ['000000' '000001' '000002' '000003']
add by maohuifei 0001 0003 0001 point= 91.41279 371.32318 -67.5948 351.65762
add by maohuifei 0001 0003 0001 point= -67.5948 351.65762 -3896.1309 1080.7865
add by maohuifei 0001 0003 0001 point= -3896.1309 1080.7865 -7618.1777 2335.0786
add by maohuifei 0001 0003 0001 point= -7618.1777 2335.0786 91.41279 371.32318
add by maohuifei 0001 0003 0001 point= 666.078 229.28702 702.01984 229.0207
add by maohuifei 0001 0003 0001 point= 702.01984 229.0207 695.61914 223.71368
add by maohuifei 0001 0003 0001 point= 695.61914 223.71368 663.57697 223.96204
add by maohuifei 0001 0003 0001 point= 663.57697 223.96204 666.078 229.28702
add by maohuifei 0001 0003 0001 point= 834.4677 335.0569 988.4915 338.27188
add by maohuifei 0001 0003 0001 point= 988.4915 338.27188 907.69006 290.62967
add by maohuifei 0001 0003 0001 point= 907.69006 290.62967 800.5414 289.36465
add by maohuifei 0001 0003 0001 point= 800.5414 289.36465 834.4677 335.0569
add by maohuifei 0001 0003 0001 point= 618.9592 283.4259 727.1039 283.09888
add by maohuifei 0001 0003 0001 point= 727.1039 283.09888 705.2425 254.70042
add by maohuifei 0001 0003 0001 point= 705.2425 254.70042 626.8389 255.09967
add by maohuifei 0001 0003 0001 point= 626.8389 255.09967 618.9592 283.4259
add by maohuifei 0001 0003 0001 point= 5410.5957 -2386.4988 2988.5862 -2195.1675
add by maohuifei 0001 0003 0001 point= 2988.5862 -2195.1675 220.7514 587.579
add by maohuifei 0001 0003 0001 point= 220.7514 587.579 -131.98865 586.80316
add by maohuifei 0001 0003 0001 point= -131.98865 586.80316 5410.5957 -2386.4988
add by maohuifei 0000 0005
add by maohuifei 0000 0006
add by maohuifei 0000 0007 of_path= ./predictions/data/000000.txt
add by maohuifei 0000 0008,line= Car 0.0000 0.0000 0.0000 -13780.0000 362.0000 75.0000 29716.0000 4.1172 0.8156 2.1234 2.2970 -0.6236 -1.2864 -1.2112 0.9705

write out 1 objects to 000000
add by maohuifei 0000 0009,tag= 000000
add by maohuifei 0000 0006
add by maohuifei 0000 0007 of_path= ./predictions/data/000001.txt
write out 0 objects to 000001
add by maohuifei 0000 0009,tag= 000001
add by maohuifei 0000 0006
add by maohuifei 0000 0007 of_path= ./predictions/data/000002.txt
add by maohuifei 0000 0008,line= Car 0.0000 0.0000 0.0000 661.0000 193.0000 700.0000 228.0000 1.5275 1.6188 3.9634 3.3970 2.4642 34.5918 1.5708 0.9999

add by maohuifei 0000 0008,line= Car 0.0000 0.0000 0.0000 797.0000 183.0000 986.0000 337.0000 1.5316 1.4940 3.1346 3.2396 1.6596 8.9026 -1.4208 0.9844

write out 2 objects to 000002
add by maohuifei 0000 0009,tag= 000002
add by maohuifei 0000 0006
add by maohuifei 0000 0007 of_path= ./predictions/data/000003.txt
add by maohuifei 0000 0008,line= Car 0.0000 0.0000 0.0000 616.0000 183.0000 725.0000 282.0000 1.5155 1.6729 4.2457 1.0322 1.6973 13.3124 1.5708 1.0000

add by maohuifei 0000 0008,line= Car 0.0000 0.0000 0.0000 -132.0000 -2380.0000 5524.0000 586.0000 1.4971 1.5914 3.7251 -2.6127 1.8157 1.3309 1.5708 0.9994

write out 2 objects to 000003
add by maohuifei 0000 0009,tag= 000003
add by maohuifei 0000 0011,front_img_path= ./predictions/vis/000000_front.jpg ./predictions/vis/000000_bv.jpg ./predictions/vis/000000_heatmap.jpg
add by maohuifei 0000 0011,front_img_path= ./predictions/vis/000001_front.jpg ./predictions/vis/000001_bv.jpg ./predictions/vis/000001_heatmap.jpg
add by maohuifei 0000 0011,front_img_path= ./predictions/vis/000002_front.jpg ./predictions/vis/000002_bv.jpg ./predictions/vis/000002_heatmap.jpg
add by maohuifei 0000 0011,front_img_path= ./predictions/vis/000003_front.jpg ./predictions/vis/000003_bv.jpg ./predictions/vis/000003_heatmap.jpg


参考:

VoxelNet算法论文地址:https://arxiv.org/pdf/1711.06396.pdf

猜你喜欢

转载自blog.csdn.net/mao_hui_fei/article/details/120639160
今日推荐