Yolov5中model.save()为每张检测图像创建独立文件夹的问题求助
解决Yolov5 results.save()生成子文件夹的问题
问题原因
你调用的results.save()方法内部使用了increment_path函数,默认会在指定的save_dir下生成递增子文件夹(如exp、exp1、exp2...),因为exist_ok参数默认是False,每次调用都会创建新的子目录。
解决方案
方案1:修改save()的exist_ok参数
直接在调用save()时传入exist_ok=True,这样increment_path就不会创建递增子文件夹,所有检测结果会直接保存到你指定的output_folder_path中:
import os import torch from PIL import ImageFile ImageFile.LOAD_TRUNCATED_IMAGES = True # Model model = torch.hub.load('ultralytics/yolov5', 'yolov5s') folderPath = r"C:\yolo\deneme\miniframes" imageFiles = [f for f in os.listdir(folderPath) if f.endswith(('.jpg', '.jpeg', '.png'))] output_folder_path = r"C:\yolo\deneme\detectedframes" os.makedirs(output_folder_path, exist_ok=True) # 提前创建输出目录 output_txt_path = os.path.join(output_folder_path, "results.txt") all_results = [] for frameNumber, image in enumerate(imageFiles): imagePath = os.path.join(folderPath, image) results = model(imagePath) # 添加exist_ok=True,避免生成递增子文件夹 results.save(save_dir=output_folder_path, exist_ok=True) df = results.pandas().xyxy[0] for i in df['name']: all_results.append((frameNumber, i)) # 写入检测结果文本 with open(output_txt_path, 'w') as f: for frameNumber, obj in all_results: f.write(f"Frame:{frameNumber} {obj}\n")
方案2:手动保存检测图像(更灵活)
如果需要完全控制保存路径和文件名,可以跳过results.save(),直接从results.imgs中提取检测后的图像数组,用OpenCV手动保存:
import os import torch import cv2 from PIL import ImageFile ImageFile.LOAD_TRUNCATED_IMAGES = True # Model model = torch.hub.load('ultralytics/yolov5', 'yolov5s') folderPath = r"C:\yolo\deneme\miniframes" imageFiles = [f for f in os.listdir(folderPath) if f.endswith(('.jpg', '.jpeg', '.png'))] output_folder_path = r"C:\yolo\deneme\detectedframes" os.makedirs(output_folder_path, exist_ok=True) output_txt_path = os.path.join(output_folder_path, "results.txt") all_results = [] for frameNumber, image in enumerate(imageFiles): imagePath = os.path.join(folderPath, image) results = model(imagePath) # 手动保存检测后的图像,完全自定义路径和文件名 for img in results.imgs: save_filename = f"detected_{image}" # 可自定义文件名规则 save_path = os.path.join(output_folder_path, save_filename) # Yolov5返回的img为BGR格式,直接兼容cv2.imwrite cv2.imwrite(save_path, img) df = results.pandas().xyxy[0] for i in df['name']: all_results.append((frameNumber, i)) # 写入检测结果文本 with open(output_txt_path, 'w') as f: for frameNumber, obj in all_results: f.write(f"Frame:{frameNumber} {obj}\n")
为什么ChatGPT的方案无效?
你使用的是torch.hub.load加载的Yolov5模型,其save()方法参数与Ultralytics YOLOv8的save()不同,并不支持save_img、img_name这类参数,因此该方案不适用。
内容的提问来源于stack exchange,提问作者Emre q
相关产品推荐
相关产品推荐

