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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 00:40:19