博客算法工具链征程6上的Parking场景感知:环视拼接+BEV分割+车位检测

征程6上的Parking场景感知:环视拼接+BEV分割+车位检测

默认265282026-08-30
76
0

自动泊车是智能驾驶的重要场景,感知需求和高频高速场景不一样:速度低、环境复杂(柱子、路沿、其他车辆)、需要厘米级精度。我在一个自动泊车项目里把环视拼接、BEV分割、车位检测三个模块部署到征程6M上,踩了不少坑。这篇把完整经验记下来。

一、Parking感知Pipeline

自动泊车的感知pipeline分三个阶段:

1. 环视图像拼接:4路鱼眼摄像头→去畸变→透视变换→拼接成鸟瞰图

2. BEV分割:对拼接后的鸟瞰图做语义分割(可行驶区域、车位线、障碍物、路沿)

3. 车位检测:从分割结果中提取车位角点,拟合车位多边形

二、环视拼接:去畸变+透视变换

鱼眼摄像头的图像需要先进行去畸变和透视变换才能拼接成鸟瞰图。

去畸变公式(鱼眼模型):

```python

# 鱼眼去畸变

r_d = sqrt(x_d^2 + y_d^2) # 畸变图像上的半径

theta = atan(r_d / f) # 入射角

r_u = f * theta # 理想图像上的半径

x_u = x_d * r_u / r_d

y_u = y_d * r_u / r_d

```

征程6部署时,去畸变和透视变换可以用VPU(视频处理单元)加速,比CPU快5-10倍。但VPU的warping精度有限(通常是8bit定点),对厘米级精度的泊车场景可能不够。

解决方案:

1. 离线预计算映射表:把去畸变+透视变换的坐标映射表离线算好,板端只做查表(LUT)

2. 双线性插值:VPU支持双线性插值,精度比最近邻高

3. 子像素精度:如果VPU精度不够,可以在CPU上对关键区域(车位角点附近)做子像素级精修

三、BEV分割模型部署

BEV分割的输入是拼接后的鸟瞰图(通常512×512或1024×1024),输出是每个像素的语义类别。

模型选择:

模型 参数量 延迟(J6M) mIoU 适用

DeepLabV3+ 30M ~15ms 72% 通用场景

BiSeNetV2 15M ~8ms 68% 实时场景

STDC 8M ~5ms 65% 极致速度

泊车场景对速度要求不高(车速

部署注意事项:

1. 输入分辨率:环视拼接后的鸟瞰图分辨率要固定。如果拼接算法输出分辨率不固定(不同车位角度导致拼接尺寸变化),hb_mapper不支持。解决:统一resize到512×512。

2. 类别不平衡:可行驶区域像素占80%,车位线只占2%,训练时要用加权损失函数。

3. 量化策略:车位线检测对精度敏感,分割头的最后一层建议用int16。

四、车位检测:从分割到多边形

车位检测不是简单的二分类,需要输出车位的4个角点坐标,拟合成多边形。

方案对比:

方案 精度 速度 复杂度

分割+角点回归 高 中 中

分割+轮廓提取 中 快 低

关键点检测 高 慢 高

推荐方案:分割+角点回归

BEV分割输出车位线mask,然后在车位线mask上用轻量级角点检测头(如CornerNet的简化版)检测4个角点。

```python

# 角点检测头(轻量版)

class CornerHead(nn.Module):

def __init__(self, in_channels=256):

super().__init__()

self.conv = nn.Sequential(

nn.Conv2d(in_channels, 128, 3, padding=1),

nn.ReLU(),

nn.Conv2d(128, 64, 3, padding=1),

nn.ReLU(),

nn.Conv2d(64, 8, 1) # 8=4个角点×2个坐标

)

def forward(self, x):

return self.conv(x)

```

角点检测头很小(参数

五、踩坑记录

· 坑1:环视拼接的鸟瞰图在不同光照下颜色不一致(有的摄像头过曝、有的欠曝),导致BEV分割把过曝区域误判为"可行驶区域"。解决:在拼接前对每个摄像头的图像做独立ISP调参,或做颜色一致性校正(gray world算法)。

· 坑2:车位线在雨天、夜晚非常模糊,分割模型检测不到。解决:训练数据集增加雨天/夜间样本,或做图像增强(对比度增强、去雾)。

· 坑3:车位检测的角点定位精度不够(误差>10cm),导致泊车路径规划失败。解决:角点检测头用高分辨率特征(stride=4而不是stride=8),或在CPU上做亚像素级精修。

· 坑4:两个相邻车位的角点互相干扰(一个车位的角点被误检成另一个车位的)。解决:角点检测时增加"车位中心点"辅助任务,用中心点约束角点的配对关系。

六、顺便提一嘴

· 自动泊车对BEV分割的精度要求比高速场景高很多,因为泊车时车辆离障碍物只有几十厘米,分割误差直接影响安全。建议分割模型的mIoU至少达到70%。

· 征程6M跑环视拼接+BEV分割+车位检测的总延迟约30-50ms,帧率20-30fps,满足泊车场景需求。如果要更高帧率,可以上6H/6P。

· 泊车场景的标注数据很难获取(需要精确的车位角点标注),建议用半监督学习:先用少量精确标注训练,再用大量无标注数据做自训练。

数据来源:本文Parking场景感知方案基于实际项目经验;BPU对齐及量化策略参考地平线开发者社区官方博客《【地平线J6工具链进阶教程】算子优化方案集锦-v1.1》。

算法工具链
社区征文征程6
评论0
0/600