赞
踩
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"处进行修改。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。