You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

YOLOv8自定义训练模型无检测结果问题求助

YOLOv8自定义门开闭检测无结果问题排查与解决

我用300张图片训练了YOLOv8模型检测实体门的开闭状态,但输入训练所用数据时完全没有检测结果,代码如下:

import os

from ultralytics import YOLO
import cv2


VIDEOS_DIR = os.path.join('.', 'videos')

video_path = os.path.join(VIDEOS_DIR, 'sample door.mp4')
video_path_out = '{}_out.mp4'.format(video_path)

cap = cv2.VideoCapture(video_path)
ret, frame = cap.read()
H, W, _ = frame.shape
out = cv2.VideoWriter(video_path_out, cv2.VideoWriter_fourcc(*'MP4V'), int(cap.get(cv2.CAP_PROP_FPS)), (W, H))

model_path = os.path.join('.', 'runs', 'detect', 'train', 'weights', 'last.pt')


model = YOLO(model_path)  # load a custom model


while ret:

    results = model(frame)[0]
    for result in results.boxes.data.tolist():
        x1, y1, x2, y2, score, class_id = result
        print(x1,y1,x2,y2)

        cv2.rectangle(frame, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 4)
        cv2.putText(frame, results.names[int(class_id)].upper(), (int(x1), int(y1 - 10)),
                    cv2.FONT_HERSHEY_SIMPLEX, 1.3, (0, 255, 0), 3, cv2.LINE_AA)

    out.write(frame)
    ret, frame = cap.read()

cap.release()
out.release()
cv2.destroyAllWindows()

从训练结果来看,模型的mAP50、mAP50-95等核心检测指标接近0,训练与验证的box loss下降幅度极小,说明模型几乎没有学到有效特征。以下是具体排查和解决方向:

一、训练环节优化

1. 核查数据集质量

  • 标注准确性:逐一检查300张图片的标注文件,确认标注框完整包围门体,且门开/关的类别标签对应无误,无漏标、错标情况。YOLO对标注精度要求较高,错误标注会直接导致模型学不到有效特征。
  • 数据多样性:确认数据集是否覆盖不同场景:不同光照(白天/夜晚、强光/弱光)、不同拍摄角度(正面/侧面/俯视)、不同门型(木门/铁门/玻璃门)、不同开闭程度(全开/半开/全关)。单一场景的数据会让模型泛化能力极差,甚至无法识别训练集样本。
  • 数据集划分:检查训练集与验证集的划分逻辑,避免验证集包含训练集未覆盖的场景,或划分比例失衡(比如验证集占比超过30%)。

2. 调整训练参数

  • 增加训练轮次:默认训练轮次可能不足以让模型收敛,尝试设置epochs=200或更高,让模型充分学习数据特征。
  • 调整学习率:默认学习率0.01可能过大,导致训练震荡,尝试将初始学习率调低至lr0=0.001,配合cos_lr=True使用余弦退火学习率,让模型平稳收敛。
  • 更换模型尺寸:如果使用的是YOLOv8n(nano),尝试换成YOLOv8s(small)模型,提升特征提取能力;若用了大模型(如YOLOv8x),则需检查是否过拟合,但当前无检测结果更可能是模型特征提取能力不足。
  • 更换推理权重:放弃使用last.pt,改用训练生成的best.pt权重,该权重是验证集指标最优的模型,比最后一轮的last.pt更适合推理。

二、推理代码优化

1. 降低置信度阈值

YOLOv8默认置信度阈值为0.25,若模型预测的置信度低于该值,结果会被过滤。尝试在推理时降低阈值:

results = model(frame, conf=0.1)[0]  # 调低阈值至0.1,查看是否有检测结果

若调整后能检测到目标,说明模型预测置信度低,需回到训练环节优化。

2. 统一图像预处理参数

确保推理时的图像尺寸与训练时一致,可手动指定:

results = model(frame, imgsz=640, conf=0.1)[0]  # 640为训练时默认尺寸,按需替换

也可尝试手动转换图像通道(OpenCV读取为BGR,YOLOv8默认用RGB):

frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
results = model(frame_rgb, conf=0.1)[0]

3. 增加结果调试输出

在循环前添加打印,确认是否有检测结果:

print(f"当前帧检测到目标数量:{len(results.boxes)}")

若输出为0,说明模型确实未检测到目标,需聚焦训练环节优化;若有数量但未画出框,检查坐标是否超出图像范围(比如x1/y1为负数,或x2/y2大于图像宽高)。

三、快速验证方法

用单张训练集图片直接测试,快速定位问题:

from ultralytics import YOLO
model = YOLO("runs/detect/train/weights/best.pt")
results = model("训练集图片路径.jpg", conf=0.1)
results[0].show()  # 直接显示检测结果

同时查看runs/detect/train目录下的results.csv,确认每一轮训练的mAP50、box_loss变化,若mAP50始终为0,说明数据集或标注存在严重问题。

内容的提问来源于stack exchange,提问作者Advika Jain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 22:24:55