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文件夹下,测试的效果图如下图所示:
由于没有自己的数据集,暂未用自己的数据集测试。