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
相关产品推荐
相关产品推荐

