YOLOv8修改输出文件夹位置,按日期生成文件夹,包含图片标签文本

一、前言

YOLOv8默认输出到runs/detect目录下,有些小伙伴想要把结果输出到固定的文件夹中,并按照日期生成子文件夹,子文件夹中不仅包括检测后的图片,还包括检测后的标签文本。

二、步骤

1、在detect.py同目录文件夹下新建一个test.py文件

2、复制detect.py的内容,根据自己的detect.py的内容把下面代码中的if __name__ == '__main__':内容替换

3、完整代码

import os
import shutil
from datetime import datetime
from pathlib import Path
import warnings

warnings.filterwarnings('ignore')
from ultralytics import YOLO


def get_next_folder(base_path):
    # 获取当前日期
    date_str = datetime.now().strftime('%Y%m%d')

    # 获取所有以当前日期开头的目录
    existing_folders = [f for f in os.listdir(base_path) if f.startswith(date_str)]

    # 提取编号并找到下一个编号
    if existing_folders:
        existing_numbers = [int(f[-4:]) for f in existing_folders]
        next_number = max(existing_numbers) + 1
    else:
        next_number = 1

    # 生成下一个目录名称
    next_folder_name = f"{date_str}{next_number:04d}"

    return next_folder_name


def merge_label_files(labels_folder, output_file):
    # 打开输出文件,以追加模式
    with open(output_file, 'a') as out_file:
        # 遍历 labels 文件夹中的所有 .txt 文件
        for filename in os.listdir(labels_folder):
            if filename.endswith('.txt'):
                # 读取当前 .txt 文件的内容
                with open(os.path.join(labels_folder, filename), 'r') as label_file:
                    content = label_file.read()
                # 将内容写入输出文件
                out_file.write(content)


def save_yolov8_results(results_dir, base_save_path):
    # 基本路径
    base_path = Path(base_save_path)
    base_path.mkdir(exist_ok=True)

    # 获取下一个目录名称
    next_folder_name = get_next_folder(base_path)
    next_folder_path = base_path / next_folder_name

    # 创建新目录
    next_folder_path.mkdir()

    # 将labels文件夹移动到日期文件夹下
    labels_folder = results_dir / "labels"
    if labels_folder.exists():
        destination_labels_folder = next_folder_path / "labels"
        shutil.move(labels_folder, destination_labels_folder)

    # 创建子目录 "检测后图片"
    images_folder = next_folder_path / "检测后图片"
    images_folder.mkdir()

    # 将YOLOv8的结果移动到新目录中的子目录
    for item in os.listdir(results_dir):
        source = os.path.join(results_dir, item)
        destination = images_folder / item
        shutil.move(source, destination)

    # 合并 labels 文件夹中的所有 .txt 文件到一个新的 .txt 文件中
    output_file = next_folder_path / "merged_labels.txt"
    merge_label_files(destination_labels_folder, output_file)

    # 删除原始的exp文件夹
    shutil.rmtree(results_dir)

    print(f"Results saved to {next_folder_path}")


if __name__ == '__main__':
    model = YOLO(
        r'E:\pytorch_project\yolov8-20240104\yolov8-main\runs\train\yolov8-paperdata\weights\best.pt')  # 选择pt文件路径
    model.predict(
        source=r'E:\pytorch_project\yolov5-6.2\paper_data\images\test',
        imgsz=640,
        project='runs/detect',
        name='exp',
        save=True,
        save_txt=True,
        # visualize=True # visualize model features maps
    )

    # 保存YOLOv8检测结果到指定目录
    yolov8_results_dir = 'runs/detect/exp'
    base_save_path = r'E:\pytorch_project\yolov8-20240104\yolov8-main\results'
    save_yolov8_results(Path(yolov8_results_dir), base_save_path)

4、yolov8_results_dir为需要移动的目录,base_save_path为移动后需要保存的地址。使用代码前可以先了解这段代码的思想,这样才能准确使用。

三、代码思想

这段代码的思想是YOLOv8每次都会在runs/detect目录下生成exp文件夹,exp文件夹里是检测后的图片和标签,这样比较省事的方法就是每次生成exp文件夹后,把exp文件夹里的内容移动到新建的以日期为名的文件夹下,最后再删除exp文件夹,避免前一次检测生成的exp影响到下一次检测。

基于这个原理,检测前需要删除之前运行留下的exp文件夹,否则假设最新检测生成的文件夹是exp3,而你移动的内容却是exp,就不是当前检测的结果了。

了解这个思想之后,就可以灵活的修改代码,比如将这两处的exp修改成test,这样大概率就不会和你YOLOv8默认生成的文件夹重名了。

以此类推,如果你的YOLOv8默认生成的是predict文件夹,你就应该先把默认生成的predict文件夹删除,或者在红框处改成不冲突的其他名字。

四、效果展示

test.py运行后的结果如图所示,会生成一个result文件夹,下面子文件夹的命名规则是:前8位是日期,后四位按照运行次数从0001-9999.日期文件夹下面分别是检测后图片文件夹,以及lable文件夹,检测后图片文件夹的图片标题和label文件夹的文本标题相同。label文件夹是YOLOv8自己生成后移动过来的。标签文本生成的代码是save_txt=True。merged_labels.txt是一次检测后所有标签的集合,如果后续需要对检测数据进行统计,可以根据merged_labels.txt进行处理。

如果labels文件夹移动出现错误,可以根据代码思想,检查默认生成的labels文件夹是不是在runs/detect/exp(或者其他自己命名文件夹)/labels处,若不是则可以在labels_folder = results_dir / "labels"处进行修改。

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值