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

解决YOLOv8无法切换新模型问题:重置并使用新数据集与参数

解决YOLOv8调用旧模型问题的代码方案

问题核心原因

你的代码里硬编码了旧模型路径(原代码固定加载yolov8s.pt),且忽略了YOLOv8的本地模型加载逻辑——只要指定正确的新模型文件路径,就能彻底替换旧模型,无需删除无关文件。

修改后的代码(适配新模型)

import cv2
import argparse
from ultralytics import YOLO

import supervision as sv
import numpy as np

# 可根据新需求调整检测区域
ZONE_POLYGON = np.array([
    [0, 0],
    [0.5, 0],
    [0.5, 1],
    [0, 1]
])

# 新模型的目标类别名称,替换成你训练的对象(比如"cat"、"bottle")
TARGET_CLASS = "new_object"

def parse_arguments() -> argparse.Namespace:
    parser = argparse.ArgumentParser(description="YOLOv8 实时检测(适配新模型)")
    parser.add_argument(
        "--webcam-resolution",
        default=[640, 480],
        nargs=2,
        type=int
    )
    # 添加模型路径参数,支持自定义指定新模型
    parser.add_argument(
        "--model-path",
        default="./runs/detect/train/weights/best.pt",  # 默认是Roboflow训练后生成的最佳模型路径
        type=str,
        help="新训练的YOLOv8模型文件路径"
    )
    args = parser.parse_args()
    return args

def main():
    args = parse_arguments()
    frame_width, frame_height = args.webcam_resolution
    
    cap = cv2.VideoCapture(0)
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, frame_width)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, frame_height)
    
    # 加载指定路径的新模型,彻底替换旧模型
    model = YOLO(args.model_path)
    
    box_annotator = sv.BoxAnnotator(
        thickness=2,
        text_thickness=2,
        text_scale=1
    )
    
    zone_polygon = (ZONE_POLYGON * np.array(args.webcam_resolution)).astype(int)
    zone = sv.PolygonZone(polygon=zone_polygon, frame_resolution_wh=tuple(args.webcam_resolution))
    zone_annotator = sv.PolygonZoneAnnotator(
        zone=zone, 
        color=sv.Color.red(),
        thickness=2,
        text_thickness=4,
        text_scale=2
    )
    
    while True:
        ret, frame = cap.read()
        if not ret:
            print("捕获帧失败")
            break
        
        # 用新模型推理,本地加载不会触发远程缓存
        result = model(frame, agnostic_nms=False)[0]
        detections = sv.Detections.from_yolov8(result)
        
        # 过滤新模型的目标类别
        labels = [
            f"{model.model.names.get(class_id, 'Unknown')} {confidence:0.2f}"
            for _, confidence, class_id, _, _ in detections
            if class_id in model.model.names and model.model.names[class_id] == TARGET_CLASS
        ]
        
        frame = box_annotator.annotate(
            scene=frame,
            detections=detections,
            labels=labels
        )
        
        zone.trigger(detections=detections)
        frame = zone_annotator.annotate(scene=frame)
        
        cv2.imshow("YOLOv8 新模型检测", frame)
        
        if cv2.waitKey(1) == 27:  # 按ESC退出
            break
    
    cap.release()
    cv2.destroyAllWindows()

if __name__ == "__main__":
    main()

关键改动说明

  1. 新增模型路径参数:通过--model-path可以直接指定你的新模型文件(比如Roboflow训练后生成的best.pt),无需修改代码核心逻辑
  2. 替换硬编码模型:删除原固定的yolov8s.pt,改为加载用户指定的新模型
  3. 可配置目标类别:将原代码中固定的cellphone改为变量TARGET_CLASS,直接替换成你新训练的对象名称即可
  4. 避免缓存干扰:本地加载模型时,YOLOv8会优先读取指定路径的文件,不会自动调用旧缓存模型

使用方法

  1. 将新训练的模型文件(比如best.pt)放到指定路径,或者运行时用参数指定:
    python your_script.py --model-path ./path/to/your/new_model.pt
    
  2. 修改TARGET_CLASS为你新模型对应的类别名称
  3. 运行代码即可使用新模型进行检测

内容的提问来源于stack exchange,提问作者Laboratório SPI Sul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 16:43:16