非法捕捞监控:基于YOLOv8的渔船禁渔期作业识别系统与UI界面设计

1. 项目背景

非法捕捞问题严重威胁海洋生态环境和渔业资源的可持续发展。尤其是禁渔期内的非法作业,直接破坏了鱼类的繁殖周期,导致资源枯竭。传统的人工巡查效率低、范围有限,难以满足现代海洋监控需求。

借助人工智能和计算机视觉技术,基于无人机、卫星或岸基摄像头的渔船作业自动识别成为趋势。本文介绍如何基于YOLOv8深度学习目标检测框架,实现对渔船禁渔期非法作业的自动检测,结合实时摄像头数据和友好UI界面,助力海洋监管部门提升执法效率。


2. 任务分析与问题定义

2.1 目标定义

  • 识别海域中所有渔船目标
  • 判定渔船是否处于禁渔期作业状态(结合时间、区域信息辅助判断)
  • 自动标注并报警提示非法捕捞行为

2.2 面临的挑战

  • 渔船形态多样,遮挡严重,海面反光复杂。
  • 视频监控光照、天气变化大,影响检测准确率。
  • 禁渔期判定需要结合时间和位置的辅助逻辑。
  • 需要实时检测与友好交互界面,适合现场执法人员使用。

3. 数据集介绍及准备

3.1 公开渔船检测数据集

  • DOTA (Dataset for Object Detection in Aerial Images)
    包含大量空中拍摄的船只标注,适合渔船检测任务。
    DOTA数据集主页
  • SeaShips Dataset
    专注海上船只检测,有多类船只标注,分辨率适中,适合模型训练。
    SeaShips GitHub
  • xView Dataset
    包含多种海上目标,包括船只,分辨率高,适用于船只检测。
    xView官网

3.2 数据集构建与标注

  • 若有无人机或卫星视频,可结合LabelImg工具手动标注渔船位置。
  • 需额外准备禁渔期作业的时间、区域规则数据,用于后期判断。
  • 标注格式统一为YOLO格式,方便模型训练。

4. YOLOv8模型介绍

YOLOv8是目前Ultralytics发布的最新YOLO系列模型,结构更优,性能更高。优势包括:

  • 轻量且高效,适合实时检测需求。
  • 训练流程简单,支持自定义数据集快速迁移训练。
  • 集成推理与训练API,代码简洁。

5. 数据标注与预处理

  • 使用LabelImg标注所有渔船目标。
  • 生成YOLO格式标注文件,类别只需一个“渔船”。
  • 进行图像增强,包含随机裁剪、旋转、亮度变化,提升模型鲁棒性。

6. 模型训练流程详解

6.1 环境准备

bash
复制编辑
pip install ultralytics opencv-python PyQt5

6.2 数据目录结构示例

bash
复制编辑
/datasets/fishing_boats
    /images
        /train
        /val
    /labels
        /train
        /val

6.3 数据配置文件 fishing_boats.yaml

yaml
复制编辑
train: /datasets/fishing_boats/images/train
val: /datasets/fishing_boats/images/val

nc: 1
names: ['fishing_boat']

6.4 训练示例代码

python
复制编辑
from ultralytics import YOLO

model = YOLO('yolov8n.pt')

model.train(data='fishing_boats.yaml', epochs=80, imgsz=640, batch=16, device=0)

7. 模型评估与优化策略

  • 使用mAP指标(0.5和0.5:0.95)衡量检测效果。
  • 采用混合精度训练加速。
  • 针对误检和漏检增加负样本训练。
  • 可结合时间区域信息,利用后处理减少误报。

8. 实时渔船作业监控系统架构设计

  • 视频采集模块:摄像头或无人机实时视频输入。
  • 检测模块:YOLOv8模型推理。
  • 禁渔期判断模块:结合时间戳与GPS位置辅助判断。
  • UI展示模块:实时显示视频、检测框和违规报警。
  • 报警模块:声音或消息提醒。

9. 基于YOLOv8的渔船非法作业检测代码实现

python
复制编辑
import cv2
from ultralytics import YOLO
import datetime

# 加载模型
model = YOLO('runs/train/weights/best.pt')

# 设定禁渔期(示例:5月至8月)
def is_closed_season():
    month = datetime.datetime.now().month
    return 5 <= month <= 8

# 模拟位置判断(实际项目结合GPS信息)
def is_in_protected_area():
    # 这里假设全部海域均保护,可根据GPS坐标改写
    return True

cap = cv2.VideoCapture(0)

while True:
    ret, frame = cap.read()
    if not ret:
        break

    results = model(frame)
    annotated_frame = results[0].plot()

    # 判断是否检测到渔船
    classes = [int(box.cls) for box in results[0].boxes]

    # 简单非法作业判断逻辑
    if len(classes) > 0 and is_closed_season() and is_in_protected_area():
        cv2.putText(annotated_frame, 'Illegal fishing detected!', (30, 60),
                    cv2.FONT_HERSHEY_SIMPLEX, 1.5, (0, 0, 255), 3)
        # 此处可加入报警功能,如播放声音、发短信等

    cv2.imshow("Fishing Boat Illegal Operation Detection", annotated_frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

10. UI界面设计与集成

基于PyQt5实现的简易UI:

python
复制编辑
from PyQt5 import QtWidgets, QtGui, QtCore
import sys
import cv2
from ultralytics import YOLO
import datetime

class IllegalFishingApp(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("渔船禁渔期非法作业监控系统")
        self.resize(900, 700)

        self.video_label = QtWidgets.QLabel(self)
        self.video_label.resize(800, 600)

        self.status_label = QtWidgets.QLabel("状态:等待检测", self)

        layout = QtWidgets.QVBoxLayout()
        layout.addWidget(self.video_label)
        layout.addWidget(self.status_label)
        self.setLayout(layout)

        self.model = YOLO('runs/train/weights/best.pt')
        self.cap = cv2.VideoCapture(0)

        self.timer = QtCore.QTimer()
        self.timer.timeout.connect(self.detect_frame)
        self.timer.start(30)

    def is_closed_season(self):
        month = datetime.datetime.now().month
        return 5 <= month <= 8

    def is_in_protected_area(self):
        return True  # 可扩展为基于GPS的区域判断

    def detect_frame(self):
        ret, frame = self.cap.read()
        if not ret:
            return

        results = self.model(frame)
        annotated_frame = results[0].plot()

        classes = [int(box.cls) for box in results[0].boxes]

        if len(classes) > 0 and self.is_closed_season() and self.is_in_protected_area():
            self.status_label.setText("状态:检测到非法捕捞行为!")
            cv2.putText(annotated_frame, 'Illegal fishing detected!', (30, 60),
                        cv2.FONT_HERSHEY_SIMPLEX, 1.5, (0, 0, 255), 3)
        else:
            self.status_label.setText("状态:无异常")

        rgb_image = cv2.cvtColor(annotated_frame, cv2.COLOR_BGR2RGB)
        h, w, ch = rgb_image.shape
        bytes_per_line = ch * w
        qt_image = QtGui.QImage(rgb_image.data, w, h, bytes_per_line, QtGui.QImage.Format_RGB888)
        pixmap = QtGui.QPixmap.fromImage(qt_image)
        self.video_label.setPixmap(pixmap)

    def closeEvent(self, event):
        self.cap.release()
        event.accept()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YOLO实战营

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值