海上船舶检测对于海事安全监管与港口智能管理至关重要。传统视觉方法在复杂海况和小目标检测中常面临挑战。基于深度学习的目标检测技术,特别是YOLO系列模型,以其出色的实时性和准确性,为此类问题提供了高效的解决方案。
本文介绍一个基于YOLO系列模型(包括YOLOv5, v8, v11, v12)构建的船舶检测系统。该系统采用PyQt5框架开发了完整的桌面图形界面,支持多模态输入(图片、视频、摄像头实时流、文件夹批量处理),并集成了用户登录注册与信息管理功能,为算法模型的工程化应用与演示提供了完整范例。
系统功能演示
系统启动后,首先进入用户登录界面。界面设计简洁,左侧突出系统主题,右侧为登录表单,需要验证用户名、密码及验证码。

新用户可以通过注册功能创建账号。注册时支持自定义用户名、密码,并可上传个性化头像。

登录成功后进入主检测界面。界面采用经典的三栏布局:左侧为模型选择与文件操作区,中部是检测结果显示区域,右侧面板用于展示检测目标的详细数据列表和统计信息。

系统提供了个人信息管理模块,用户可以在此修改登录密码或更换个人头像。

系统核心是目标检测功能。上传图片或视频后,算法会自动识别画面中的船舶,并用边界框和类别标签进行标注。所有检测结果会实时在右侧的表格中列出,包括目标类别、置信度及坐标位置。

系统的一大亮点是支持多版本YOLO模型的一键切换。用户可以在界面中方便地选择不同的预训练模型(如YOLOv12n, YOLOv11n等),以适应不同场景下对精度和速度的要求。

模型训练与核心代码
系统附带完整的模型训练代码,方便用户使用自定义数据进行模型迭代。以下是一个用于批量训练多个YOLO版本模型的Python脚本核心代码。该脚本自动化了数据集路径配置和模型训练流程。
# -*- coding: utf-8 -*-
"""
YOLO模型批量训练脚本。
功能:
1. 自动修改数据集配置文件(data.yaml)中的路径为绝对路径。
2. 从指定目录加载不同版本的预训练模型。
3. 按统一参数启动训练任务。
"""
import os
import yaml
from pathlib import Path
from ultralytics import YOLO
def main():
# 1. 配置待训练的模型列表
models_to_train = [
{'name': 'yolov5nu.pt', 'train_name': 'train_yolov5nu'},
{'name': 'yolov8n.pt', 'train_name': 'train_yolov8n'},
{'name': 'yolo11n.pt', 'train_name': 'train_yolo11n'},
{'name': 'yolo12n.pt', 'train_name': 'train_yolo12n'}
]
current_dir = os.path.abspath(os.getcwd())
# 2. 动态更新数据集配置文件中的路径
data_yaml_path = os.path.join(current_dir, 'train_data', 'data.yaml')
with open(data_yaml_path, 'r', encoding='utf-8') as f:
data_config = yaml.safe_load(f)
data_config['path'] = os.path.join(current_dir, 'train_data')
with open(data_yaml_path, 'w', encoding='utf-8') as f:
yaml.dump(data_config, f, default_flow_style=False, allow_unicode=True)
# 3. 循环训练每个模型
for model_info in models_to_train:
model_name = model_info['name']
train_name = model_info['train_name']
print(f"\n{'='*60}")
print(f"开始训练模型: {model_name}")
print(f"训练名称: {train_name}")
print(f"{'='*60}")
pretrained_model_path = os.path.join(current_dir, 'pretrained', model_name)
if not os.path.exists(pretrained_model_path):
print(f"警告: 预训练模型文件不存在: {pretrained_model_path}")
continue
try:
model = YOLO(pretrained_model_path)
print(f"开始训练 {model_name}...")
# 启动训练,关键参数在此设置
model.train(
data=data_yaml_path,
epochs=100,
imgsz=640,
batch=8,
name=train_name,
)
print(f"{model_name} 训练完成!")
except Exception as e:
print(f"训练 {model_name} 时出现错误: {str(e)}")
continue
print(f"\n{'='*60}")
print("所有模型训练完成!")
print(f"{'='*60}")
if __name__ == "__main__":
main()
技术栈与模型选择
本项目采用的技术栈清晰明确:
- 编程语言:Python 3.10
- 图形界面:PyQt5
- 数据存储:SQLite(用于管理用户信息)
- 核心模型:YOLOv5, YOLOv8, YOLOv11, YOLOv12
YOLO模型性能对比与选择建议
根据Ultralytics官方在COCO数据集上的基准测试,几个轻量级模型的性能对比如下:
| 模型 |
尺寸(像素) |
mAPval 50-95 |
速度(CPU ONNX/毫秒) |
参数量(M) |
计算量(FLOPs/B) |
| YOLO12n |
640 |
40.6 |
- |
2.6 |
6.5 |
| YOLO11n |
640 |
39.5 |
56.1 ± 0.8 |
2.6 |
6.5 |
| YOLOv8n |
640 |
37.3 |
80.4 |
3.2 |
8.7 |
| YOLOv5nu |
640 |
34.3 |
73.6 |
2.6 |
7.7 |
核心结论:
- 精度最优:YOLO12n的mAP达到40.6%,领先优势明显。
- 速度最快:YOLO11n的CPU推理速度最快(56.1ms),相比YOLOv8n提升了约42%,更适合对实时性要求高的轻量化部署。
- 效率均衡:YOLO12n和YOLO11n在保持较高精度的同时,参数量和计算量都控制得较好。
选型建议:
- 追求最高检测精度,推荐使用YOLO12n。
- 需要最优的推理速度以支持实时应用,YOLO11n是最佳选择。
- 对于模型兼容性或历史项目延续性有要求的场景,可考虑YOLOv5或YOLOv8。
数据集与训练效果分析
本系统使用的船舶检测数据集包含总计超过8000张训练和验证图片,类别为“船舶”。数据配置文件示例如下:
names:
- ship
nc: 1
path: /absolute/path/to/train_data
train: ../train/images
val: ../valid/images
test: ../test/images
下图展示了训练批次中经过数据增强(如缩放、色偏、拼接等)后的部分样本图片,这有助于提升模型的鲁棒性。


训练结果可视化评估
训练完成后,系统会生成一系列评估图表,用于分析模型性能。
混淆矩阵(Normalized)展示了模型在验证集上的分类情况。理想状态下,对角线颜色最深,表明模型能准确地将目标识别为“船舶”,误检和漏检率极低。

F1-置信度曲线反映了模型在不同置信度阈值下的综合表现(F1分数是精确率和召回率的调和平均数)。如图所示,当置信度阈值设置为0.387时,模型取得了约0.93的最高F1分数,表明在此阈值下精确率和召回率达到了很好的平衡。

精确率-召回率(PR)曲线是目标检测中评价模型性能的关键指标。曲线下的面积即为平均精度(AP)。本模型在IoU阈值为0.5时的平均精度(mAP@0.5)达到了0.965,即96.5%,显示出极高的检测准确性。

获取方式
完整的项目源代码、预训练模型及数据集已公开,可以通过以下链接获取:https://www.bilibili.com/video/BV1GcywBiEJ6。该资源包提供了从环境配置、模型训练到应用部署的全流程材料,适合用于深度学习项目实践、算法研究或工程化参考。