CRF-Net 论文阅读及代码复现

CRF-Net 论文阅读及代码复现

《A Deep Learning-based Radar and Camera Sensor Fusion Architecture for Object Detection》

【论文地址】https://arxiv.org/abs/2005.07431

一、论文概述

论文通过在网络层中融合相机数据和雷达稀疏点云投影后的数据,来增强2D目标检测的效果,并提出了一种训练策略BlackIn,将网络训练的重点放在学习雷达数据上。

二、雷达数据预处理

​ 论文中采用的是Continental ARS430毫米波雷达,雷达输出的是2D稀疏点云。

  • 该模型以图像和雷达数据作为输入,输入的图像包括RGB三通道,另外添加了一维雷达通道。论文中将雷达2D点云数据投影到垂直平面上,雷达数据以像素形式映射到图像平面。
  • 由于雷达不提供目标的高度信息,论文中假设雷达检测到的目标的3D坐标是2D坐标在垂直方向上的延伸,论文中检测的目标分为汽车、卡车、摩托车、自行车和行人,为了覆盖这些目标的高度,假设雷达的检测高度为3m。
  • 为了处理雷达数据的稀疏性,论文中将最后13个雷达周期(约1 s)的数据共同映射到图像上来提高雷达数据的密度,虽然增加部分噪声误差,但该误差在可接受范围内。

示例场景中网络输入数据的格式:
在这里插入图片描述
在训练和评估中,论文中对原始数据进行滤波,使得经过过滤的真实数据只包含至少一个雷达检测的目标,滤波后的数据如下:
在这里插入图片描述
​ 有一部分目标会被过滤掉,作者在论文中分析了几点原因:论文中不补偿其他目标的运动,雷达和相机的空间标定会存在偏差、雷达和相机的时间对齐等。

三、网络结构

  • 论文的网络模型建立在RetinaNet的基础上,以VGG16作为backbone,网络的输入为增加了雷达通道的四维图像,通过VGG处理雷达和相机的数据。
  • 左侧的分支中,原始雷达数据经过max-pooling层以不同的比例处理雷达数据输入;
  • 以VGG16的卷积块作为主要处理单元,在每层均进行融合处理,深层网络增加FPN(特征金字塔)产生分类和回归结果。
    在这里插入图片描述
    论文中提出了一种雷达和相机融合训练的策略,借鉴了Dropout的思想,论文中称之为BlackIn。对于百分之20的训练图像,在随机的训练步长中,丢弃所有用于图像特征提取的神经元,目的在于图像数据的缺失使得网络能更多地依靠雷达数据的特征。

预训练模型采用的是在图像上训练的模型。

四、论文中的实验结果

  • 数据集:nuScenes、TUM(论文中制作的数据集)

    数据集中目标的数量如图:
    在这里插入图片描述

  • baseline:RetinaNet

  • 论文中的实验对比图,对比了baseline和论文中的方法,以及论文中提出的BlackIn策略、几种毫米波雷达数据滤波方法。
    在这里插入图片描述
    【备注】这几种过滤方式没太看懂,论文中也没有详细解释,也没查到相关资料。该部分论文原文:
    在这里插入图片描述

五、论文复现

【官方代码】https://github.com/TUMFTM/CameraRadarFusionNet

1、数据集准备
从nuScenes网站下载nuScenes数据集。需要注册登录。下载地址
在这里插入图片描述
我下载的是mini的数据集,解压之后是maps、samples、sweeps、v1.0-mini四个文件夹。也可以下载其他的数据集。
如有需要可以下载其他更大的数据集。

2、环境搭建
Ubuntu 18.04 + CUDA 10.0 + Python 3.5
运行以下代码安装依赖库:

pip install -e .
python setup.py build_ext --inplace

【出现的问题】
(1)提示没有安装pyximport模块
解决方法:

pip install Cython

如果安装好之后还出现以下错误:
ImportError: Building module crfnet.utils.compute_overlap failed: [“distutils.errors.CompileError: command ‘gcc’ failed with exit status 1\n”]
在这里插入图片描述
或者是:ModuleNotFoundError:No module named ‘crfnet.utils.compute_overlap’
在这里插入图片描述
这两个错误都是python中导入pyx文件出错的问题,解决方法都一样的。

打开出错的文件:/crfnet/utils/anchor_calc.py
from ..utils.compute_overlap import compute_overlap之前添加:

import pyximport
pyximport.install()

在这里插入图片描述
然后再运行如下命令:

python setup.py build_ext --inplace

即可解决在python中导入pyx文件的问题。

(2)System error:unknown opcode
在这里插入图片描述
解决方法:
出现这个错误的原因是当时使用了Python3.7,项目中作者要求使用Python3.5,换成Python3.5就OK了。

3、开始训练

修改configs/default.cfg文件,重命名为crf_net.cfg,每个参数的解释在官方提供的README.md文件中可以找到。根据需求修改模型的保存路径、加载模型的路径、数据集路径、数据的一些配置、gpu使用率、gpu数量等设置。
在这里插入图片描述
下载预训练模型:crf-net.h5

准备就绪之后,运行如下代码,开始训练:

python train_crfnet.py --config configs/crf_net.cfg

训练完成之后在根目录下生成saved_models文件夹,里面保存了训练好的模型以及log信息。

4、模型评估

运行如下命令进行模型评估:

python evaluate_crfnet.py --model saved_models/crf_net.h5 --config configs/crf_net.cfg --st 0.5

–config :配置文件路径
–model :待评估的权重文件
–st :阈值
–render:在执行过程中显示图像
–eval_from_detection_pickle :从硬盘驱动器加载保存的检测文件

【出现的问题】

(1)subprocess.CalledProcessError: Command ‘[‘git’, ‘rev-parse’, ‘HEAD’]’ returned non-zero exit status 128.
在这里插入图片描述

解决方法:

找到出错的这个文件:/crfnet/utils/configs.py第58行,这两行应该是配置git,我给注释掉了,这个错误就没有了。(至于错误的原因查了一些资料,没太深入去看 ,暂不清楚。)
在这里插入图片描述

(2)_tkinter.TclError: couldn’t connect to display “localhost:12.0”
应该是因为在服务器上训练的,没有GUI,使用matplot等交互功能时候会报错。
在这里插入图片描述
解决方法:
报错的是在evaluate_crfnet.py文件中,打开evaluate_crfnet.py文件,添加以下代码,如下图所示:

matplotlib.use('Agg')

在这里插入图片描述
解决了这个问题之后,运行evaluate_crfnet.py文件就会生成和cfg名字一样的文件夹,里面保存了结果图。结果图如下图所示:
在这里插入图片描述
5、测试模型

运行如下命令测试模型:

python test_crfnet.py --model saved_models / crf_net.h5 --config configs / crf_net.cfg --st 0.5

通过这个命令测试的是nuscenes数据集中验证集部分,测试的结果保存在save_val_img_path文件夹下,测试的效果图如下图所示:
在这里插入图片描述
在这里插入图片描述
由于没有自己的数据集,暂未用自己的数据集测试。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值