社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

基于深度学习的多传感器标定

小白学视觉 • 4 年前 • 398 次点击  

点击上方小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

本文转自:计算机视觉life

标定是确定不同坐标系的相互转换关系,是传感器数据融合的前提,特别是激光雷达和图像数据。这里以深度学习的方法训练CNN模型去回归坐标系转换的参数。

主要是两个CNN模型:RegNet和CalibNet。

RegNet应该是第一个深度卷积神经网络(CNN)推断多传感器的6自由度(DOF)外参数标定,即激光雷达(LiDAR)和单目摄像头。RegNet将标定的三个步骤(特征提取、特征匹配和全局回归)映射到单个实时CNN模型中。在训练期间,随机对系统进行重新调整,以便训练RegNet推断出激光雷达投影到摄像头的深度测量与RGB图像之间的对应关系,并最终回归标定外参数。此外,通过迭代执行多个CNN,在不同程度失标定(decalibration)数据上进行训练。如图是一个例子。

失标定
标定基础事实(GT)
RegNet标定结果


首先,传感器坐标系中给出的点x变换为世界坐标系中的点y,定义为一个仿射变换矩阵H,即y = Hx。估计变换矩阵H的任务称为外标定。应用深度学习,需要重新定义外标定的问题,在给定初始标定Hinit和基础事实标定Hgt的情况下,确定失标定矩阵φdecalib,其定义如下

然后可以随机改变Hinit以获得大量的训练数据。为了能够建立标定过程可观测的对应关系,用Hinit和摄像头内参数矩阵P将激光雷达点投影在摄像头图像平面上,即

在每个像素(u,v),如果没有投射的激光雷达点,则存储投影点的逆深度值(摄像头坐标)zc或者为零。由于相比图像像素的数量大多数常见的激光雷达传感器仅提供少量测量数据,因此深度图像非常稀疏。为了对付这种稀疏性,在输入深度图使用最大值池化(Max Pooling)对投影的激光雷达深度点上采样。

下面图展示的是Regnet的结构框图,其实现深度和RGB图像之间的标定。使用初始标定Hinit将深度点投影在RGB图像上。在CNN网络的第一和第二部分,使用NiN(Network in Network)块来提取丰富的特征以进行匹配,其中索引显示NiN块的第一卷积层的核大小k。特征通道的数量显示在每个模块的右上角。CNN网络最后一部分通过使用两个全连接层收集全局信息来对失标定进行回归。(注:NiN块由一个k×k卷积,然后是几个1×1卷积组成。)在训练期间,失标定矩阵会被随机排列,形成深度点的不同投影数据。

如下图所示,深度点的投影随给定的初始标定值而强烈地变化。当初始校准从标定的基础事实(GT)旋转偏离20°平移偏离1.5米的时候,可能导致激光雷达点云的投影的大多数点在图像区域之外,难以与RGB图像建立对应关系。

即使在这些情况下,训练的CNN网络仍然能够改进标定。使用新的估计标定参数可以再次投影深度点,从而产生更多供相关计算的深度点。然后,该步骤多次迭代即可。

初始化
结果

CalibNet是一个自监督的深度网络,能够实时自动估计激光雷达和2D摄像头之间的6-自由度刚体转换关系。在训练时,不进行直接监督(例如不直接回归标定参数);相反,可以训练网络去预测标定参数,以最大化输入图像和点云的几何和光度一致性。

下图是CalibNet的流程图:(a)来自标定摄像头的RGB图像;(b)原始激光雷达点云作为输入,并输出最佳对齐两个输入的6-自由度刚体变换T;(c)显示错误标定设置的彩色点云输出;(d)显示使用CalibNet网络标定后的输出。

该网络将RGB图像、相应的误标定(mis-calibration)的激光雷达点云和相机标定矩阵K作为输入。作为预处理步骤,首先将点云转换为稀疏深度图,将激光雷达点云投影到图像平面即可。由于初始误标定的不准确,将误标定点投影到图像平面会导致稀疏深度图与图像(严重)不一致,如上图(c)所示。将RGB输入图像和稀疏深度图标准化为±1的范围,然后用5 x 5最大池化窗将稀疏深度图最大池化为半致密深度图。

虽然网络的输出可直接预测平移,但需要将so(3) 中的输出旋转矢量转换为其对应的旋转矩阵。一个元素ω ∈ so(3) 可以通过使用指数图(exponential map)转换为SO(3)。

一旦将网络预测的标定参数转换为T∈SE(3)中的刚体变换,就会使用3-D空间变换器层(Spatial Transformer Layer),通过预测变换T对输入深度图进行变换。这里扩展了原始的3D空间变换器层以处理稀疏或半致密的输入深度图,如上图(d)。

下图是CalibNet的网络结构图。网络主要由”RGB”和”深度”2个不对称分支组成,每个分支执行一系列,因此”深度”流的滤波器在每个阶段都会减少。然后两个分支的输出沿着信道这个维度连接并通过一系列附加全卷积和批规则化(Batch Norm)层,用于全局特征聚合。将旋转和平移的输出流分离,以捕获旋转和平移之间可能存在的模态差异。网络的输出是1×6矢量ξ=(v, ω)∈ se(3), 其中v是平移速度矢量,ω是旋转速度矢量。

下面是损失函数的定义:

1. 光度损失:在通过预测的T变换深度图之后,检查预测的深度图和正确的深度图之间的密集像素误差,误差定义为,

2. 点云距离损失:3D空间变换器层允许在反投影(back projection)后的点云转换。在这个阶段,尝试度量尺度最小化未校准的变换点和目标点云之间的3D-3D点距离。距离测量有

a) Chamfer 距离

b) 推土机距离(Earth Mover’s Distance):

c) 质心ICP距离

最后,整个损失函数定义为:

下图是CalibNet标定的一些结果。第一行显示输入的RGB图像,第二行显示投影到图像上的相应的误标定的激光雷达点云。第三行显示使用网络预测变换投影的激光雷达点云,最后一行显示相应的基础事实结果。第二行中的红色框表示未对齐,而在第三行中,红色框表示标定后的正确对齐。


下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲
小白学视觉公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲
小白学视觉公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群


欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/113796
 
398 次点击