0. 简介
现在虽然以Transformer为代表的BEV深度学习占用网格已经占据了主流的方法,但是对于AVM,APA这些来说,还是需要比较好的在线自标定来完成比较好的360环视状态监测的。这里我们可以看到Awesome-Deep-Camera-Calibration已经比较好的归纳出最近几年比较新的方法。作者将会围绕着自标定来开一个专题,来看一些比较有意思的算法。环视系统(SVS)广泛应用于先进驾驶辅助系统(ADAS)中。SVS使用四个鱼眼镜头监视车辆周围的实时场景。然而,为了系统正常运行,需要准确的内参和外参估计。目前,内参校准可以通过使用棋盘格算法进行流水线处理,而外参校准仍处于不成熟阶段。因此,我们提出了一个特定的校准流程来稳健地估计外参参数。该方案以四个摄像头的驾驶序列作为输入。首先利用车道线粗略估计每个摄像头的姿态。考虑到每个摄像头的环境条件差异,我们分别从两种方法中选择策略来准确估计外参参数。为了实现前后摄像头的准确估计,我们提出了一种通过相互迭代线检测和姿态估计来实现的方法。对于双边摄像头,我们通过最小化相邻摄像头地面投影之间的纹理和边缘误差来迭代调整摄像头姿态和位置。在估计外参参数后,可以通过基于单应性变换合成环视图像。所提出的流程可以在真实驾驶环境中稳健地估计四个SVS摄像头的外参参数。
1. 主要贡献
制造商对无需人工干预的有效外部校准有需求。近年来,针对各种真实场景的自校准方案已有一些研究[6-9]。然而,具有环绕视角的交通场景数据集仍然不足。为填补这一研究空白,我们收集了一个新的数据集,其中包括带车道线的交通场景,并提出了一个自校准流程。总的来说,我们的贡献主要有三个方面:
(1)提出了一种外部校准方案,利用车道线和地面纹理。首先,我们的方法检测并过滤车辆附近的车道线。基于几何约束条件,通过利用车道线方向粗略估计摄像机的姿态。其次,我们将相邻相机的地面纹理进行对齐,以实现准确的外部校准。
(2)我们的方法通过车道线投影约束和车道线重新检测的相互迭代来校正姿态。粗糙的车道检测结果会导致姿态估计不准确。通过将帧投影到粗糙地面平面,再重新定位车道标线,可以更精确地迁移。因此,姿态可以随着更新的车道标线进行迭代。我们的方法很强大,并可以保持对长距离车道标线的亚像素精度检测。
(3)我们提出了一个带有地面真值(GT)的环绕视图视频数据集。该数据集是从不同环境条件下具有车道线的各种交通场景中收集而来。它包含了40组由鱼眼摄像头拍摄的视频。所有视频帧都经过手动标注,标注了高质量的车道点和摄像机外参参数。所提出的方法需要满足以下先决条件:
(1)摄像机的内参参数和位置已知。
(2)道路表面是平坦的和笔直的;此外,行驶方向始终与车道线平行。车辆的前方向与车道线之间的夹角被设定为-2度至2度之间。在我们的校准流程中,车辆的前方向与车道线之间的滚动和偏航角被设定为-10度至10度之间。俯仰角的范围为20度至90度。对于每台摄像头,需要内参参数(包括畸变系数),并且x坐标的误差应在-0.2至+0.2毫米之间。z坐标(摄像头高度)的误差应在-0.2至+0.2毫米之间。
SVS系统通常由四个或六个鱼眼摄像头组成。我们的研究针对四摄系统。所提出的方法完全自动化。在各种环境条件下的交通场景中,它可以保持稳定的估计。
2. 车道检测与选择
图2显示了所提出方法的流程图。首先,该方法从四个摄像头捕获的图像中检测车道标线。在定位车道标线之后,该方法校准了前置和后置摄像头的外参参数。随后,使用估算得到的前置和后置摄像头参数处理左右摄像头。在接下来的章节中,将介绍每个步骤的详细内容。
Fig. 2 展示了提出方法的流程图。a-e 分别展示了由每个步骤的外参参数生成的全景视图。
我们利用Kannala-Brandt失真模型对鱼眼图像进行去畸变,并利用Canny边缘检测来检测车道线。所提出的方法在去畸变的图像上采用Hough直线检测来检测车道标线。由于检测结果可能包括错误检测的车道标线,因此采取一系列措施来过滤所需的车道标线。首先,我们使用消失点(VP)来排除外侧的线条。消失点可以通过[31]计算得到。距离消失点垂直距离小于指定阈值的车道标线将被保留。总体目标是排除远离消失点的线条。考虑到左右摄像头无法捕获车辆下方的车道标线,因此设置了一个感兴趣区域(RoI)来排除这样的标线。由于前置和后置摄像头只需要一对车道标线,因此选择距离摄像头最近的一对车道标线进行估计。至于左右摄像头,只需要一个车道标线。
3. 前置和后置摄像头校准
所提出的方法利用投影平面上的车道线的几何约束来迭代估计摄像头的姿态。我们提出了一个迭代估计摄像头姿态的算法。该算法包括三个子步骤,每个子步骤分别估计俯仰、偏航和翻滚角度。假设
P
′
P'
P′是去畸变图像中的点,其在环视图像中的对应点为
P
,
P,
P,,通过单应性
H
H
H可以对
P
P
P进行变换如下,
P
′
=
H
−
T
P
=
(
K
2
R
K
1
−
1
)
−
T
P
,
(1)
P'= H^{−T}P =(K_2RK^{−1}_1)^{−T}P, \tag{1}
P′=H−TP=(K2RK1−1)−TP,(1)
其中,
K
1
K_1
K1是一个3x3矩阵,代表真实相机的内参参数,而
K
2
K_2
K2是一个3x3矩阵,代表环视平面上虚拟相机的内参参数。
R
R
R是旋转矩阵,
I
′
I'
I′是环视平面上的点。
我们设计了三种成本函数来分别估计俯仰、横滚和偏航角度。图3展示了它们的功能。我们的算法首先通过迭代更新旋转矩阵来最小化成本
c
φ
c_{\varphi}
cφ,
R
1
′
=
R
φ
R
=
[
1
0
0
0
cos
φ
sin
φ
0
−
sin
φ
cos
φ
]
R
,
(2)
R_1' = R_{\varphi} R = \begin{bmatrix} 1 & 0 & 0 \\ 0 & \cos \varphi & \sin \varphi \\ 0 & -\sin \varphi & \cos \varphi \end{bmatrix} R, \tag{2}
R1′=RφR=
1000cosφ−sinφ0sinφcosφ
R,(2)
其中
φ
\varphi
φ 是俯仰角。
俯仰角是通过最大化成本函数
c
φ
c_{\varphi}
cφ 来估计的,过程如下,
c φ = ∥ a 1 b 1 ‾ + a 2 b 2 ‾ + a 3 b 3 ‾ + a 4 b 4 ‾ ∥ , where a i b i ‾ = a i b i → ∥ a i b i → ∥ ( i = 1 , 2 , 3 , 4 ) . (3) c_{\varphi} = \left\| \overline{a_1 b_1} + \overline{a_2 b_2} + \overline{a_3 b_3} + \overline{a_4 b_4} \right\|, \\ \text{where } \overline{a_i b_i} = \frac{\overrightarrow{a_i b_i}}{\left\| \overrightarrow{a_i b_i} \right\|} \quad (i = 1, 2, 3, 4). \tag{3} cφ= a1b1+a2b2+a3b3+a4b4 ,where aibi= aibi aibi(i=1,2,3,4).(3)
图3. 前后摄像头姿态估计算法。a. 靠近俯仰角度的子步骤。b. 靠近偏航角度的子步骤。c. 靠近滚转角度的子步骤。
如图3所示,点 a i a_i ai和 b i ( i = 1 , 2 , 3 , 4 ) b_i(i=1,2,3,4) bi(i=1,2,3,4)对应于环视图像中提取标记的端点。 a 1 a_1 a1、 a 2 a_2 a2、 a 3 a_3 a3和 a 4 a_4 a4是与直线 y = 0 y=0 y=0相交的点。 a i b i ˉ ( i = 1 , 2 , 3 , 4 ) \bar{a_ib_i}(i=1,2,3,4) aibiˉ(i=1,2,3,4)是 a i b i ⃗ \vec{a_i b_i} aibi的单位化方向向量,即车道标线的方向向量。在这个子步骤中,我们可以通过迭代使用方程(2)计算旋转矩阵来接近 c φ c_{\varphi} cφ的唯一极值。
在第二个子步骤中,迭代策略是通过更新旋转矩阵来进行,
R 2 ′ = R ω R = [ cos ω 0 − sin ω 0 1 0 sin ω 0 cos ω ] R , (4) R_2' = R_{\omega} R = \begin{bmatrix}\cos \omega & 0 & -\sin \omega \\0 & 1 & 0 \\\sin \omega & 0 & \cos \omega\end{bmatrix} R, \tag{4} R2′=RωR= cosω0sinω010−sinω0cosω R,(4)
其中 ω ω ω 是偏航角。在大多数情况下,右车道线的宽度等于左车道线的宽度。因此,通过最小化代价函数 c ω c_ω cω 来估计偏航角。
c ω = ∣ ∣ a 1 a 2 ∣ − ∣ a 3 a 4 ∣ ∣ . (5) c_ω = ||a_1a_2| − |a_3a_4|| . \tag{5} cω=∣∣a1a2∣−∣a3a4∣∣.(5)
在这里,
∣
a
1
a
2
∣
|a_1a_2|
∣a1a2∣代表线段
a
1
a
2
a_1a_2
a1a2的长度,
∣
a
3
a
4
∣
|a_3a_4|
∣a3a4∣代表线段
a
3
a
4
a_3a_4
a3a4的长度。同样地,我们可以通过使用方程(4)迭代旋转矩阵来接近
c
ω
c_ω
cω的唯一极值。
在第三个子步骤中,迭代策略可以表达为,
R 3 ′ = R R θ = R [ cos θ − sin θ 0 sin θ cos θ 0 0 0 1 ] , (6) R'_3 = R R_\theta = R \begin{bmatrix} \cos \theta & -\sin \theta & 0 \\ \sin \theta & \cos \theta & 0 \\ 0 & 0 & 1 \end{bmatrix}, \tag{6} R3′=RRθ=R cosθsinθ0−sinθcosθ0001 ,(6)
其中
θ
θ
θ为横摆角。由于车辆的方向与车道标线平行,车道标线的投影线也与投影平面的轴平行。横摆角通过最小化成本
c
θ
c_θ
cθ来估计,如下所示:
c
θ
=
∑
i
=
1
n
∣
cos
<
a
i
b
i
^
,
e
⃗
1
>
∣
,
(7)
c_{\theta} = \sum_{i=1}^{n} \left| \cos \left< \hat{a_i b_i}, \vec{e}_1 \right> \right|, \tag{7}
cθ=i=1∑n
cos⟨aibi^,e1⟩
,(7)
当向量
e
1
e_1
e1 在环视视图平面中等于 [1, 0],且
n
n
n 等于 4 时,我们可以透过方程式 (6) 反复迭代旋转矩阵,以取得
c
θ
c_θ
cθ 的唯一极值。总的来说,每个“代价函数”的动机并不明确。最终,我们明白第一个函数让所有线条“指向同一个方向”,第二个函数进行线宽的标准化,而第三个函数让线条“在图像中朝上”。算法总体框架详见算法1。在子步骤中,会透过代价函数的梯度方向来更新 phi、omega 和 theta。虽然会忽略线条检测时的误差,但在
c
φ
c_{\varphi}
cφ 中对于
φ
{\varphi}
φ 的一阶导数是单调的,
c
ω
c_ω
cω 中对于
ω
ω
ω 的一阶导数,以及
c
θ
c_θ
cθ 中对于
θ
θ
θ 的一阶导数也同样是单调的。每个子步骤都会反复迭代逼近代价函数的极值,以逐渐估算出摄像头姿态。基于这些代价函数,可以粗略地估算出摄像头的姿态。只不过,在现实的复杂交通场景中,线条检测需要在随后的步骤中进一步的精进。
这是我们根据上面的伪代码写出的代码: