基于YOLOv8的水下目标检测 实验使用URPC2021数据集。 该数据集包含:海参“holothurian”,海胆“echinus”,扇贝“scallop”和海星“starfish”等四类。 检测数据集包含YOLO txt格式。 图片数量如下: train(6468张) val(1617张) 项目采用yolov8s进行训练,使用pyqt5设计了界面,可直接检测。

水下环境的光线衰减和复杂背景让目标检测变得异常棘手。这次我们选用YOLOv8s模型搭配URPC2021数据集,针对海参、海胆、扇贝、海星四类生物构建检测系统。项目亮点在于训练完成后可以通过摄像头实时检测,先看段实战代码感受下检测流程:

from ultralytics import YOLO

def detect_objects(img_path):
    model = YOLO('best.pt')
    results = model.predict(source=img_path, conf=0.5)
    for result in results:
        boxes = result.boxes.xyxy
        classes = result.boxes.cls
        scores = result.boxes.conf
    return zip(boxes, classes, scores)

这段代码暴露了YOLOv8的三个实用特性:模型加载仅需一行、推理结果结构化输出、置信度阈值直接过滤无效检测。注意result.boxes对象封装了坐标、类别、置信度三个关键信息,比早期版本更符合工程直觉。

数据集处理阶段发现类别分布不均衡问题严重。通过下面这段统计脚本可以看到海胆样本占了半壁江山:

import pandas as pd
from collections import Counter

def count_labels(label_dir):
    class_counts = Counter()
    for label_file in Path(label_dir).glob('*.txt'):
        with open(label_file) as f:
            for line in f:
                class_id = int(line.strip().split()[0])
                class_counts[class_id] +=1
    return pd.DataFrame.from_dict(class_counts, orient='index')

运行结果发现海胆类样本占比达47%,于是我们在数据增强时特意为其他类别增加了旋转和色彩扰动,避免模型产生偏倚。

基于YOLOv8的水下目标检测 实验使用URPC2021数据集。 该数据集包含:海参“holothurian”,海胆“echinus”,扇贝“scallop”和海星“starfish”等四类。 检测数据集包含YOLO txt格式。 图片数量如下: train(6468张) val(1617张) 项目采用yolov8s进行训练,使用pyqt5设计了界面,可直接检测。

界面设计采用PyQt5实现,重点解决视频流处理问题。这里有个防止界面卡顿的小技巧——单独开线程处理视频帧:

class VideoThread(QThread):
    frame_signal = pyqtSignal(np.ndarray)

    def run(self):
        cap = cv2.VideoCapture(0)
        while True:
            ret, frame = cap.read()
            if ret:
                self.frame_signal.emit(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))

主界面中通过信号槽机制更新检测结果,避免GUI线程阻塞。检测框绘制部分需要注意坐标转换,YOLO返回的是归一化坐标而PyQt使用的是绝对像素坐标,这里需要做逆运算:

def draw_boxes(image, detections, img_width, img_height):
    for box, cls_id, conf in detections:
        x1 = int(box[0] * img_width)
        y1 = int(box[1] * img_height)
        x2 = int(box[2] * img_width)
        y2 = int(box[3] * img_height)
        cv2.rectangle(image, (x1,y1), (x2,y2), (0,255,0), 2)

实际测试时模型在浑浊水域的表现超出预期,但对密集小目标(如成堆的海胆)仍有漏检。后续计划引入动态标签分配策略改进小目标检测,毕竟海洋生物可不会乖乖排着队让我们检测。

整个项目跑下来最大的感触是:模型部署的最后一公里往往比训练更费周折。比如发现直接加载模型会导致界面启动缓慢,后来改成懒加载模式——只有点击检测按钮时才初始化模型,启动时间从6秒缩短到1秒以内。这些实战经验,可比单纯追求mAP值有意义多了。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐