使用YOLOv8模型检测游戏中小鱼类物体的技术求助
解决YOLOv8检测细小带阴影移动鱼类的问题(含切片预处理配合方案)
问题背景
刚入门AI图像识别,自己截游戏截图做数据集,用Roboflow标注、YOLOv8训练模型,但始终没法正确检测游戏里细小、带阴影且移动的鱼类。试过Roboflow的切片(tiling)操作,但不知道代码端怎么配合,求技术帮助。
现有配置
- 数据集:自行截取的游戏鱼类截图,已在Roboflow完成标注
- 训练环境:使用官方YOLOv8训练Colab笔记本
- 当前检测代码(原版本):
import cv2 from ultralytics import YOLO import supervision as sv import mss import numpy as np import pyautogui import time model = YOLO('best.pt') sct = mss.mss() monitor = sct.monitors[1] while True: screenshot = sct.grab(monitor) img = np.array(screenshot) # RGB (3 CHANNEL) img = cv2.cvtColor(img, cv2.COLOR_BGRA2RGB) results = model(img) for result in results: for bbox in result.boxes: if bbox.cls == 0: # "fish" x1, y1, x2, y2 = bbox.xyxy[0]
核心问题分析
细小目标本身特征量少,加上阴影干扰、运动模糊,YOLOv8默认逻辑很难捕捉足够特征;切片操作能放大细小目标,但训练与推理阶段的切片逻辑不统一,会导致模型无法正确识别。
解决方案
1. Roboflow端的预处理与增强配置
针对目标特性调整数据集处理逻辑:
- 预处理:
- 启用切片(Tiling):设置切片尺寸为640x640(和YOLOv8默认输入尺寸匹配),重叠率10%-20%,确保鱼类被完整包含在子图中
- 颜色增强:添加HSV通道转换或灰度化,强化鱼类与阴影、背景的区分度
- 降噪:启用高斯模糊/中值滤波,减少游戏画面的噪点干扰
- 数据增强:
- 运动模糊:添加随机运动模糊(角度0-10,模糊度5-15),模拟鱼类移动的动态效果
- 阴影适配:添加随机亮度/对比度调整、局部阴影覆盖,让模型适应不同阴影强度的目标
- 常规增强:随机翻转、缩放、平移,避免模型过拟合
2. 代码端配合切片的训练与推理
训练阶段
从Roboflow导出数据集时,选择YOLOv8格式,切片后的标注文件会自动适配子图坐标,直接用原Colab笔记本流程训练即可,无需额外修改训练代码。
推理阶段(检测代码优化)
必须和训练时的切片逻辑对齐,直接用YOLOv8内置的tile参数自动处理切片推理,修改后的代码如下:
import cv2 from ultralytics import YOLO import supervision as sv import mss import numpy as np import pyautogui import time model = YOLO('best.pt') sct = mss.mss() monitor = sct.monitors[1] while True: screenshot = sct.grab(monitor) img = np.array(screenshot) img = cv2.cvtColor(img, cv2.COLOR_BGRA2RGB) # 启用内置切片推理,参数和Roboflow设置的切片尺寸、重叠率一致 results = model(img, tile=True, tile_size=640, overlap_ratio=0.2) # 用supervision简化检测结果处理,避免手动遍历出错 detections = sv.Detections.from_yolov8(results[0]) # 筛选鱼类类别(cls=0) fish_detections = detections[detections.class_id == 0] # 可选:可视化检测框,方便调试 box_annotator = sv.BoxAnnotator() annotated_img = box_annotator.annotate(scene=img.copy(), detections=fish_detections) cv2.imshow("Fish Detection", annotated_img) # 处理检测到的鱼类bbox for x1, y1, x2, y2 in fish_detections.xyxy: # 这里添加你的业务逻辑,比如自动点击 # pyautogui.click((x1+x2)/2, (y1+y2)/2) # 按q退出循环 if cv2.waitKey(1) & 0xFF == ord('q'): break cv2.destroyAllWindows()
额外优化建议
- 模型选型:优先用YOLOv8n或YOLOv8s小模型,小模型对小目标响应更快;还可以修改
hyp.yaml,增大obj损失权重,让模型更关注小目标 - 标注检查:确保Roboflow里的标注框完整包裹鱼类(包括阴影部分),不要只框主体
- 数据集扩充:多收集不同光照、姿态、阴影强度的鱼类样本,提升模型泛化能力
内容的提问来源于stack exchange,提问作者zafer
相关产品推荐
相关产品推荐

