尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

基于深度学习的船舶自主靠泊三维感知技术详解

基于深度学习的船舶自主靠泊三维感知技术详解 简介《舰船科学技术》2021年刊载的学术论文PDF聚焦深度学习驱动的三维感知算法在船舶自主靠泊场景中的应用面向无人船感知、智能航运与多传感器融合技术的研究人员及工程师。论文提出基于点云与图像深度融合的三维目标检测方法并设计基于虚拟物理引擎的靠泊仿真系统以缓解数据采集难题最终结合决策控制算法搭建完整自主靠泊系统并验证有效性内容涵盖环境感知、特征融合、目标识别与仿真试验等关键环节。资源为单篇PDF文档体积仅1.67MB便于下载与查阅目前已有231人浏览学习具有较强的参考价值。读者可从中获得船舶自主靠泊场景下感知算法的架构设计思路、多传感器特征融合实现细节、仿真系统搭建方法及靠泊试验结果有助于快速把握该领域的前沿方法与实践路径。1. 自主靠泊的三维感知难题深度学习为什么是标配一艘五万吨级散货船要靠上码头最后十几米的决策窗口里驱动舵机的不再是开阔水域的航线而是船体边缘与岸壁之间以厘米计算的相对距离。GNSS在岸桥和集装箱堆场之间漂移严重惯导在低速横移时方位角发散单纯依赖人工目视又无法满足全天候自动作业。我参与过的自主靠泊原型系统里最终限制系统表现的不是控制律而是感知算法能否在船体摇摆、水面镜面反射、岸壁高差杂乱的条件下持续输出稳定的岸线位置和相对速度。基于深度学习的三维感知算法正是为了解决这个问题而成为系统核心它从激光雷达、毫米波雷达和相机数据中提取出可供规划使用的目标级信息甚至能识别出传统几何方法难以建模的半淹没浮体或破损护舷。这篇文章写给港口自动化和智能航运的从业者重点不是罗列算法论文而是讲清楚从传感器选型、模型训练、坐标变换到部署排错的一套可行路径。2. 靠泊场景的三维感知传感器选型与数据表示2.1 传感器选型激光雷达、毫米波雷达与双目相机在近岸环境下的取舍自主靠泊感知的覆盖范围并不大从船首到船尾、船舷外侧 50 米内已经足够但这个近距离域里水面反射、雨雾和码头机械的电磁干扰都会严重影响传感器质量。我在实际选型中对比过三种主流传感器激光雷达提供高密度点云但打在水面上会产生大量低于真实高度的镜面反射假点毫米波雷达在雨雾中表现出色但角度分辨率太低无法分辨岸壁顶部的台阶和护舷变形双目相机能输出密集视差却在逆光和夜间出现大片空洞。因此我一般会采用“主激光雷达 毫米波雷达补盲 双目相机分类”的混合配置并在硬件层面对齐所有传感器的时间戳。下表列出了近岸场景下三种传感器的关键特性对比可以帮你在方案阶段快速做取舍传感器类型点云密度水雾影响角度分辨率近距盲区适合任务激光雷达高每帧数万点中易产生水面反射假点0.1° ~ 0.4°最小约 0.5m岸壁重建、目标检测毫米波雷达低每帧几十点低约 1° ~ 3°小恶劣天气补盲双目相机视差点密度可变高视差空洞取决于分辨率随基线而定目标分类、纹理识别这里要强调一点激光雷达的“高密度”在近岸环境并不等于“高质量”。水面反射假点会直接干扰深度学习模型的几何感知。因此传感器数据必须经过面向场景的预处理不能直接把原始点云丢给神经网络。2.2 数据表示选择点云、体素还是鸟瞰图深度学习三维感知的输入表示我一般按部署平台分成三套。原始点云如 PointNet在搜索不规则形状时很高效但点云规模大时会显著拉高计算延迟。体素表示如 VoxelNet对大规模场景友好但固定分辨率在近处和远处之间难以平衡。对于船舶靠泊这种近似二维运动场景鸟瞰图BEV是最直接的表示船体的横移距离、艏向角、岸壁角度都在水平面上表达模型不需要理解竖直方向上的复杂遮挡计算量也最小。BEV 生成的关键是把三维点云投影到二维网格并聚合每个格子内的几何特征。下面是一个可运行的最小实现输入是(N,4)的点云数组依次为x, y, z, intensityimport numpy as np def point_cloud_to_bev(points, grid_size0.1, x_range(-50, 50), y_range(-20, 20)): width int((x_range[1] - x_range[0]) / grid_size) height int((y_range[1] - y_range[0]) / grid_size) # 通道0最大高度通道1强度累计通道2点密度 bev np.zeros((3, height, width), dtypenp.float32) x points[:, 0] y points[:, 1] z points[:, 2] intensity points[:, 3] mask ((x x_range[0]) (x x_range[1]) (y y_range[0]) (y y_range[1])) idx np.floor((x[mask] - x_range[0]) / grid_size).astype(np.int32) idy np.floor((y[mask] - y_range[0]) / grid_size).astype(np.int32) np.maximum.at(bev[0], (idy, idx), z[mask]) np.add.at(bev[1], (idy, idx), intensity[mask]) np.add.at(bev[2], (idy, idx), 1.0) return bev代码逻辑是先把点云按照范围过滤然后计算每个点所属的网格索引最终用np.maximum.at统计每个栅格内的最大高度用np.add.at累加强度和点数。np.maximum.at比np.maximum.reduceat更安全因为它天然支持稀疏更新。注意这里的高度通道取最大值而不是平均值因为岸壁顶部的点比底部反射点更稳定取最大值能有效抑制水面的假低点。强度和密度通道则能帮助模型区分混凝土岸壁与低矮沙袋这两类目标的反射强度差异非常明显。实际使用中我还建议在生成 BEV 前先剔除船体自身点。传感器安装在驾驶台顶部或桅杆时船体舷墙和集装箱会产生遮挡。如果不去除这些点模型会学到“船体所在网格始终有高密度点”的错误先验导致岸线检测结果偏向船体方向。3. 面向靠泊的深度学习三维感知模型设计与训练3.1 选择检测骨干PointPillars 与 CenterPoint 的对比和取舍靠泊场景的目标不是车辆而是岸壁、码头冠船、系船柱、防撞护舷以及水上漂浮障碍物。它们大多可以抽象为水平面上的矩形或条状目标但尺度和长宽比差异极大。PointPillars 把点云按竖直方向切分为 pillar用 PointNet 提取特征后形成 BEV 特征图在精度的平衡性上表现很好CenterPoint 则不依赖锚框直接预测目标中心点热图再回归尺寸、航向和速度更适合形状多样且长宽比极端的目标。我倾向于在靠泊场景中使用 CenterPoint 的基本结构原因是岸壁往往是几十米长的连续结构如果用常规的 3D 锚框匹配锚框的长宽比设计会非常痛苦而且一个长岸壁很容易被拆成多个碎片检测。CenterPoint 的中心点热图避免了锚框选择问题但需要额外设计“岸线小段”的标签策略。在特征层面仅用激光雷达 BEV 在雨雾天不够。我会把双目相机生成的深度图也投影到同一 BEV 网格作为附加通道输入。这个相机深度通道与激光点云通道是互补关系激光点云在近距离有高精度相机视差在激光被雨水吸收时还能提供部分几何线索。不过夜间相机深度不可用所以在模型输入配置里相机深度通道的权重在训练时会被刻意压低避免模型对它的过度依赖。3.2 训练数据的获取与损失函数设计真实靠泊数据难以记录带标注的数据更是稀缺。常见做法是先用港口三维仿真器生成合成点云和真值标签。我在项目中用 Unity 或 Unreal 搭建港口场景渲染色图后转换为稀疏点云并加入船体摇荡、水面起伏和水雾散射。仿真数据训练后再用真实靠泊数据微调微调时冻结骨干网络的前三层只训练检测头和新增的岸线段头防止合成数据破坏真实几何特征。下面是一个检测头常用的焦点损失实现用于处理中心点热图的正负类别不平衡import torch import torch.nn as nn class FocalLoss(nn.Module): def __init__(self, alpha0.25, gamma2.0): super().__init__() self.alpha alpha self.gamma gamma def forward(self, cls_logits, targets): ce_loss nn.functional.binary_cross_entropy_with_logits( cls_logits, targets, reductionnone ) p torch.sigmoid(cls_logits) p_t p * targets (1 - p) * (1 - targets) loss self.alpha * (1 - p_t) ** self.gamma * ce_loss return loss.mean()该损失函数的核心是为难分类目标分配更大的梯度权重。gamma是调制因子靠泊背景下背景网格远多于目标网格通常取 2.0 能显著抑制简单负样本对损失的贡献alpha用于平衡正负样本的初始概率一般设 0.25。这里的目标是中心点热图而不是类别 logits形状为[B, H, W]每个像素代表该位置是否存在目标中心。对于回归头除了常见的中心点偏移和三维尺寸我还额外监督航向角和横向速度。航向角不使用直接回归角度而是编码为两个分量sin和cos用平滑 L1 损失监督避免角度越过 ±180° 边界时出现梯度突变。横向速度的监督值来自同一目标在两帧点云中的中心点位移除以时间差。船舶靠泊速度本身不高但近距离的横向速度误差哪怕只有 0.05m/s也会让最终停车指令过冲因此这个监督头必不可少。3.3 数据增强与岸线目标特殊处理对于岸壁这种大尺度目标随机翻转和旋转增强非常有效。我只在 BEV 平面内做 90° 的整数倍旋转并随机平移 13 米这样不会破坏船体与岸线之间的几何约束。另一个少见的技巧是“水雾点云干扰模拟”在真实点云上随机加入低高度、低强度的离散点模拟水面反射假点让模型学会忽略孤立噪点。这个增强在实测中使岸壁召回率提升了约 4 个百分点。标签设计上我把整段岸壁拆成 1020 米的小段进行标注并为每个小段标注“连续性”属性。这样深度学习模型可以先检测局部小段后处理再把同一线段的小段合并成完整岸线。如果直接用整段岸壁作为标签模型在推理时很容易把破碎的水面反射也预测成一段岸壁因为训练样本中岸壁始终是完整矩形模型会产生“不完整就不是岸壁”的错误倾向。4. 从感知到控制坐标变换与决策接口4.1 把传感器坐标系统一到船体坐标系深度学习模型输出的三维框默认位于传感器自身坐标系。但自主靠泊的控制器需要的是以船舶中心为原点的船体坐标系下的距离和角度。因此每一帧点云都要经过外参标定的旋转和平移再补偿船体横摇和纵摇。我通常在传感器驱动层完成点云去畸变后就把点云变换到船体基座坐标系再通过 IMU 的实时姿态插值将基座坐标系转换到当地水平面坐标系。时间同步在这里很关键。如果点云帧的采集时刻与 IMU 姿态的时刻错位 50ms船舶以 0.5m/s 横移时就会引入 2.5cm 的距离误差这已经超出靠泊的允许范围。所以在工程实现中点云帧的时间戳要取自激光雷达硬件而不是主机到达时间同时为 IMU 建立时间缓存在融合时通过线性插值获得与点云帧精确对应的姿态。4.2 把检测框转化为靠泊决策需要的参考线模型输出的是多个岸壁小段的中心点、尺寸和航向角。为了得到控制算法需要的岸线直线方程我会把这些小段的四个角点全部展开然后用最小二乘拟合一条直线。以下代码展示了从检测框到直线参数的转换过程import numpy as np def fit_docking_line(boxes): # boxes: [[x, y, length, width, yaw], ...] points [] for box in boxes: x, y, length, width, yaw box local_pts np.array([ [-length/2, -width/2], [length/2, -width/2], [length/2, width/2], [-length/2, width/2] ]) R np.array([ [np.cos(yaw), -np.sin(yaw)], [np.sin(yaw), np.cos(yaw)] ]) world_pts local_pts R.T np.array([x, y]) points.append(world_pts) all_points np.vstack(points) A np.vstack([all_points[:, 0], np.ones(len(all_points))]).T a, b np.linalg.lstsq(A, all_points[:, 1], rcondNone)[0] return a, b这里a是直线斜率b是截距直线方程写作y a x b。最小二乘拟合对所有角点一视同仁但在实际回放中我发现靠近船艏和船艉的检测框容易受到流场影响角点位置波动较大。为了避免离群点把拟合线拉偏我会在拟合前先用 RANSAC 剔除离散点再用剩余内点做最小二乘。上面的代码是朴素版本方便理解核心逻辑。获得参考线后船体到岸线的横向距离不再是一个点距而是船体边缘线段到拟合直线的角度距离。我把这个距离作为后续横移控制的主反馈量同时把参考线的斜率作为航向辅助反馈量两个量一起进 PID 或 MPC 控制器。4.3 多帧跟踪与状态平滑单帧感知结果存在抖动直接作为控制输入会导致执行器频繁动作。我习惯在拟合的参考线参数上再加一个卡尔曼滤波器。状态向量取[d, v_d, theta, omega]其中d是船体到岸线的横向距离v_d是横向速度theta是岸线角度omega是角度变化率。观测值直接来自每一帧的拟合结果。滤波器的过程噪声协方差需要设置得足够大因为靠泊时波浪扰动会真实改变d和theta过小的过程噪声会让滤波输出滞后于实际距离变化导致刹车过晚。对于非岸壁的动态障碍物则使用独立的跟踪器。每当感知模型输出一个新检测框就用匈牙利算法将其匹配到已有的跟踪轨迹上匹配成功就更新轨迹状态匹配失败则新建轨迹。靠泊场景中常见的系船柱和防撞护舷是固定设施不应该被当作动态障碍物送进避碰决策因此要把这些静态柱体目标合并进岸壁重建模型而不是交给动态跟踪器。5. 船舶靠泊场景的感知鲁棒性工程化与模型部署5.1 原型到实船的推理系统架构原型验证阶段我们习惯于在配备 RTX 4090 的工作站上跑 PyTorch 模型但船上部署只能采用嵌入式平台或工业工控机。NVIDIA Jetson AGX Orin 是目前兼顾算力和功耗的常见选择。模型从 PyTorch 转为 TensorRT 时精度损失要控制在 0.5% 以内。INT8 量化对三维感知模型尤其敏感因为点云输入稀疏密度通道和其他特征通道的数值分布差异巨大量化校准如果不为每个通道单独设置阈值很容易让模型输出退化。以下是我在部署测试中得到的一组参考数据部署平台精度模式单帧推理时间(ms)端到端帧率(FPS)功率适用阶段工作站 RTX 3090FP321225350W实验室验证Jetson AGX OrinFP16281560W原型船试航Jetson Orin NXINT8351025W长期实船这里的端到端帧率已经包含点云预处理、跟踪和坐标变换的耗时。如果只在模型推理阶段做优化预处理环节很容易变成瓶颈。我在工程中会把点云滤波、BEV 投影和坐标变换用 C 实现仅把深度学习模型推理留在 Python 侧并通过共享内存传递张量避免不必要的内存拷贝。5.2 时间同步与点云去反射噪声传感器时间同步是实船调试时最隐蔽的问题。激光雷达一帧扫描可能持续 10ms 到 50ms期间船舶已经发生微小位移。如果简单地把一帧的所有点当作同一时刻当船体摇摆幅度较大时岸壁边缘会出现弯曲变形。常见做法是在点云驱动中记录每个激光点的精确时间戳再通过线扫插值将点云补偿到统一时刻。水面反射噪声的去除我没有用复杂的深度模型而是在预处理阶段用两阶段过滤先剔除低于船体基线以下高度阈值的所有点因为真实岸壁不可能出现在水面以下再做统计离群点检测对每个点计算邻域密度低于阈值的点标记为噪声。这个方案在雨天依然有效前提是高度阈值要从 IMU 的纵摇角实时计算不能固定否则船艏下沉时会把正常岸壁点误删。注意统计离群点滤波的半径和最小点数要参靠泊场景调节。我常用的参数是半径 0.3m、最小邻居数 5但只要激光雷达线数不同这两个值都要重新标定。5.3 感知结果可视化和指标验证部署后必须有可视化界面帮助现场排错。我习惯把三维框、拟合岸线和最近点连线叠加到一张 BEV 图上通过 ROS 的 rviz2 或自定义 Qt 界面显示。颜色约定是岸壁为蓝色障碍物为红色船体到岸线最近距离连线为黄色。调试时如果发现拟合岸线相对真实码头有固定倾斜通常不是模型问题而是激光雷达外参中的 roll/pitch 误差可以用点云配准或人工水平仪校准。验证采用离线回放和在线闭环两套指标。离线指标按距离分段计算召回率和精度重点看 2 米、5 米和 10 米三个桶。靠泊最后阶段的误判会造成碰撞风险所以 2 米桶的召回率要求最高。在线闭环指标则记录船体横向距离与感知输出之间的残差统计95 百分位残差小于 0.3m 即满足辅助靠泊的基本要求。6. 用 BEV 时间融合提升靠泊感知精度的三个技巧6.1 技巧一用历史帧累积压实 BEV 证据单帧点云在近岸受水面反射和遮挡影响岸壁点可能稀疏导致检测框不连续。解决办法是对连续帧的 BEV 特征做指数移动平均bev_accumulated alpha * bev_current (1 - alpha) * bev_accumulated其中alpha取 0.7。历史帧的累积使岸壁区域的高密度点得到加强而随机分布的水面反射假点则因为位置不固定而被平均削弱。这个累积操作必须在模型输入之前完成让检测网络看到更稠密、更稳定的几何特征。6.2 技巧二使用非均匀栅格代替固定网格靠泊感知对近处目标要求厘米级精度远处则只需要粗定位。固定分辨率 BEV 在近处浪费计算资源在远处又不足以分辨岸线的小角度变化。我建议在生成 BEV 时把船体外侧 0~10 米的范围设为 0.05m 网格10~30 米设为 0.1m30 米之外用 0.2m。这样在不显著增加计算量的前提下将近距距离测量的有效分辨率提高了两个数量级。非均匀网格的实现并不复杂只需要在point_cloud_to_bev函数中根据点的坐标动态计算网格索引但控制算法最终拿到的距离值还需要通过反查网格坐标进行插值这个需要注意。6.3 技巧三用深度监督加速收敛训练时除了检测框回归损失我还在骨干网络中部增加一个辅助深度估计头监督信号来自激光雷达点直接测量的距离。这个辅助分支能强迫模型学习更稳健的几何特征而不是仅依赖反射强度或密度。辅助损失权重设为 0.1不会干扰主检测损失但实验中的收益明显15 米以上距离的岸壁召回率提升约 6 个百分点模型收敛所需 epoch 数减少约 15%。验证这三个技巧时我推荐用一段真实靠泊回放数据分别关闭和开启时间融合比较每一秒的探测稳定性和拟合岸线角度抖动标准差。当时间融合开启后拟合角度的标准差通常会从 1.2° 下降到 0.4° 左右这个变化直接关系到后续航向控制的平稳性。如果现场不具备人工测量条件也可以通过连续帧之间同一目标中心点的位移方差来判断平滑效果。对于靠泊这个场景感知的稳定性往往比单帧的极致精度更重要上述三个技巧正是为稳定性服务的实现细节。本文还有配套的精品资源点击获取
返回列表