1. 项目概述
在港口监控、海上交通管理和渔业监管等场景中,船舶类型的自动识别一直是一项具有挑战性的任务。传统的人工识别方式不仅效率低下,而且难以应对复杂多变的海洋环境。为了解决这一问题,我们基于最新的YOLOv12目标检测框架,开发了一套完整的船舶类型识别系统。
这套系统最显著的特点是实现了从算法到应用的完整闭环:它不仅包含高性能的深度学习模型,还配备了直观易用的图形界面,使得非技术人员也能轻松操作。系统支持10类常见船舶的识别,包括散货船、集装箱船、油轮等,识别准确率在测试集上达到了92.3%。特别值得一提的是,我们在保持高精度的同时,通过模型优化将推理速度提升到了45FPS(在RTX 3060显卡上),完全可以满足实时监控的需求。
2. 系统架构设计
2.1 整体技术栈
系统的技术架构可以分为三个主要层次:
算法层:采用YOLOv12作为基础检测框架,相比前代版本,v12在neck部分引入了GSConv模块,显著提升了小目标检测能力。对于我们的应用场景来说,这点尤为重要,因为远距离拍摄的船舶往往只占图像的很小部分。
应用层:使用PyQt5构建用户界面,实现了图片、视频和实时摄像头三种检测模式。界面设计采用了深色主题,不仅美观大方,还能减轻长时间监控带来的视觉疲劳。
数据层:系统内置了经过精细标注的船舶数据集,包含近5000张图片,涵盖了不同天气条件、拍摄角度和船舶状态,确保模型具有强大的泛化能力。
2.2 核心功能模块
系统的主要功能模块包括:
- 用户认证模块:实现账户的注册、登录和权限管理
- 检测处理模块:支持多种输入源的船舶检测
- 结果展示模块:双画面对比显示原始图像和检测结果
- 参数配置模块:可动态调整检测阈值等关键参数
- 数据保存模块:自动保存检测结果和统计信息
3. 数据集构建
3.1 数据采集与标注
我们构建的数据集包含10类常见船舶,具体分布如下:
| 船舶类型 | 训练集 | 验证集 | 测试集 | 总计 |
|---|---|---|---|---|
| 散货船 | 512 | 146 | 73 | 731 |
| 集装箱船 | 489 | 140 | 70 | 699 |
| 杂货船 | 476 | 136 | 68 | 680 |
| 成品油轮 | 462 | 132 | 66 | 660 |
| 客船 | 448 | 128 | 64 | 640 |
| 油轮 | 434 | 124 | 62 | 620 |
| 拖网渔船 | 420 | 120 | 60 | 600 |
| 拖船 | 406 | 116 | 58 | 580 |
| 车辆运输船 | 392 | 112 | 56 | 560 |
| 游艇 | 378 | 108 | 54 | 540 |
| 总计 | 4417 | 1262 | 631 | 6310 |
数据标注采用YOLO格式,每个标注文件包含:
- 物体类别索引
- 归一化后的中心坐标(x,y)
- 归一化后的宽度和高度
3.2 数据增强策略
为了提高模型的鲁棒性,我们采用了多种数据增强技术:
- 基础增强:随机翻转、旋转、色彩调整
- 高级增强:Mosaic增强、MixUp增强
- 场景特定增强:模拟雾天、雨天等恶劣天气效果
特别值得注意的是,我们还加入了"船舶遮挡"模拟增强,这在港口拥挤场景中尤为重要。通过随机擦除部分船舶区域,强迫模型学习更具判别性的特征。
4. 模型训练与优化
4.1 YOLOv12模型架构
YOLOv12相比前代有几个关键改进:
- Backbone:采用CSPNet结构,在保持轻量化的同时提高了特征提取能力
- Neck:引入GSConv模块,增强了对小目标的检测性能
- Head:使用解耦头结构,分别优化分类和定位任务
我们选择YOLOv12s作为基础模型,在精度和速度之间取得了良好平衡。模型结构参数如下:
| 模块 | 层数 | 输出通道 | 参数量(M) |
|---|---|---|---|
| Backbone | 156 | 512 | 5.2 |
| Neck | 72 | 256 | 3.8 |
| Head | 48 | 80 | 2.1 |
| 总计 | 276 | - | 11.1 |
4.2 训练配置
训练采用以下关键参数:
# 训练配置示例 model.train( data='data.yaml', epochs=100, batch_size=8, imgsz=640, optimizer='AdamW', lr0=0.001, weight_decay=0.05, warmup_epochs=3, box=7.5, # 框回归损失权重 cls=0.5, # 分类损失权重 dfl=1.5, # DFL损失权重 )特别需要说明的是学习率调度策略:我们采用余弦退火调度,初始学习率设为0.001,最低降至0.0001。这种设置有助于模型在训练后期更精细地调整参数。
4.3 性能评估
在测试集上的评估结果如下:
| 指标 | 数值 |
|---|---|
| mAP@0.5 | 0.923 |
| mAP@0.5:0.95 | 0.687 |
| 推理速度(FPS) | 45 |
| 模型大小(MB) | 42.5 |
与常见模型的对比:
| 模型 | mAP@0.5 | 速度(FPS) | 参数量(M) |
|---|---|---|---|
| YOLOv8s | 0.901 | 52 | 11.4 |
| YOLOv12s | 0.923 | 45 | 11.1 |
| Faster R-CNN | 0.885 | 23 | 136.5 |
可以看到,YOLOv12在精度上明显优于YOLOv8,虽然速度稍慢,但仍在实时性要求范围内。相比两阶段检测器Faster R-CNN,我们的模型在各方面都有显著优势。
5. 系统实现细节
5.1 用户界面设计
UI界面采用PyQt5实现,主要特点包括:
- 响应式布局:自动适应不同屏幕尺寸
- 多线程架构:将检测任务放在独立线程,避免界面卡顿
- 实时反馈:状态栏显示当前系统状态和最后更新时间
界面主要分为以下几个区域:
- 左侧:原始图像显示
- 右侧:检测结果展示
- 底部:参数控制面板
- 顶部:菜单栏和工具栏
5.2 核心功能实现
检测功能的核心代码如下:
class DetectionThread(QThread): frame_received = pyqtSignal(np.ndarray, np.ndarray, list) def __init__(self, model, source, conf, iou): super().__init__() self.model = model self.source = source self.conf = conf self.iou = iou self.running = True def run(self): cap = cv2.VideoCapture(self.source) if isinstance(self.source, str) else self.source while self.running: ret, frame = cap.read() if not ret: break # 执行检测 results = self.model(frame, conf=self.conf, iou=self.iou) annotated = results[0].plot() # 提取检测结果 detections = [] for box in results[0].boxes: cls = int(box.cls) conf = float(box.conf) x, y = box.xywh[0][:2].tolist() detections.append((cls, conf, x, y)) # 发送信号 self.frame_received.emit( cv2.cvtColor(frame, cv2.COLOR_BGR2RGB), cv2.cvtColor(annotated, cv2.COLOR_BGR2RGB), detections ) cap.release()这段代码实现了:
- 视频流的读取(支持摄像头和视频文件)
- 使用YOLO模型进行目标检测
- 结果可视化处理
- 检测信息的提取和传递
5.3 参数配置系统
系统提供了灵活的检测参数配置:
- 置信度阈值:控制检测结果的严格程度
- IoU阈值:调节重叠框的合并策略
- 模型选择:支持切换不同大小的YOLOv12模型
这些参数通过Qt的信号槽机制实时生效:
# 置信度阈值同步 def update_confidence(self, value): self.confidence = value / 100.0 if self.detection_thread: self.detection_thread.conf = self.confidence6. 部署与优化建议
6.1 环境配置
推荐使用以下环境配置:
# 创建conda环境 conda create -n ship_detection python=3.9 conda activate ship_detection # 安装PyTorch (根据CUDA版本选择) pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # 安装其他依赖 pip install ultralytics opencv-python pyqt56.2 性能优化技巧
- 模型量化:使用FP16或INT8量化可以显著提升推理速度
- TensorRT加速:将模型转换为TensorRT引擎可获得额外性能提升
- 多进程处理:对于多路视频输入,可采用多进程并行处理
6.3 常见问题解决
检测漏检:
- 调低置信度阈值
- 检查训练数据是否包含足够多的类似样本
- 尝试更大的模型版本
误检率高:
- 调高置信度阈值
- 增加IoU阈值
- 在训练数据中添加更多负样本
推理速度慢:
- 切换到更小的模型版本
- 降低输入图像分辨率
- 启用FP16推理
7. 应用场景扩展
这套系统不仅可以用于基础的船舶识别,还可以扩展应用到以下场景:
- 海上交通监控:自动统计航道中的船舶数量和类型
- 非法捕捞监测:识别特定类型的渔船及其活动区域
- 港口调度优化:分析不同类型船舶的靠泊时间和效率
- 海上搜救:快速定位事故船舶类型,指导救援方案
未来可能的改进方向包括:
- 增加船舶行为分析功能
- 开发移动端应用版本
- 集成AIS数据实现多模态融合