解决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()
关键改动说明
- 新增模型路径参数:通过
--model-path可以直接指定你的新模型文件(比如Roboflow训练后生成的best.pt),无需修改代码核心逻辑 - 替换硬编码模型:删除原固定的
yolov8s.pt,改为加载用户指定的新模型 - 可配置目标类别:将原代码中固定的
cellphone改为变量TARGET_CLASS,直接替换成你新训练的对象名称即可 - 避免缓存干扰:本地加载模型时,YOLOv8会优先读取指定路径的文件,不会自动调用旧缓存模型
使用方法
- 将新训练的模型文件(比如
best.pt)放到指定路径,或者运行时用参数指定:python your_script.py --model-path ./path/to/your/new_model.pt - 修改
TARGET_CLASS为你新模型对应的类别名称 - 运行代码即可使用新模型进行检测
内容的提问来源于stack exchange,提问作者Laboratório SPI Sul
相关产品推荐
相关产品推荐

