当前位置: 代码迷 >> 综合 >> 【论文复现】PointPainting: Sequential Fusion for 3D Object Detection论文学习及复现
  详细解决方案

【论文复现】PointPainting: Sequential Fusion for 3D Object Detection论文学习及复现

热度:23   发布时间:2023-12-17 15:42:03.0

论文学习

(1)摘要

camera和lidar都是自动驾驶领域很重要的传感器。但是,通过在几个主要的benchmark数据集上做实验发现,基于lidar的方法要优于基于lidar和camera融合的方法。在这篇论文中,作者提出了pointpainting,这是一个序列化的融合方法,可以用来解决这个问题。pointpainting通过将lidar的point投射到基于图片的语义分割网络中,并且将每一个类别的分数添加到每一个点上。实验结果表明,在三个不同的点云目标检测方法 Point-RCNN, VoxelNet和PointPillars上,使用KITTI和nuScenes数据集都可以得到好的效果。同时,作者还研究了pointpainting这种融合办法的效果与语义分割输出的质量和形式之间的关系,以及在执行pipeline的时候怎样最小化延迟。

(2)introduction

图片和点云作为物体的两种不同表现形式,可以呈现出来物体的不同特征,比如图片可以反映物体的颜色以及质地texture,点云就可以呈现一个很精确的范围以及深度等。所以在检测的时候有必要将两个结合在一起。
近几年出现了一些融合方法,MV3D和AVOD等等,但是实验发现,这些融合方法在PointPillars,VoxelNet和STD这些目标检测方法上表现的还是不如不使用融合,单纯使用lidar表现的好。这是不是意味着lidar使得视觉变得多余了呢,答案肯定是否定的。
这张图可以看到,左边的图片上的行人和杆子,在右侧的点云图上,其实是很难分辨出来的。所以单纯靠lidar的点云信息去识别物体是不够的。
在这里插入图片描述
在目前fusion精度低的可能原因时,作者认为可能是数据处理的视角不一样,在lidar-based的SOTA的方法中,基本上都是在BEV的视图上进行的,但是在Image视图却是在front视图。lidar数据很容易转化为BEV视图信息,但是Image却不容易,也不精确。因此作者认为fusion的核心问题在于将BEV视角和camrea信息融合。
之前的融合方法大致可以分为这几类:以物体为中心的融合object-centric fusion,连续的特征融合continuous feature fusion,显式转换explicit transform和 detection seeding。
大概介绍一下这几种融合方法。
object-centric fusion:MV3D和AVOD是两个典型。这是一种two-stage的架构,融合是发生在proposals level阶段。
continuous feature fusion:在特征图上进行融合,这类融合方式最大的缺点在于“特征模糊”,这是因为在BEV视图上的一个pixel对应着Image视图上的多个pixel。
explicit transform:将Image转化到BEV视图表示,再在此视图上进行融合。
detection seeding:类似F-pointnet,先通过2D detector得到image检测结果,再投影到3D lidar上。
pointpainting解决了现阶段已有的许多融合方法的问题,它不会在3D检测架构上添加任何的约束;也不会有深度模糊;也没有限制最大的召回。

(3)pointpainting架构

pointpainting架构以点云和图片作为输入,并且得到最终的3D检测框。它主要包括三个阶段:1)语义分割:通过使用一个基于图像的网络来计算分割分数。2)融合:lidar的点云会被写成score。3)3D物体检测:一个基于lidar的3D检测网络。

1)基于图像的语义网络

在融合的pipeline中,使用语义分割有几个好处。一个是语义分割要比3D物体检测容易实现,因为分割只需要本地的,每一个像素的分类,但是3D检测是需要3D定位和分类。语义分割是容易训练,并且比较快。

2)pointpainting

在这里插入图片描述上图中的x,y,z,r和x,y,z,r,t分别是KITTI和nuScenes的点云坐标。x,y,z是空间坐标,r是反射比,t是时间戳。lidar的点云转换是通过投射到camera。在KITTI中,这种转换是Tcamera←lidar。在nuScenes中,转换是需要使用一些额外的东西,整个转换的过程是这样的:
在这里插入图片描述
如上图所示,首先是将lidar转换到ego,然后将ego转换到lidar的capture的,最后转换到图片上。分割网络的输出是C个类别的分数,KITTI中是4个类别(车,行人,骑车的人,背景),nuScenes中是11个类别(10个类别和背景)。一旦lidar的点云被投射到图片上了,分割分数就也会被加到lidar的点云上。但是有些点云可以投影到两个图片中,此时作者的选择方法是随机选择一个就行。

3)3D物体检测

使用3个不同的lidar三维检测器,PointPillars, VoxelNet和 PointRCNN。

(4)实验结果

在nuScenes上的结果如下面两个图所示:
在这里插入图片描述在这里插入图片描述上面两张图中的Painted PointPillars++都是指的本文提出来的融合方法。可以看到,Painted PointPillars++明显提高了mAP指标值。

(5)复现过程

源码地址
本来以为有源码应该很快就可以跑出来,但是发现自己在跑代码的时候还是遇到了一些问题,主要还是自己经验不足。之前很少会去复现论文的源码,所以以为作者给出来的源码肯定是完整的。自己弄的时候才发现这份源码前面缺少了很多import,导致后面一直报错。
(1)坑一:补充import
model.py

import numba
import torch
import numpy as np
from torch import nn
import torchvision
import math
from scipy import stats
from torch.nn import functional as F
from utils import *

eval.py

from utils import *
from datasets import KittiDataset
import torch
import numpy as np
import os
import pickle

train.py

import torch
import copy
from model import SSD, MultiBoxLoss
from dataset import KittiDataset
from torch.utils.data import DataLoader,Dataset
import time

dataset.py

import torch
import PIL
import os
import copy
import numpy as np
from torch import nn
from torchvision import transforms
import pickle
from torchvision import models
import math

(2)坑2:安装各类python包
作者在github中写的是,通过执行pip install -r requirements.txt命令来安装所有的python包,其实就是把所有需要的python包的名称都保存在requirements.txt中,然后pip install。但是我在执行的时候,不光报了错,而且最后有很多的python包都没有安装。有很多都是把whl文件下载好了,但是没有安装这个包。查了查资料,参考了一个知乎的回答pip install -r requirements.txt只下载不安装还报错?。虽然很那啥,但是既然只有这一种办法,我就只好手动自己pip install了一部分的包,不过安装的还是requirement.txt中指定的版本。最后,各类包总算安装成功。
(3)坑三:dataset.py中报错AttributeError: module ‘torch’ has no attribute ‘models’
刚开始我一直以为是torch版本的问题,所以试着升级到最新版本,但是还是没有解决这个问题。我又仔细想了想,既然作者给出了各个包的版本,那不应该有问题啊。后来我去查了查torch.models.segmentation.deeplabv3_resnet101,没有查到相关的,无意发现有一个人发的博客中用到了models,但是用的是torchvision中的models,所以我试着改了一下。如图,改成下面这个,然后就不报错了。
在这里插入图片描述最后,源码是跑成功了,运行过程如下。后面应该还需要对源码做一些修改,之后补充。。。
在这里插入图片描述

  相关解决方案