基于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(sourceimg_path, conf0.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, orientindex)运行结果发现海胆类样本占比达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值有意义多了。