ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

基于YOLOv8的渔船作业监控系统:从模型训练到可视化界面部署全链路

基于YOLOv8的渔船作业监控系统:从模型训练到可视化界面部署全链路 简介这份资源是一套基于YOLOv8的渔船作业监控系统完整项目面向计算机、人工智能、通信工程等专业的在校学生与教师可用于毕业设计、课程设计或大作业也适合具备一定基础的学习者进阶练手。项目围绕目标检测与视频监控场景展开涵盖模型训练、推理检测与可视化界面等核心环节部署流程简单运行即可看到效果。压缩包共97个文件约24.21MB以70个Python源码文件为主体辅以4个pt权重文件、5个xml配置、12个pyc缓存及mp4演示视频、ico图标等结构清晰便于按模块查阅。资源内附完整数据集、可视化页面与部署说明可生成核心指标曲线、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果及标签分布图帮助读者快速理解检测流程与评估方法。目前已有41人学习适合需要一站式毕设方案、希望在此基础上修改扩展功能的学习者参考使用。1. 渔船作业监控系统到底在监控什么从 YOLOv8 到可视化界面的完整链路渔船作业监控系统本质是把摄像头拍到的海面画面实时转换成「有没有船、船在哪、在干什么」这三类结构化信息。它要解决的不是单纯的目标检测而是把 YOLOv8 的推理结果接到一个可视化界面上让值班人员不用看原始视频流就能判断作业状态。这套方案适合两类人一类是做毕设或课程设计的学生需要一套能跑通、能演示、能写进论文的完整工程另一类是想把 YOLOv8 落到实际场景的工程师需要知道数据集怎么标、界面怎么接、部署时哪里会翻车。标题里提到的源码、可视化界面、完整数据集、部署教程对应的正是「模型训练 → 推理封装 → 界面展示 → 环境部署」这条链路。很多人卡在第一步就放弃了其实真正难的不是 YOLOv8 本身而是把检测结果稳定地喂给界面以及让整套东西在别人的机器上也能跑起来。2. 用 YOLOv8 训练渔船检测模型数据集准备与训练参数怎么定2.1 渔船数据集从哪来、怎么标、怎么划分渔船作业监控系统的数据集通常没有现成的公开大规模版本常见做法是自己采集或从公开船舶检测数据里筛选。如果手头没有真实渔船图片可以用近海船舶、港口监控截图做补充但要注意类别定义要统一。标注格式用 YOLO 的 txt 格式每行是class_id x_center y_center width height坐标全部归一化到 0 到 1 之间。标注时最容易翻车的地方是「渔船」和「货船」混标。如果监控目标只是渔船作业建议只保留一个类别fishing_boat不要一开始就分「拖网渔船」「围网渔船」类别越多标注成本越高小样本下模型越容易学偏。数据集划分按 8:1:1 走训练集、验证集、测试集如果样本少于 2000 张验证集可以降到 10%测试集用单独采集的几段视频抽帧避免同一条船出现在训练和测试里导致指标虚高。目录结构建议这样组织dataset/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ ├── val/ │ └── test/ └── data.yamldata.yaml内容如下path: ./dataset train: images/train val: images/val test: images/test nc: 1 names: [fishing_boat]这里nc是类别数names的顺序必须和标注时的class_id一致。很多人改完类别忘了改nc训练时直接报维度不匹配这是最常见的低级错误。2.2 YOLOv8 训练命令与关键参数设置环境配置用 Python 3.9 以上PyTorch 按显卡版本装。GTX1660Ti 这类 6G 显存的卡跑 YOLOv8n 或 YOLOv8s 没问题但 batch size 要压到 8 或 16否则显存直接爆。安装 ultralytics 后训练命令如下yolo detect train \ modelyolov8n.pt \ datadataset/data.yaml \ epochs100 \ imgsz640 \ batch16 \ device0 \ workers4 \ projectruns/fishing \ nameexp1参数说明model选yolov8n.pt是轻量版适合毕设和边缘部署imgsz640是默认输入尺寸如果渔船在画面里很小可以提到 960但显存和推理时间都会涨batch16在 6G 显存上是安全值8G 以上可以试 32workers是数据加载线程Windows 下设 0 或 2 更稳Linux 下可以设 4 到 8。训练过程中如果 loss 震荡厉害先把学习率降下来YOLOv8 默认用的是余弦退火前几个 epoch 波动正常但 20 轮之后还上下跳就要检查标注里有没有框错类别。训练完成后权重在runs/fishing/exp1/weights/best.pt。验证命令yolo detect val modelruns/fishing/exp1/weights/best.pt datadataset/data.yaml重点看mAP50和mAP50-95渔船这种单类别场景mAP50 到 0.85 以上基本可用低于 0.7 就要回头查数据集。如果训练集指标高、验证集低说明过拟合加数据增强或者减模型复杂度。2.3 损失函数曲线怎么看、什么时候该停YOLOv8 训练完会在results.csv里记录每轮的 box_loss、cls_loss、dfl_loss 和 mAP。画曲线用 pandas 加 matplotlib 就行import pandas as pd import matplotlib.pyplot as plt df pd.read_csv(runs/fishing/exp1/results.csv) df.columns df.columns.str.strip() plt.plot(df[epoch], df[train/box_loss], labeltrain_box) plt.plot(df[epoch], df[val/box_loss], labelval_box) plt.xlabel(epoch) plt.ylabel(loss) plt.legend() plt.savefig(loss_curve.png)逻辑说明train/box_loss持续下降但val/box_loss开始上升就是过拟合信号这时候早停比继续跑更划算。YOLOv8 自带patience参数默认 50 轮没提升就停毕设场景可以设成 20省时间。曲线图放进论文里比只写一个 mAP 数字更有说服力。3. 把检测结果接到可视化界面推理封装与界面联调3.1 推理脚本怎么写才能被界面调用可视化界面要的是「给一张图或一帧视频返回带框的结果和统计信息」。所以推理部分不能只写个命令行要封装成函数。下面是一个最小可用的推理封装from ultralytics import YOLO import cv2 model YOLO(runs/fishing/exp1/weights/best.pt) def detect_frame(frame, conf0.4): results model.predict(frame, confconf, verboseFalse) boxes [] for r in results: for box in r.boxes: x1, y1, x2, y2 box.xyxy[0].tolist() cls_id int(box.cls[0]) score float(box.conf[0]) boxes.append({ bbox: [x1, y1, x2, y2], class: model.names[cls_id], score: score }) return boxes参数说明conf0.4是置信度阈值渔船监控场景建议设在 0.35 到 0.5 之间太低会误检海浪和云太高会漏掉远处小船。verboseFalse是为了不让 YOLO 在控制台刷日志否则界面日志区会被淹没。返回的boxes是列表界面层拿到后直接画框和计数。3.2 可视化界面选型PyQt、Gradio 还是 Web 前端毕设和课程设计里界面方案常见三种PyQt5 桌面端、Gradio 快速网页、Flask 加 HTML 前端。如果只是演示Gradio 最快十几行代码就能出界面import gradio as gr import cv2 def process_image(img): boxes detect_frame(img) for b in boxes: x1, y1, x2, y2 map(int, b[bbox]) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.putText(img, f{b[class]} {b[score]:.2f}, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2) return img, len(boxes) demo gr.Interface(fnprocess_image, inputsgr.Image(), outputs[gr.Image(), gr.Number(label检测数量)]) demo.launch()如果要做成「渔船作业监控系统」那种带视频流、报警记录、统计图表的完整界面PyQt5 更合适因为可以嵌入 OpenCV 的 VideoCapture 做实时刷新。Web 方案适合需要远程访问的场景但视频流延迟和跨域问题会多花不少时间。选型原则只演示选 Gradio要交完整系统选 PyQt5要远程看选 Flask。3.3 视频流实时推理的帧率与线程处理实时监控不能一帧一帧同步推理否则界面会卡死。常见做法是开一个独立线程读视频帧主线程只负责显示推理线程用队列拿帧。核心结构import threading import queue import cv2 frame_queue queue.Queue(maxsize2) def capture_thread(source): cap cv2.VideoCapture(source) while True: ret, frame cap.read() if not ret: break if frame_queue.full(): frame_queue.get() frame_queue.put(frame) threading.Thread(targetcapture_thread, args(0,), daemonTrue).start()maxsize2是关键队列太大延迟会累积太小会丢帧。推理线程从队列取帧处理完把结果放到另一个队列给界面。这样即使推理慢界面也不会卡。GTX1660Ti 上 YOLOv8n 跑 640 尺寸单帧推理大概 10 到 15 毫秒加上预处理和后处理整体能到 30 FPS 左右够监控用。4. 部署环节的避坑与排查从环境到显存的 5 个真实翻车点4.1 现象训练时报 CUDA out of memory原因batch size 太大或者imgsz设太高6G 显存跑imgsz960加batch16基本必爆。解决先把 batch 降到 8还爆就降到 4同时把imgsz回到 640。如果显存实在小用yolov8n.pt而不是 s 或 m。另外训练前关掉其他占显存的程序浏览器开太多标签页也会吃显存。4.2 现象界面显示检测框位置偏移原因OpenCV 读出来的帧是 BGR而有些界面组件按 RGB 显示颜色反了不说如果做过 resize 但没同步缩放框坐标框就会偏。解决在推理前记录原始尺寸画框时按比例还原。如果只是颜色问题用cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)转一下。4.3 现象换一台机器就跑不起来原因依赖版本不一致尤其是 PyTorch 和 CUDA 版本。解决导出requirements.txt时固定版本号不要用torch2.0这种写法。部署教程里要写清楚先装 CUDA 对应的 PyTorch再装 ultralytics。如果目标机器没有 GPU用devicecpu也能跑但帧率会掉到个位数演示够用实时监控不够。4.4 现象视频流延迟越来越大原因读帧线程和推理线程速度不匹配队列积压。解决队列设maxsize2并且读帧线程在队列满时丢弃旧帧。另外不要在推理线程里做画框和保存图片这些放到显示线程做推理线程只出结果。4.5 现象模型把浪花识别成渔船原因训练集里负样本太少模型没见过「没有船的海面」。解决在数据集里加入 10% 到 20% 的纯海面、浪花、云层图片标注为空文件。这样模型学会区分「有目标」和「无目标」。如果已经训练完了提高conf阈值到 0.5 以上也能压一部分误检但根治要靠负样本。5. 让监控系统更实用从单帧检测到作业状态判断的进阶技巧单帧检测只能告诉你「画面里有船」但渔船作业监控真正想要的是「这条船在不在作业」。这一步需要在检测框基础上加简单逻辑。常见做法是对同一目标做多帧跟踪如果连续 N 帧检测框位置变化小于阈值判定为「停泊」如果检测框附近有拖网、浮标等辅助目标判定为「作业中」。跟踪可以用 ByteTrack 或简单的 IOU 匹配不用上太重的模型。另一个实用技巧是区域计数。在界面上画一个多边形区域只统计进入该区域的渔船数量避免远处船只干扰。代码上就是在检测结果里加一个点是否在多边形内的判断import cv2 import numpy as np def in_region(box, polygon): x1, y1, x2, y2 box cx, cy (x1 x2) / 2, (y1 y2) / 2 return cv2.pointPolygonTest(np.array(polygon, np.int32), (cx, cy), False) 0polygon是界面传进来的区域顶点列表pointPolygonTest返回正值表示在区域内。这个逻辑放在推理封装之后界面层之前改动量很小但演示效果提升明显。验证方法上我一般会准备三段视频一段白天近景、一段夜间或逆光、一段多船同时出现。分别跑一遍记录漏检和误检数量。如果夜间漏检严重说明训练集缺少低照度样本补数据比调参有用。最后说个习惯每次改完参数先把best.pt备份一份命名带上日期和 mAP不然跑了几轮之后根本分不清哪个权重是哪个。这套东西不难难的是耐心把数据标干净、把队列调稳。希望帮到你。本文还有配套的精品资源点击获取
返回列表