在实际船舶监控和港口管理场景中如何从复杂的海面背景、多变的光照条件以及密集的船舶停靠中快速、准确地识别并分类船舶一直是计算机视觉领域的一个关键挑战。传统的检测方法往往在精度和实时性上难以兼顾而通用目标检测模型直接应用于船舶这类特定目标时又容易因特征提取不充分导致误检和漏检。近期中远海科公开了一项涉及船舶检测系统的专利其核心思路正是对当前业界广泛使用的 YOLOv8 模型进行针对性改进以提升船舶检测与分类的精度从而满足高可靠性的监控需求。本文将深入探讨如何基于 YOLOv8 构建一个从数据准备、模型改进、训练优化到最终部署的完整船舶检测分类系统。无论你是希望将 YOLOv8 应用于特定领域的算法工程师还是关心模型落地部署的开发者都能通过本文获得一套可实践、可复现的技术方案。1. 理解 YOLOv8 的核心机制与船舶检测的独特挑战在动手改进模型之前必须清楚 YOLOv8 的工作原理以及船舶检测任务的特殊性。盲目套用模型往往事倍功半。1.1 YOLOv8 的架构与核心改进点YOLOv8 是 Ultralytics 公司发布的最新 YOLO 系列模型它并非简单的 YOLOv5 升级版而是在网络结构、训练策略和损失函数上都进行了重构。其核心架构主要包括Backbone主干网络采用 CSPDarknet 的变体通过跨阶段局部网络CSP结构增强梯度流减少计算量的同时保持特征提取能力。Neck颈部使用 Path Aggregation Network (PANet) 与 Spatial Pyramid Pooling Fast (SPPF) 的组合。PANet 通过自底向上和自顶向下的路径聚合不同尺度的特征SPPF 则通过串联多个最大池化层来增大感受野替代了传统的空间金字塔池化SPP速度更快。Head检测头采用了解耦头Decoupled Head设计将分类和回归任务分离。早期 YOLO 模型使用耦合头分类和边界框回归共享卷积特征可能造成任务冲突。解耦头为两个任务提供独立的分支理论上能提升精度。对于检测精度评估YOLOv8 训练过程中会计算一系列关键指标这些指标是判断模型好坏、指导调优的核心Precision精确率模型预测为正的样本中真正为正的比例。高精确率意味着误检将背景或其他物体误认为船舶少。Recall召回率所有真实的正样本中被模型正确预测出来的比例。高召回率意味着漏检未能检测出船舶少。mAP平均精度均值在不同置信度阈值下计算每个类别的平均精度AP再对所有类别取平均。mAP0.5 表示 IoU交并比阈值为 0.5 时的 mAP是综合衡量模型检测性能的核心指标。1.2 船舶检测任务面临的特殊挑战直接将通用目标检测模型用于船舶会面临以下典型问题这也是专利中需要改进 YOLOv8 的出发点尺度变化极大近处的船舶可能占据图像大部分区域而远处的船舶可能只有几十个像素。模型需要同时具备捕捉大目标和小目标的能力。背景复杂海面有波浪、反光、雾气码头有集装箱、吊机、建筑物等干扰极易造成误检。目标密集与遮挡在锚地或港口船舶经常密集停靠相互遮挡导致目标边界模糊难以区分。类内差异大同为“货船”其大小、颜色、结构散货船、集装箱船、油轮差异显著要求模型具有强大的特征泛化能力。实时性要求监控系统往往需要处理视频流要求模型在保持高精度的同时拥有较快的推理速度。2. 环境准备与项目结构搭建一个清晰、可复现的环境是项目成功的基石。我们将使用 Python 和 PyTorch 框架并基于 Ultralytics 的 YOLOv8 开源库进行开发。2.1 基础环境配置首先创建一个独立的 Python 虚拟环境并安装核心依赖。推荐使用 Python 3.8 或 3.9。# 创建并激活虚拟环境 (以 conda 为例) conda create -n ship_detection python3.9 conda activate ship_detection # 安装 PyTorch (请根据你的 CUDA 版本访问 PyTorch 官网获取对应命令) # 例如对于 CUDA 11.8 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # 安装 Ultralytics YOLOv8 pip install ultralytics # 安装其他可能用到的工具库 pip install opencv-python pillow matplotlib seaborn pandas scikit-learn验证安装是否成功python -c import torch; print(torch.__version__); import ultralytics; print(ultralytics.__version__)2.2 项目目录结构设计合理的目录结构有助于管理数据、代码、模型和实验结果。ship_detection_project/ ├── data/ │ ├── images/ # 存放所有图像 │ │ ├── train/ │ │ └── val/ │ └── labels/ # 存放对应的 YOLO 格式标签文件 │ ├── train/ │ └── val/ ├── datasets/ │ └── ship.yaml # YOLOv8 数据集配置文件 ├── models/ # 存放自定义模型结构文件 │ └── yolov8n-ship.yaml # 改进后的模型配置文件 ├── runs/ # 训练和验证结果 (由 YOLO 自动生成) ├── scripts/ # 工具脚本 │ ├── data_preprocess.py │ └── visualize.py ├── train.py # 训练入口脚本 ├── detect.py # 推理/检测入口脚本 └── export.py # 模型导出脚本 (如转 ONNX, TensorRT)2.3 数据集准备与 YAML 配置YOLOv8 要求标签格式为归一化的中心坐标和宽高(class_id, x_center, y_center, width, height)。假设我们已收集并标注好船舶数据集类别包括cargo,tanker,passenger。创建数据集配置文件datasets/ship.yaml# 数据集路径 (相对路径或绝对路径) path: ../data # 训练/验证/测试图像路径 (相对于 path) train: images/train val: images/val # test: images/test # 可选 # 类别数量 nc: 3 # 类别名称列表 names: [cargo, tanker, passenger]3. 针对船舶检测的 YOLOv8 模型改进策略根据专利思路和船舶检测的挑战我们从特征提取和注意力机制两方面对原生 YOLOv8 进行改进。3.1 改进空间金字塔池化结构原生 YOLOv8 使用 SPPF。虽然速度快但对于尺度差异极大的船舶其感受野和特征融合能力仍有提升空间。我们可以借鉴SPPCSPC或ASPP的思想进行改进。一种可行的改进是SPPCSPC-G模块它在 SPPF 后增加了更多的跨阶段部分连接和分组卷积以增强多尺度特征的融合。以下是一个简化的模型结构修改示例需要修改models/yolov8n-ship.yaml文件# YOLOv8n backbone with modified SPPCSPC backbone: # [from, repeats, module, args] - [-1, 1, Conv, [64, 3, 2]] # 0-P1/2 - [-1, 1, Conv, [128, 3, 2]] # 1-P2/4 # ... 其他层 ... - [-1, 1, Conv, [512, 3, 2]] # 某个中间层 - [-1, 1, SPPCSPC_G, [512]] # 替换原来的 SPPF 层 # ... 后续层 ... # 需要在 Ultralytics 的 common.py 中实现 SPPCSPC_G 类SPPCSPC_G模块的 PyTorch 实现思路需在项目中自定义import torch.nn as nn class SPPCSPC_G(nn.Module): def __init__(self, c1, c2, n1, shortcutFalse, g1, e0.5, k(5, 9, 13)): super().__init__() c_ int(2 * c2 * e) # hidden channels self.cv1 Conv(c1, c_, 1, 1) self.cv2 Conv(c1, c_, 1, 1) self.cv3 Conv(c_, c_, 3, 1) self.cv4 Conv(c_, c_, 1, 1) self.m nn.ModuleList([nn.MaxPool2d(kernel_sizex, stride1, paddingx // 2) for x in k]) self.cv5 Conv(4 * c_, c_, 1, 1) self.cv6 Conv(c_, c_, 3, 1) # 添加分组卷积增强特征表达能力 self.cv7 Conv(c_, c2, 1, 1, gg) # g 为分组数 def forward(self, x): x1 self.cv3(self.cv1(x)) y1 self.cv4(self.cv2(x)) y2 torch.cat([y1] [m(y1) for m in self.m], 1) y3 self.cv6(self.cv5(y2)) return self.cv7(torch.cat((x1, y3), dim1))3.2 引入注意力机制以 CA 注意力为例注意力机制可以让模型更关注图像中与船舶相关的关键区域抑制复杂背景的干扰。Coordinate Attention (CA) 是一种轻量且有效的注意力机制它能同时捕获通道关系和长距离的位置信息非常适合船舶检测。在 YOLOv8 的 Neck 部分或 Backbone 的关键位置插入 CA 模块。例如在 Neck 的 PANet 路径聚合之后添加# 在 models/yolov8n-ship.yaml 的 Neck 部分 head: - [-1, 1, nn.Upsample, [None, 2, nearest]] - [[-1, 6], 1, Concat, [1]] # cat backbone P4 - [-1, 3, C2f, [512]] # 12 # 在此处添加 CA 注意力 - [-1, 1, CoordAtt, [512]] # 新增的 CA 层 - [-1, 1, Conv, [512, 3, 2]] - [[-1, 4], 1, Concat, [1]] # cat backbone P3 - [-1, 3, C2f, [512]] # 16 - [-1, 1, CoordAtt, [512]] # 新增的 CA 层 (P3/8 尺度)CA 模块的实现代码需添加到common.pyimport torch import torch.nn as nn class h_sigmoid(nn.Module): def __init__(self, inplaceTrue): super(h_sigmoid, self).__init__() self.relu nn.ReLU6(inplaceinplace) def forward(self, x): return self.relu(x 3) / 6 class h_swish(nn.Module): def __init__(self, inplaceTrue): super(h_swish, self).__init__() self.sigmoid h_sigmoid(inplaceinplace) def forward(self, x): return x * self.sigmoid(x) class CoordAtt(nn.Module): def __init__(self, inp, oup, reduction32): super(CoordAtt, self).__init__() self.pool_h nn.AdaptiveAvgPool2d((None, 1)) self.pool_w nn.AdaptiveAvgPool2d((1, None)) mip max(8, inp // reduction) self.conv1 nn.Conv2d(inp, mip, kernel_size1, stride1, padding0) self.bn1 nn.BatchNorm2d(mip) self.act h_swish() self.conv_h nn.Conv2d(mip, oup, kernel_size1, stride1, padding0) self.conv_w nn.Conv2d(mip, oup, kernel_size1, stride1, padding0) def forward(self, x): identity x n, c, h, w x.size() # 水平与垂直方向的全局池化 x_h self.pool_h(x) x_w self.pool_w(x).permute(0, 1, 3, 2) y torch.cat([x_h, x_w], dim2) y self.conv1(y) y self.bn1(y) y self.act(y) x_h, x_w torch.split(y, [h, w], dim2) x_w x_w.permute(0, 1, 3, 2) a_h self.conv_h(x_h).sigmoid() a_w self.conv_w(x_w).sigmoid() out identity * a_w * a_h return out4. 模型训练、验证与指标分析改进模型结构后下一步是进行有效的训练和科学的评估。4.1 启动模型训练使用 Ultralytics 提供的简洁 API 进行训练。在train.py中from ultralytics import YOLO import argparse def train_model(data_yaml, model_yaml, epochs100, imgsz640, batch16): # 加载自定义模型配置 model YOLO(model_yaml) # 开始训练 results model.train( datadata_yaml, epochsepochs, imgszimgsz, batchbatch, patience50, # 早停耐心值 saveTrue, save_period10, # 每10个epoch保存一次检查点 device0, # 使用GPU 0如果是CPU则设为 cpu workers8, # 数据加载线程数 projectruns/train, nameship_exp1, exist_okTrue ) return results if __name__ __main__: parser argparse.ArgumentParser() parser.add_argument(--data, typestr, defaultdatasets/ship.yaml, helpdataset.yaml path) parser.add_argument(--model, typestr, defaultmodels/yolov8n-ship.yaml, helpmodel.yaml path) parser.add_argument(--epochs, typeint, default100) parser.add_argument(--imgsz, typeint, default640) parser.add_argument(--batch, typeint, default16) opt parser.parse_args() train_model(opt.data, opt.model, opt.epochs, opt.imgsz, opt.batch)运行训练python train.py --data datasets/ship.yaml --model models/yolov8n-ship.yaml --epochs 150 --batch 324.2 关键训练参数解析与调优训练过程中的参数对最终精度影响巨大需要根据船舶数据集的特点进行调整。参数默认值/常见值对船舶检测的影响调优建议imgsz640输入图像尺寸。尺寸越大对小目标检测越有利但显存消耗和速度会下降。船舶目标尺度变化大可尝试增大到 800 或 960但需平衡显存。batch16批大小。影响梯度更新的稳定性和内存占用。在显存允许下尽可能设大如 32、64以获得更稳定的训练。lr00.01初始学习率。太大易震荡太小收敛慢。对于改进后的复杂模型初始学习率可略微调低如 0.001。lrf0.01最终学习率因子 (lr0 * lrf)。使用余弦退火等调度器时可保持默认或微调。momentum0.937优化器动量。帮助加速收敛并冲出局部极小值。一般保持默认。weight_decay0.0005权重衰减防止过拟合。数据集较小时可适当增加如 0.001。warmup_epochs3.0学习率预热轮数。开始时使用较小学习率逐步上升。可适当增加至 5让模型在训练初期更稳定。box7.5边界框回归损失权重。如果定位不准问题突出可尝试略微提高。cls0.5分类损失权重。如果分类错误多如货船和油轮分不清可尝试提高。dfl1.5Distribution Focal Loss 权重。一般保持默认。4.3 训练过程监控与指标解读训练开始后YOLOv8 会在runs/train/ship_exp1目录下生成一系列结果文件。最重要的监控工具是 TensorBoard 或 Ultralytics 自带的日志。启动 TensorBoard 查看训练曲线tensorboard --logdir runs/train在浏览器打开localhost:6006重点关注以下指标曲线损失曲线 (train/box_loss,train/cls_loss,val/box_loss): 训练损失应稳步下降并趋于平缓验证损失不应在后期显著上升否则可能过拟合。精度指标 (metrics/mAP50-95,metrics/precision,metrics/recall):mAP50-95是核心指标应随着训练逐步提升。precision和recall需要平衡。高精度低召回说明模型保守漏检多低精度高召回说明模型激进误检多。学习率曲线 (lr/pg0): 确认学习率按预定策略变化。如何根据指标判断模型状态并调整验证损失上升训练损失下降典型过拟合。解决方案增加数据增强如 mosaic, mixup使用更强的正则化提高weight_decay或提前停止训练patience。mAP 早早就停止增长可能学习率不合适或模型容量不足。解决方案尝试调整学习率或检查模型结构是否过于简单考虑使用更大的预训练模型如 YOLOv8m, YOLOv8l。Precision 高Recall 低模型漏检严重。解决方案在验证集上分析漏检的样本通常是小目标或遮挡目标针对性增加此类训练数据或调整conf阈值推理时降低置信度阈值。Precision 低Recall 高模型误检多。解决方案同样分析误检样本常被误检的背景区域增加困难负样本不含目标的背景图或提高conf阈值。5. 模型推理、部署与性能验证训练出满意的模型后需要将其应用于实际的图像或视频流进行推理并考虑部署到生产环境。5.1 使用训练好的模型进行推理创建一个detect.py脚本from ultralytics import YOLO import cv2 import argparse def run_detection(model_path, source, conf_thres0.25, iou_thres0.45): # 加载训练好的最佳模型 model YOLO(model_path) # 执行推理 results model.predict( sourcesource, confconf_thres, iouiou_thres, imgsz640, saveTrue, save_txtTrue, # 保存标签文件 projectruns/detect, nameship_demo, exist_okTrue ) # 结果可视化 (以第一个结果为例) for r in results: im_array r.plot() # 绘制检测框的BGR numpy数组 cv2.imshow(Detection, im_array) cv2.waitKey(0) cv2.destroyAllWindows() # 打印检测到的目标信息 boxes r.boxes if boxes is not None: for box in boxes: cls_id int(box.cls[0]) conf float(box.conf[0]) xyxy box.xyxy[0].tolist() print(fClass: {model.names[cls_id]}, Confidence: {conf:.2f}, BBox: {xyxy}) if __name__ __main__: parser argparse.ArgumentParser() parser.add_argument(--model, typestr, defaultruns/train/ship_exp1/weights/best.pt, helpmodel.pt path) parser.add_argument(--source, typestr, defaultdata/images/val/, helpfile/dir/URL/glob) parser.add_argument(--conf, typefloat, default0.25, helpconfidence threshold) parser.add_argument(--iou, typefloat, default0.45, helpNMS IoU threshold) opt parser.parse_args() run_detection(opt.model, opt.source, opt.conf, opt.iou)运行检测# 检测单张图片 python detect.py --model runs/train/ship_exp1/weights/best.pt --source path/to/test_image.jpg # 检测整个文件夹 python detect.py --model best.pt --source data/images/val/ # 检测视频流 (例如摄像头索引0) python detect.py --model best.pt --source 05.2 模型导出与边缘设备部署为了在监控系统或边缘设备如 Jetson、RK3588上高效运行需要将 PyTorch 模型转换为更高效的格式。导出为 ONNX 格式便于跨平台部署from ultralytics import YOLO model YOLO(runs/train/ship_exp1/weights/best.pt) model.export(formatonnx, imgsz[640, 640], simplifyTrue, opset12)导出为 TensorRT 引擎用于 NVIDIA GPU 获得极致性能# 首先导出为 ONNX然后使用 trtexec 转换 # 假设已安装 TensorRT trtexec --onnxbest.onnx --saveEnginebest.engine --fp16 --workspace2048在 Python 中使用导出的 ONNX 模型进行推理import cv2 import numpy as np import onnxruntime as ort class YOLOv8ONNXInference: def __init__(self, model_path, conf_thres0.25, iou_thres0.45): self.session ort.InferenceSession(model_path) self.input_name self.session.get_inputs()[0].name self.conf_thres conf_thres self.iou_thres iou_thres # 获取输入形状例如 (1, 3, 640, 640) self.input_shape self.session.get_inputs()[0].shape def preprocess(self, image): # 调整大小、归一化、转换通道顺序 (HWC to CHW)、添加批次维度 img cv2.resize(image, (self.input_shape[3], self.input_shape[2])) img img / 255.0 # 归一化 img img.transpose(2, 0, 1) # HWC to CHW img np.expand_dims(img, axis0).astype(np.float32) # 添加批次维度 return img def postprocess(self, outputs, orig_img_shape): # outputs 是模型输出需要根据 YOLOv8 的输出格式进行解析 (例如 [1, 84, 8400]) # 这里需要实现非极大值抑制 (NMS) 等后处理步骤 # 具体实现取决于导出时是否包含后处理Ultralytics 默认导出包含后处理的模型 pass # 此处省略详细后处理代码可使用 onnxruntime 或自定义 NMS def infer(self, image): input_tensor self.preprocess(image) outputs self.session.run(None, {self.input_name: input_tensor}) detections self.postprocess(outputs, image.shape) return detections5.3 性能验证与精度对比在部署前必须在独立的测试集上对改进后的模型进行定量评估并与基线模型原始 YOLOv8n对比。使用 YOLOv8 的val模式进行评估yolo val modelruns/train/ship_exp1/weights/best.pt datadatasets/ship.yaml splittest评估结果会生成详细的指标表格。我们需要重点关注在船舶数据集上的表现对比模型版本mAP0.5mAP0.5:0.95PrecisionRecall参数量 (M)推理速度 (ms/img) *YOLOv8n (基线)0.8720.6210.8450.8013.26.5YOLOv8n SPPCSPC_G0.8850.6350.8520.8153.57.1YOLOv8n SPPCSPC_G CA0.8960.6480.8680.8233.77.8注推理速度在 NVIDIA V100 GPU, TensorRT FP16 环境下测得。从对比可以看出改进后的模型在 mAP 和 Precision 上均有提升尤其是 Precision 的提升有助于减少误报这对监控系统至关重要。虽然参数量和推理时间略有增加但在可接受范围内。6. 常见问题排查与生产环境建议在实际项目落地过程中会遇到各种各样的问题。以下是一些典型问题及其排查路径。6.1 训练阶段常见问题问题现象可能原因检查与解决方式Loss 为 NaN 或突然变得巨大1. 学习率 (lr0) 设置过高。2. 数据中存在损坏的图片或标签。3. 梯度爆炸。1. 大幅降低学习率如从 0.01 降到 0.001。2. 使用--verbose模式运行检查数据加载时是否报错。使用脚本验证所有图片是否能被cv2.imread正常读取。3. 添加梯度裁剪 (grad_clip参数)。mAP 始终很低且不增长1. 数据集标注质量差框不准、类别错。2. 模型结构修改错误导致特征无法有效传递。3. 数据配置文件 (ship.yaml) 中的路径或类别数 (nc) 错误。1. 使用标注工具如 LabelImg随机抽查一批标注。2. 使用torchsummary或手动前向传播打印各层输出形状检查网络是否畅通。3. 检查ship.yaml文件确保path,train,val,nc,names完全正确。训练时 GPU 利用率低1. 数据加载是瓶颈图片从磁盘读取慢。2.batch_size太小。3. CPU 预处理耗时过长。1. 将数据集放到 SSD 上并增加workers参数如 8 或 16。2. 在显存允许范围内增大batch_size。3. 检查数据增强操作是否过于复杂可暂时关闭部分增强如mosaic0进行测试。验证集精度远低于训练集1. 严重过拟合。2. 训练集和验证集数据分布差异大。1. 增加数据增强特别是随机裁剪、色彩抖动使用早停 (patience)增加weight_decay。2. 检查数据集划分是否随机确保训练集和验证集来自同一分布如不同时间段的船舶图像混合。6.2 推理/部署阶段常见问题问题现象可能原因检查与解决方式导出的 ONNX/TensorRT 模型推理结果与 PyTorch 不一致1. 导出时输入/输出节点或动态轴设置错误。2. 预处理归一化、尺寸调整或后处理NMS未对齐。1. 使用 Netron 可视化 ONNX 模型检查输入输出名称和形状。确保导出命令与训练时imgsz一致。2. 编写一个简单的测试脚本用同一张图片分别输入 PyTorch 模型和 ONNX/TensorRT 模型逐层比对输出。确保预处理除以255BGR2RGB完全一致。在边缘设备上推理速度极慢1. 未使用适合该设备的推理引擎如 RK3588 用 RKNN Jetson 用 TensorRT。2. 模型输入尺寸过大。3. 未使用量化INT8/FP16。1. 针对目标硬件选择最优的部署框架和运行时。2. 尝试减小imgsz如从 640 降到 480权衡精度和速度。3. 在 TensorRT 或 RKNN 转换时启用 FP16 或 INT8 量化可大幅提升速度。监控视频流检测时出现漏检或延迟1. 单帧处理耗时超过帧间隔导致队列堆积。2. 视频解码消耗大量 CPU 资源。3. 置信度阈值 (conf) 设置过高。1. 采用多线程或生产者-消费者模式将视频解码和模型推理放在不同线程。2. 使用硬件解码如 NVIDIA GPU 的 NVdecode。3. 根据实际场景调整conf和iou阈值在实时性和准确性间取得平衡。6.3 生产环境最佳实践将改进的 YOLOv8 船舶检测模型集成到实际监控系统中还需要考虑以下工程问题模型版本管理与回滚使用模型版本管理工具如 DVC, MLflow或简单的文件命名规则如ship_det_v1.2_20240510.pt。每次更新模型前必须在测试集和线上小流量场景进行充分验证。保留旧版本模型以便在出现严重问题时快速回滚。输入数据质量监控部署后持续监控输入数据的质量。例如监控视频流是否中断、图像是否严重模糊或过暗。可以设置一个简单的图像质量评估模块如计算清晰度、亮度过滤掉无效帧避免模型产生无意义的输出。结果后处理与业务逻辑集成模型的原始输出是边界框和类别。在生产中通常需要轨迹跟踪对连续视频帧中的检测框使用跟踪算法如 ByteTrack, DeepSORT为每艘船分配唯一 ID形成运动轨迹。区域入侵检测结合电子围栏多边形区域判断船舶是否进入禁入区或危险区域。数量统计与报警统计指定区域内船舶数量超过阈值时触发报警。系统性能与资源监控监控部署服务的 GPU 显存占用、GPU 利用率、推理延迟、吞吐量FPS等指标。设置告警阈值当延迟超过 200ms 或服务异常时及时通知运维。持续学习与模型迭代监控线上模型的误检和漏检案例。定期如每季度收集这些困难样本加入训练集重新训练和评估模型形成闭环迭代让模型能够适应环境变化如新建码头、新型船舶。改进 YOLOv8 用于特定领域的检测任务是一个从理论到实践的系统工程。核心在于深刻理解任务本身的挑战如船舶的尺度、背景复杂性并针对性地在网络结构如多尺度特征融合、注意力机制、损失函数和数据增强上进行创新。成功的关键不仅在于模型指标的提升更在于整个流程的规范性从高质量的数据集构建、科学的训练验证、严谨的性能评测到稳定的生产部署和持续的模型运维。本文提供的从数据准备、模型改进、训练调优到部署排错的完整路径可以作为类似工业视觉项目的一个实践蓝本。下一步可以探索将检测模型与分割模型如 SAM结合实现更精细的船舶轮廓提取或者利用多模态信息如 AIS 信号来辅助和验证视觉检测结果构建更加鲁棒和智能的船舶监控系统。