港口码头的船型识别一直是个麻烦事。靠泊的船要登记船名、船型、吨位,以前全靠调度员拿望远镜去看,再对着系统手工录入,赶上夜间或者雾天,看错船型是常事。我们团队这次做的“乐迪信息”项目,就是想用AI摄像机把港口船舶AI类型检测这件事做成真正能落地的产品——摄像机直接嵌进边缘设备,对着航道和泊位实时出船型结果,不用把视频全部传回机房,也不用靠人眼盯屏。
这套东西做下来,我自己最大的感受是:船型识别看着是个简单的“看图分类”问题,但真正到了港口现场,天气、光照、船速、遮挡、甚至船身锈迹都会教做人。这篇文章把我们从方案选型、硬件部署、模型训练到现场调优的完整过程拆开来讲,希望能给做智慧港口、视频AI落地的朋友一些能直接抄作业的参考。
1. 项目背景与整体设计思路
1.1 为什么港口需要AI船型识别
港口业务里,船型信息是很多系统的基础数据。引航调度要知道来的是集装箱船还是散货船,因为这直接关系到靠泊哪个泊位、用什么样的装卸设备;海事监管要统计船舶类型和吨位分布;船代货代要确认到港船只是否和申报信息一致。过去这些信息主要靠三个途径获取,但都有明显的短板。
第一个途径是AIS(船舶自动识别系统)报文。AIS会广播船舶静态信息,理论上包含船型分类,但问题是AIS数据由船方自己录入,很多船报的类别比较含糊,比如用“其他货船”混过去,甚至直接漏报。第二个途径是人工目视判断。港口调度员长期盯船,经验丰富,但人的精力有限,同时看几个泊位就会疲劳,夜间识别可靠率直线下降,而且人工判断结果难以标准化,换个人可能就有不同结论。第三个途径是VTS(船舶交通服务)系统的雷达和光电联动,但雷达只能看到“一个目标”,无法判断船体结构,光电设备也大多停留在“看得清”层面,没到“认得出”的程度。
AI视觉恰好能把这条路补上。摄像机拍摄船体外观,船上集装箱排列、吊机结构、舱口盖形式、液货管汇这些细节都是视觉特征,深度学习模型在这些特征上的判别能力已经远超传统图像处理手段。项目目标很朴素:在岸边部署AI摄像机,拍摄过往和靠泊船舶,识别出船型并输出置信度,和AIS信息比对后推送给业务系统。整套识别过程要在边缘完成,避免把所有视频流转回中心服务器。
1.2 方案选型:边缘AI摄像机为什么优于中心化识别
项目立项时,团队内部讨论过两种路线:一种是把所有岸基摄像机视频流汇聚到机房GPU服务器统一识别,另一种是在摄像机旁边部署边缘计算设备,实现“采集+识别”一体化。两种方案各有道理,但结合港口实际场景,边缘方案优势更明显。
中心化方案的问题首先在带宽。一台1080P摄像机按4Mbps码率计算,10台摄像机就是40Mbps持续流量,港口岸线动辄几公里,几十路视频全传回机房,网络改造成本不低。其次是延迟。船舶在航道里航速虽然不快,但靠泊窗口期很短,如果视频传回机房再返回结果,一个来回几百毫秒到几秒的延迟,在实时调度场景里是不能接受的。还有可靠性问题:港口网络偶尔会被大型机械遮挡或干扰,断网时中心识别直接瘫痪,但边缘设备即便断网也能独立工作,恢复联网后再补传结果。
所以最终方案确定为“AI摄像机”模式,也就是在摄像机侧集成推理模块。具体做了两个版本的硬件形态:第一版是普通网络摄像机外接一个边缘AI盒子,适配原有存量摄像头点位;第二版是一体化的AI摄像机,镜头、传感器、推理芯片封装在同一设备里,适合新建点位。软件逻辑完全一致,这样存量改造和新建项目可以共用一套算法和平台,维护起来省心很多。
2. 硬件部署与现场安装的那些细节
2.1 摄像机点位选择:看船不是只看一个面
船型识别和车牌识别有个本质区别:车牌是平面目标,正面拍一张就行;船是十几米到三百多米长的大型物体,从船头到船尾的侧面轮廓才是判断船型的关键。集装箱船看的是甲板上整整齐齐的集装箱层数和船艉的桁架结构,散货船看的是甲板上连续的舱口盖和起重机抓斗,油轮看的是中部的管汇区域和上层建筑的布置。这意味着摄像机必须拍到船身侧面,而不是只拍船头。
点位选择上,我们总结了一套自己的原则。沿海岸线每200到300米部署一个点,摄像机朝向水域,略带俯角。这个间距可以保证无论船舶靠泊还是航经,至少有一个点能拍到完整侧影,相邻点位画面还有重叠区域,既方便连续跟踪,也能在某个点位被遮挡时启用备用视角。
高度方面,岸边的灯塔、灯杆、仓库顶都是可用的挂载位置。我们实测下来,离水面8米到15米是最舒服的高度区间:太高了俯角太大,船舷会被上层建筑挡住;太低了视场角受限,只能看到近处的船。如果点位在码头前沿塔吊上,可以架到20米以上,这时候更适合拍远景船舶,但要注意塔吊臂旋转时视角会变化,需要做画面防抖或者锁定安装方位。
2.2 镜头焦距选择的数学逻辑
焦距选择直接决定识别距离,没有经验的人容易犯两个错:一个是用广角镜头导致远距离船舶在画面里只占几十个像素,模型根本认不出;另一个是过度追求长焦,视野范围太窄,船一偏航就出画面。
我们用的计算公式其实很朴素:
识别距离 ≈ (船体高度 × 焦距 × 传感器垂直分辨率) / (目标像素高度 × 传感器垂直尺寸)举个例子:一艘散货船干舷高度按10米算,传感器是1/1.8英寸格式(垂直尺寸约5.6毫米),分辨率1080P(垂直1920像素),我们要让船体在画面里至少占150像素高。如果选用50mm焦距的镜头:
距离 = (10 × 50 × 1920) / (150 × 5.6) ≈ 1143米这个距离意味着50mm镜头足以覆盖近1公里外的船。但实际部署时我们很少单用50mm定焦,因为近处会出现“船头进画面、船尾出画面”的问题。主流做法是:近泊位用8mm到12mm镜头覆盖100米内的靠泊船,远处航道方向用25mm到35mm镜头补一个远景视角,两个点位配合,近端细节和远端发现能力都兼顾。
2.3 防护、补光与现场环境的硬约束
港口环境对摄像机的考验远超普通园区。盐雾腐蚀、大风震动、暴雨、昼夜温差、船舶尾气油烟,每一项都能让普通设备在半年内性能明显衰减。我们选设备时把防护等级IP66或IP67作为硬指标,外壳必须是全密封金属材质,镜片要带增透疏水膜,这样雨水能快速滑落而不是糊在表面。在盐雾严重的码头还额外加装了防腐蚀涂层。
补光是夜间成像的关键。港口夜间并不是全黑的,靠泊作业区有高杆灯照明,但航道和锚地周边光照很暗。我们试验过几种补光方案,最后确定的组合是“红外灯+低照度传感器”:距离100米内的场景靠红外灯补光,画面虽然是黑白但船体轮廓清晰,模型识别不受影响;超过100米的场景不强行补光,而是依赖摄像机的低照度能力和长曝光模式。注意港口海事部门对光污染有要求,尤其引航航道附近不建议长期开启强白光补光,以免影响驾驶人员瞭望,这个合规问题要在设计阶段就和业主确认清楚。
3. 算法选型与模型训练的经验沉淀
3.1 船型类别体系怎么定
一开始我们参考国外一些船舶分类标准,把类别定得很细,结果训练和标注都苦不堪言。后来想明白了,业务需要什么就分什么,不是分类越细越好。最终和港口调度、海事用户一起梳理出七类:
- 集装箱船
- 散货船
- 油轮/化学品船(合并为一类)
- 液化气船(含LNG、LPG)
- 客滚船
- 工程船(拖轮、浮吊、挖泥船等)
- 杂货船
这个分类体系的好处是:每一类的外观差异足够大,集装箱船的箱体和吊架、散货船的舱口盖、油轮的管汇甲板、客滚船的舷侧跳板,视觉特征都很鲜明,模型学起来不费劲。而如果硬要把油轮和化学品船分开,两者外观几乎一样,只会徒增标注争议和误判率。拖轮等小型工程船虽然吨位小,但在港口出现频率很高,而且经常近距离穿梭,漏检会影响航道安全监控,所以必须单独开一类。
3.2 数据采集与标注的那些坑
模型训练最耗时的是数据。我们收集了超过4万张船舶图像,来源包括自建摄像机的连续视频抽帧、合作单位提供的历史录像、公开的船舶图库以及船讯网的照片。数据整理阶段有几个容易被忽略的问题必须先处理干净:第一是去重,视频抽帧很容易抽到同一个航次几乎相同的画面,必须按帧间相似度做去重;第二是类别均衡,集装箱船和散货船样本量大,液化气船和客滚船样本少,我们通过合成渲染、水平翻转、色彩扰动等手段做增强,把少样本类别的数量往上拉;第三是场景多样性,船型识别模型如果在单一港口训练,很容易过拟合到当地船队的涂装风格,所以我们特意混入了北方港口、长江内河、东南亚港口的图像。
标注团队用的是LabelImg和X-AnyLabeling两套工具,标注规范写了两页纸。核心约定包括:船舶主体完整且在画面中占比大于3%才标注,标注框必须紧贴船体轮廓(不是包住涟漪和倒影),船头方向用单独属性记录。最麻烦的是半遮挡场景的标注——集装箱船被拖轮挡住一半算哪类?我们规定只要能看到足够判断类别的关键结构就按真实类别标,看不到关键结构就标“截断样本”并单独建类目,训练时通过忽略该类别损失来避免模型学到错误信息。
3.3 模型选型:YOLOv8在船型识别上的取舍
检测模型我们对比了YOLOv5、YOLOv8和RT-DETR。YOLOv5推理最快但精度上限偏低,RT-DETR精度高但在边缘设备上的TensorRT优化还不够成熟,最终选了YOLOv8的m尺寸版本。选它的理由很务实:YOLOv8的C2f结构在中等尺寸模型上精度和速度平衡好,官方预训练权重在COCO上有很强的通用特征迁移能力,而且从v8开始,导出ONNX再转TensorRT的流程非常顺畅,部署环节少踩坑。
训练细节上,输入分辨率设成1280×1280而不是默认的640×640。因为船舶在远景画面里属于小目标,分辨率提高一倍,小目标的召回率能提升好几个点。代价是推理耗时增加,但边缘设备用TensorRT FP16推理,1280输入下依然能跑到23FPS左右,对港口场景完全够用。训练超参数方面,epoch设200,前50轮用Warmup + Cosine学习率衰减,初始学习率0.01,weight decay 0.0005。数据增强开了Mosaic、MixUp、随机透视和HSV扰动,但注意Mosaic比例不能太高,我们设了0.5,太高会让小目标分布太复杂,反而掉点。
量化是部署前必须做的一步。YOLOv8-m的FP16模型大约49MB,TensorRT INT8量化后能压到28MB左右,帧率从22FPS提升到32FPS。但INT8量化在船型这种大目标场景里精度损失很小(mAP掉0.8%左右),如果场景里有大量小目标就要谨慎用,需要先跑一遍校准集评估。
4. 系统实现与现场联调的全流程复盘
4.1 边缘推理框架的技术栈
AI摄像机内部的结构是这样的:图像传感器采集视频流后,通过串行接口送到ISP模块做图像处理,同时一路视频编码成RTSP流用于平台预览,另一路直接送进NPU/GPU做推理。应用层用C++写推理服务,Python只用于训练和数据标注,这样部署时不需要在设备上装Python环境,依赖更干净。
推理服务的核心逻辑有三个线程:取流线程负责从视频解码队列拿帧,预处理线程做Letterbox缩放和归一化,推理线程跑TensorRT引擎,后处理线程解析输出框并做跟踪关联。其中跟踪我们用ByteTrack而不是DeepSORT——船是刚性物体,不需要ReID特征,ByteTrack的纯运动匹配在船舶低速场景下又准又轻,CPU上跑也毫无压力。
完整流程是:检测到船舶并确认类型后,推理服务把结构化结果(时间戳、摄像机编号、船型、置信度、目标框坐标)通过MQTT协议上报到平台侧,平台再和AIS信息关联。即使网络断开,设备本地也能缓存至少7天的识别记录,恢复后自动补传。
4.2 多摄像机协同与船舶连续跟踪
港口岸线部署十几个点位后,同一艘船会先后进入多个摄像机视野。如果各点各出各的结果,船型结论可能不一致,对调度系统来说就是脏数据。我们的做法是增加一层“船舶轨迹聚合”逻辑。
首先用ByteTrack给每个目标分配临时ID,当目标在某路画面停留超过2秒且累计有效检测帧数超过10帧,才生成一条船舶过境记录。然后平台根据摄像机地理位置和视野重叠关系,把相邻点位上报的同方向、同时间窗口的目标做轨迹拼接,拼接时对重叠区域的船型输出做投票融合,取置信度最高的类别作为最终结论。实测下来,船型判定一致性从单点位的87%提升到融合后的96%以上。
4.3 现场联调的关键步骤
联调不是把设备挂上去就完事。我们到现场后第一件事是校正摄像机姿态。调整原则很简单:让船体在主航道和泊位区域尽量水平地横穿画面,避免严重侧倾视角。然后是设置检测区域(ROI),把岸上的吊机、车辆、行人等干扰区域用多边形掩膜屏蔽,只保留水面区域作为有效检测区域,这样岸上物体不会触发误报。
第三步是做“船型比对演练”。用AIS报文里的船名和呼号去匹配船讯网静态数据,和现场摄像机的识别结果做交叉核对。第一次联调时我们发现集装箱船的识别率只有82%,排查后发现是训练数据里绝大多数是标准集装箱船,而当地港口经常进出一种带舰艏楼的集装箱船,上层建筑在船艏位置,训练集里几乎没有这个形态。后来专门补充了这类样本重新训练,识别率才提上来。
5. 常见问题与现场排障实录
5.1 白天逆光:船身“白花花”一片怎么调
晴天下午,摄像机朝西拍摄,太阳低角度直射镜头,船体背光面细节完全淹没在高光里,模型直接懵。这是我们在现场遇到的第一个高频问题。
硬件层面,我们优先选择宽动态范围(WDR)能力强的传感器,开启WDR后高光区和阴影区的细节都能保留。软件层面,图像参数不能套用默认模式,要把曝光模式改成“快门优先”,快门速度固定在1/1000秒以上,防止船体运动拖影,同时开启背光补偿,让暗部提亮。还有一招,调整安装朝向:如果点位有选择余地,尽量让摄像机避免正对西晒方向,朝南或朝东布置,午后识别效果会稳定很多。
5.2 夜间或雨雾天气:目标“隐身”了
夜间虽然有补光,但100米外的船在画面里就是一团黑灰色剪影,轮廓有时和背景的水面混在一起。雨雾天气更麻烦,雨丝在红外灯下形成一片亮斑,图像对比度急剧下降,模型误检率上升。
我们的解决方案分三层。第一层是图像预处理,针对雨天做去雨算法不现实,但可以在摄像头里开启3D降噪,把雨丝拖影抹掉一部分。第二层是模型自适应,训练时我们专门加入了一批“低照度+雨天”的合成增强数据,让模型见过这种糟透了的图像,而不是只在晴好天气里学特征。第三层是双光谱融合:对关键点位加装热成像摄像机,可见光识别置信度低于阈值时切换到热像轮廓判别,船体和水面温度差异明显,热像能给出可靠的形状先验。
5.3 小目标和远距离目标漏检
最远的识别目标超过800米时,船在画面里可能就占40到60个像素。模型对小于32像素的小目标基本无能为力,这是检测网络的物理极限。我们实测后的经验是:与其硬撑识别距离,不如在硬件层面解决问题。
调整方案是“远近搭配”:每个监控断面部署两台摄像机,一台短焦大视场负责发现靠近的船,一台长焦窄视场负责抓拍远处细节。长焦点位视场角只有6度左右,船很容易跑出画面,所以必须加装云台并设置自动巡航扫描,扫描到目标后锁定跟踪。另外把长焦相机的码率调高一点,保证远景细节不因压缩损失,这点容易被忽视,码率设太低,远程船型纹理全糊了。
5.4 类别混淆:散货船和杂货船分不清
散货船甲板上有明显的舱口盖和抓斗,杂货船则有很多零散的吊杆和甲板货,但在远距离低分辨率下两者确实容易混淆。我们在统计混淆矩阵时发现两者互相误判的比例高达12%。
解决思路有两个。一个是为容易混淆的类别增加“判别性辅助特征输入”——把船身编号区域单独裁剪出来做OCR识别,得到船名后回查船舶数据库获取准确船型,再和视觉识别结果互相校验。另一个是增加训练数据中“模糊远距离”样本的比例,让模型学习在低分辨率下抓关键结构。处理后散货船和杂货船的互误判率从12%降到了4%以下。
5.5 常见问题速查表
| 现象 | 可能原因 | 排查方向 |
|---|---|---|
| 白天船体过曝 | 顺光/逆光方向不对、WDR未开启 | 检查朝向、开启WDR、降低曝光补偿 |
| 夜间漏检率飙升 | 补光距离不足、长曝光拖影 | 调整红外功率、提高快门、增加长焦点位 |
| 雨天误检率高 | 雨丝反光、镜头水膜 | 开启3D降噪、加装疏水镜片、调高置信度阈值 |
| 岸上车辆报成船 | ROI区域设置不当 | 用多边形掩膜屏蔽岸上区域 |
| AIS与视觉结果不一致 | AIS申报错误或视觉误判 | 两套数据分别人工复核,定位偏差源 |
| 模型偶发崩溃 | TensorRT引擎版本兼容问题 | 固定JetPack版本、用同一套ONNX导出环境 |
| 识别结果延迟高 | MQTT消息堆积、网络抖动 | 加本地缓存队列、调整上报频率 |
6. 运维心得与后续扩展方向
6.1 模型持续迭代的工程化机制
算法模型不是训练一次就能一劳永逸。港口在变,船型在变,甚至船舶涂装风格都在变。我们建立了一套半自动化的模型迭代流程:现场摄像机每天回传脱敏后的“疑似误判样本”,也就是置信度介于0.3到0.7之间的模糊样本,每周由算法工程师筛选一遍,挑出有代表性的进入标注池,累积到一定数量后增量训练,验证通过再走灰度发布流程。
这套流程跑通后,模型每季度能迭代一版,船型识别的整体准确率从第一版的91.2%提升到目前稳定在96%左右。灰度发布时建议只先打开一路摄像机验证24小时,看误报率和漏报率没有反弹后再全量铺开,千万不要同时更新所有点位,否则出了问题连回滚都来不及。
6.2 从船型识别到更多船舶业务场景
船型识别这个基础能力做出来后,扩展性远比想象的好。船身颜色识别可以用于渔船分类监管,船上集装箱数量统计可以辅助判断载货状态,船舶吃水深度的视觉估算也在探索中——虽然精度还不能替代电子测深仪,但作为辅助参考已经有一定价值。
最实用的扩展是“船舶行为异常预警”。利用船型识别结果和AIS轨迹数据叠加,可以自动发现两艘船异常接近、在非停泊区停留、船舶类型与锚地许可类型不符等情况,这些联动规则让AI摄像机从“看得见”变成“会思考”。
我个人在实际项目中最深的体会是:做港口AI识别,算法只占三成力气,剩下七成都在现场。光照变化、机械遮挡、盐雾腐蚀、安装角度、甚至海边风大导致的摄像机微颤,都会成为影响识别率的隐形杀手。所以如果你打算在类似场景里做AI视觉落地,一定要舍得在方案设计和现场调试阶段投入时间,把硬件选型和安装细节琢磨透,再回头优化模型。很多时候识别率提不上去,不是模型不行,而是画面质量根本就没喂饱模型。
这个项目后续我们准备做的是把多摄像机的连续跟踪做得更完整——目前船型识别已经可靠,但如果能把每艘船从进港到靠泊的完整轨迹自动关联起来,港口调度就能拿到一张真正的“船舶全场动态图”,那时候这套系统的价值就远不止船型识别本身了。