新闻详情

新闻详情

首页 / 资讯中心 / 详情

YOLOv5舰船检测实战:数据集、模型与PyQt界面全解析

发布时间:2026/9/27 1:07:46来源:尧图网络
YOLOv5舰船检测实战:数据集、模型与PyQt界面全解析
简介本资源面向计算机视觉学习者与舰船检测应用开发者提供一套基于YOLOv5的完整舰船检测方案涵盖训练好的多类别检测权重、PR曲线与loss曲线等训练过程记录mAP可达90%以上并附带数千张标注好的船只检测数据集标签同时提供txt与xml两种格式覆盖舰艇、游轮、帆船、军舰等多个类别。资源包共159个文件包含34个py源码、32个pyc编译文件、27个yaml配置、21张jpg与8张png图像、4个pt权重文件、4个ui界面文件以及mp4演示视频等压缩包约769.62MB目录结构清晰便于按模块查阅与复用。目前已有1013人学习下载。读者可直接加载预训练模型进行推理测试配合PyQt界面完成图片、视频与摄像头三种输入方式的检测并借助数据集与曲线文件复现训练流程、分析模型表现适合课程设计、项目实战与二次开发参考。1. 舰船检测这套资源到底能省掉多少事如果你正在做海上目标识别、港口监控或者遥感图像分析大概率绕不开一个现实问题公开的舰船检测数据集要么类别单一要么标注质量参差想直接拿来训练一个能区分多种舰船类型的 YOLOv5 模型往往得自己从头标几千张图。这套资源的核心价值就在这儿——它把「几千张标注好的船只检测数据集 YOLOv5 多类型舰船检测模型 PyQt 可视化界面」打包到了一起拿到手就能跑推理想接着训练也有现成的标注文件。它适合三类人一是刚接触 YOLOv5 想找个完整项目练手的新手二是需要快速搭一个舰船检测 demo 给客户或领导看的工程师三是手里有类似场景但缺标注数据、想拿这套数据做预训练或迁移学习的人。数据集覆盖了多种舰船类型标注格式是 YOLO 系列通用的 txt 格式模型权重和 PyQt 界面都是配套的省掉了环境配置和界面开发这两块最耗时的重复劳动。下面我按「数据长什么样 → 怎么跑起来 → 怎么接着训练 → 坑在哪」的顺序拆一遍。2. 数据集结构与 YOLOv5 训练格式对齐先看清目录再动手2.1 舰船数据集的目录组织与标注格式这套资源里的数据集是典型的 YOLO 格式组织方式根目录下分 images 和 labels 两个文件夹各自再分 train、val 子集。images 里是 jpg 或 png 原图labels 里是同名的 txt 文件每行代表一个目标格式是class_id x_center y_center width height坐标全部归一化到 0 到 1 之间。舰船类别按类型编号比如 0 代表某类舰船、1 代表另一类具体类别名在 data.yaml 里定义。常见做法是先用几行 Python 确认一下数据量和类别分布别急着开训。下面这段脚本我一般会先跑一遍看看有没有空标注文件或者类别严重不均衡的情况。import os from collections import Counter label_dir dataset/labels/train class_counter Counter() empty_files [] for txt_file in os.listdir(label_dir): path os.path.join(label_dir, txt_file) with open(path, r) as f: lines f.readlines() if len(lines) 0: empty_files.append(txt_file) continue for line in lines: cls_id int(line.strip().split()[0]) class_counter[cls_id] 1 print(类别分布:, dict(class_counter)) print(空标注文件数:, len(empty_files))这段代码遍历训练集 labels 目录统计每个类别的目标框数量同时记录空标注文件。类别分布能帮你判断要不要做重采样空标注文件如果太多说明数据清洗没做完直接训练会引入噪声。参数上只需要改label_dir指向你的实际路径其他不用动。2.2 data.yaml 的写法与路径陷阱YOLOv5 训练时靠 data.yaml 找数据这个文件写错路径是新手翻车最多的地方。典型写法如下train: ../dataset/images/train val: ../dataset/images/val nc: 4 names: [destroyer, frigate, carrier, supply]train和val写的是 images 目录路径不是 labelsYOLOv5 会自动把 images 替换成 labels 去找标注。nc是类别数names顺序必须和标注文件里的 class_id 严格对应错一位整个训练就废了。我见过有人把 names 写成中文导致编码报错建议全用英文小写。路径用相对路径时相对的是你执行训练命令时所在的目录不是 data.yaml 所在目录这点特别容易搞混。稳妥做法是写绝对路径或者把 data.yaml 放在项目根目录、用相对于根目录的路径。2.3 用 YOLOv5 官方仓库对接这套数据数据准备好了接下来把 YOLOv5 源码拉下来对接。假设你已经装好 PyTorch 和 CUDA步骤是git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txt然后把 data.yaml 放到 yolov5/data/ 下面改好路径。训练命令python train.py --img 640 --batch 16 --epochs 100 --data data/ship.yaml --weights yolov5s.pt --cache--img 640是输入分辨率舰船目标如果普遍偏小可以提到 1280但显存占用会翻倍。--batch 16看显存调8G 显存跑 640 分辨率大概能到 16。--weights yolov5s.pt是官方预训练权重用迁移学习比从头训收敛快得多。--cache把图片缓存到内存数据量几千张时能明显加快每个 epoch 的读取速度但内存小于 16G 就别加。训练日志里重点看 mAP0.5 和 mAP0.5:0.95 两个指标舰船检测一般 mAP0.5 到 0.85 以上算可用。3. PyQt 界面与模型推理打通从权重到可点击的检测工具3.1 PyQt 界面的功能模块拆解这套资源的 PyQt 界面不是花架子它把「选图片/选视频 → 加载模型 → 推理 → 画框显示 → 保存结果」这条链路串起来了。界面通常分三块左侧是文件选择区和参数控件中间是图像显示区右侧或底部是检测结果列表和置信度阈值滑块。核心逻辑在推理线程里避免界面卡死。我一般会先确认界面调用的推理脚本是不是独立于训练代码的这样换权重不用动界面。常见结构是detect_ui.py负责界面inference.py负责加载模型和推理两者通过信号槽通信。如果你拿到的版本把推理逻辑写死在界面文件里建议先抽出来不然后面换模型很痛苦。3.2 模型加载与推理代码的关键参数推理部分的核心是加载 YOLOv5 权重并对单张图做前向。下面这段是常见写法import torch from models.common import DetectMultiBackend from utils.augmentations import letterbox from utils.general import non_max_suppression, scale_boxes import cv2 import numpy as np device torch.device(cuda if torch.cuda.is_available() else cpu) model DetectMultiBackend(weights/best.pt, devicedevice) model.eval() img cv2.imread(test.jpg) img_rgb cv2.cvtColor(img, cv2.COLOR_BGR2RGB) im letterbox(img_rgb, 640, stride32, autoTrue)[0] im im.transpose((2, 0, 1))[::-1] im np.ascontiguousarray(im) im torch.from_numpy(im).to(device).float() / 255.0 im im.unsqueeze(0) pred model(im) pred non_max_suppression(pred, conf_thres0.25, iou_thres0.45) for det in pred: if det is not None and len(det): det[:, :4] scale_boxes(im.shape[2:], det[:, :4], img.shape).round() for *xyxy, conf, cls in det: label f{model.names[int(cls)]} {conf:.2f} cv2.rectangle(img, (int(xyxy[0]), int(xyxy[1])), (int(xyxy[2]), int(xyxy[3])), (0, 255, 0), 2) cv2.putText(img, label, (int(xyxy[0]), int(xyxy[1]) - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1) cv2.imwrite(result.jpg, img)letterbox做等比缩放加灰边填充保证输入尺寸是 32 的倍数这是 YOLOv5 的标准预处理。conf_thres0.25是置信度阈值舰船检测如果误检多可以提到 0.4漏检多就降到 0.15。iou_thres0.45控制 NMS 合并重叠框的力度密集停靠的船只场景可以适当调高到 0.5 避免漏掉相邻目标。scale_boxes把检测框从 640 输入尺寸映射回原图尺寸这一步不做的话框会画错位置。3.3 把推理封装进 PyQt 线程避免卡界面PyQt 主线程跑推理会直接卡死必须用 QThread。常见做法是定义一个 Worker 类把推理函数放 run 里通过 pyqtSignal 把结果传回主线程更新界面。from PyQt5.QtCore import QThread, pyqtSignal class DetectWorker(QThread): finished pyqtSignal(object) def __init__(self, model, img_path, conf): super().__init__() self.model model self.img_path img_path self.conf conf def run(self): result_img run_inference(self.model, self.img_path, self.conf) self.finished.emit(result_img)pyqtSignal(object)里传 numpy 数组或 QImage 都行注意跨线程传对象别传 Qt 控件本身。run里调用的run_inference就是上面那段推理逻辑封装成的函数。界面里点「开始检测」时创建 Worker 实例、连接 finished 信号到更新显示的函数、然后 start。这样即使推理耗时两三秒界面也不会假死。置信度滑块的值通过构造函数传进 Worker实现动态调参。4. 避坑与排查舰船检测项目里最容易翻车的五件事4.1 训练 loss 不降反升现象是训练几个 epoch 后 box_loss 和 cls_loss 震荡甚至上涨。原因通常是学习率太大或者 batch size 太小导致梯度噪声大。解决方法是把--lr0从默认 0.01 降到 0.001batch 至少提到 8同时加--warmup_epochs 3让前几个 epoch 用小学习率预热。如果数据里标注框特别小还要检查 anchor 是否匹配可以用--noautoanchor关掉自动锚框再手动调。4.2 推理时框位置整体偏移现象是检测框画出来但位置对不上目标偏上或偏左。原因是预处理用了 letterbox 但后处理没做 scale_boxes或者 scale_boxes 的输入尺寸传错了。检查scale_boxes第一个参数是不是im.shape[2:]第二个参数是不是原图img.shape。另外确认 letterbox 的autoTrue和推理时一致训练和推理预处理不一致是偏移的常见根源。4.3 PyQt 界面点检测没反应现象是点了按钮但图像区不更新。先看控制台有没有报错常见是模型路径写错导致加载失败但异常被吞了。在 Worker 的 run 里加 try-except 把异常打印出来。另一个原因是信号没连接成功检查worker.finished.connect(self.update_image)这行是不是在worker.start()之前。还有可能是 QImage 格式不对numpy 数组转 QImage 时要注意通道顺序和 stride。4.4 数据集类别编号与 names 不对应现象是训练出来的模型把驱逐舰识别成补给舰。打开一个标注 txt 看第一列的数字再对照 data.yaml 里 names 列表的索引。比如标注里 0 出现最多但 names 第 0 位写的是不常见的类别说明标注时类别映射就错了。这种只能重新映射写个脚本把 txt 里的 class_id 批量替换成正确值同时更新 names 顺序。4.5 显存溢出导致训练中断现象是训练到一半报 CUDA out of memory。先把--batch减半再把--img从 640 降到 416 试试。如果还不行加--workers 2减少数据加载进程数或者用--device 0明确指定单卡。舰船数据集图片如果分辨率很高letterbox 之后仍然占显存可以在 data.yaml 同级加一个--rect参数做矩形推理减少填充带来的无效计算。5. 进阶技巧用这套权重做迁移学习和置信度调优拿到这套舰船检测权重后最实用的进阶玩法是迁移到你自己的场景。比如你手头有内河船舶或者特定港口的监控画面类别和这套数据不完全一样但舰船的整体纹理和轮廓特征是相通的。做法是把--weights指向这套资源的 best.pt冻结前几层只训检测头。命令是在训练时加--freeze 10意思是冻结前 10 层这样小数据集上收敛快且不容易过拟合。我一般会先用 500 张左右的自有数据跑 30 个 epoch 看 mAP如果比从头训高 10 个点以上说明迁移有效。另一个技巧是分场景调置信度。舰船检测在远海和港口两种场景下最优阈值不一样远海背景干净conf 可以降到 0.2 多召回一些小目标港口背景复杂conf 提到 0.45 能压掉大量误检。PyQt 界面里如果置信度滑块范围是 0.05 到 0.95建议在代码里把默认值设成 0.3然后根据实际画面微调。我习惯在推理脚本里加一个环境变量读取 conf这样不用改代码就能在命令行测试不同阈值的效果。验证模型有没有真正学到舰船特征可以做一个简单的消融把测试集里所有图片的舰船区域涂黑再推理如果模型仍然输出高置信度框说明它学的是背景捷径而不是目标本身。这个检查能帮你判断要不要补充负样本。从那以后我每次拿到新权重都强制走一遍涂黑测试和分场景阈值扫描确认没有走捷径才敢往界面上挂。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

STC8H8K64U ADC实战:从寄存器配置到滤波校准 2026/9/27 2:53:39

STC8H8K64U ADC实战:从寄存器配置到滤波校准

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
网站建设有几种工具?不懂代码选哪家好,看完这篇不踩坑 2026/9/27 2:53:39

网站建设有几种工具?不懂代码选哪家好,看完这篇不踩坑

网站建设有几种工具?不懂代码选哪家好,看完这篇不踩坑 自己不会代码想做网站,是不是在后台搜“网站建设哪家好”时,结果多到眼花?其实,选对工具比找对服务商更重要。很多站长一上来就问“哪家建站公司好”,结果被忽悠买了一堆用不上的功能,或者因为选…

阅读更多 →
少儿信息学竞赛复赛试题docx解析与模拟赛备赛指南 2026/9/27 2:53:39

少儿信息学竞赛复赛试题docx解析与模拟赛备赛指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Better Notes 模板导入指南:Zotero 文献笔记自定义结构实操 2026/9/27 2:53:39

Better Notes 模板导入指南:Zotero 文献笔记自定义结构实操

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
SquareLine Studio+STM32 TFT彩屏UI开发实战 2026/9/27 2:53:32

SquareLine Studio+STM32 TFT彩屏UI开发实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
网站开发使用api对seo对比评测:解决拖稿痛点 2026/9/27 2:53:32

网站开发使用api对seo对比评测:解决拖稿痛点

网站开发使用api对seo对比评测:解决拖稿痛点 改个需求建站公司拖一周,这种痛谁懂?后端说接口没调通,前端说等数据,SEO专员问页面权重何时生效,三方互相甩锅,项目卡死在中间。很多前端新手入行就踩这个坑,以为写了个API调用完事,结果上线…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉