当前位置:   article > 正文

YOLOv8修改输出文件夹位置,按日期生成文件夹,包含图片标签文本_修改yolov8检测结果路径

修改yolov8检测结果路径

一、前言

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

二、步骤

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

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

3、完整代码

  1. import os
  2. import shutil
  3. from datetime import datetime
  4. from pathlib import Path
  5. import warnings
  6. warnings.filterwarnings('ignore')
  7. from ultralytics import YOLO
  8. def get_next_folder(base_path):
  9. # 获取当前日期
  10. date_str = datetime.now().strftime('%Y%m%d')
  11. # 获取所有以当前日期开头的目录
  12. existing_folders = [f for f in os.listdir(base_path) if f.startswith(date_str)]
  13. # 提取编号并找到下一个编号
  14. if existing_folders:
  15. existing_numbers = [int(f[-4:]) for f in existing_folders]
  16. next_number = max(existing_numbers) + 1
  17. else:
  18. next_number = 1
  19. # 生成下一个目录名称
  20. next_folder_name = f"{date_str}{next_number:04d}"
  21. return next_folder_name
  22. def merge_label_files(labels_folder, output_file):
  23. # 打开输出文件,以追加模式
  24. with open(output_file, 'a') as out_file:
  25. # 遍历 labels 文件夹中的所有 .txt 文件
  26. for filename in os.listdir(labels_folder):
  27. if filename.endswith('.txt'):
  28. # 读取当前 .txt 文件的内容
  29. with open(os.path.join(labels_folder, filename), 'r') as label_file:
  30. content = label_file.read()
  31. # 将内容写入输出文件
  32. out_file.write(content)
  33. def save_yolov8_results(results_dir, base_save_path):
  34. # 基本路径
  35. base_path = Path(base_save_path)
  36. base_path.mkdir(exist_ok=True)
  37. # 获取下一个目录名称
  38. next_folder_name = get_next_folder(base_path)
  39. next_folder_path = base_path / next_folder_name
  40. # 创建新目录
  41. next_folder_path.mkdir()
  42. # 将labels文件夹移动到日期文件夹下
  43. labels_folder = results_dir / "labels"
  44. if labels_folder.exists():
  45. destination_labels_folder = next_folder_path / "labels"
  46. shutil.move(labels_folder, destination_labels_folder)
  47. # 创建子目录 "检测后图片"
  48. images_folder = next_folder_path / "检测后图片"
  49. images_folder.mkdir()
  50. # 将YOLOv8的结果移动到新目录中的子目录
  51. for item in os.listdir(results_dir):
  52. source = os.path.join(results_dir, item)
  53. destination = images_folder / item
  54. shutil.move(source, destination)
  55. # 合并 labels 文件夹中的所有 .txt 文件到一个新的 .txt 文件中
  56. output_file = next_folder_path / "merged_labels.txt"
  57. merge_label_files(destination_labels_folder, output_file)
  58. # 删除原始的exp文件夹
  59. shutil.rmtree(results_dir)
  60. print(f"Results saved to {next_folder_path}")
  61. if __name__ == '__main__':
  62. model = YOLO(
  63. r'E:\pytorch_project\yolov8-20240104\yolov8-main\runs\train\yolov8-paperdata\weights\best.pt') # 选择pt文件路径
  64. model.predict(
  65. source=r'E:\pytorch_project\yolov5-6.2\paper_data\images\test',
  66. imgsz=640,
  67. project='runs/detect',
  68. name='exp',
  69. save=True,
  70. save_txt=True,
  71. # visualize=True # visualize model features maps
  72. )
  73. # 保存YOLOv8检测结果到指定目录
  74. yolov8_results_dir = 'runs/detect/exp'
  75. base_save_path = r'E:\pytorch_project\yolov8-20240104\yolov8-main\results'
  76. 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"处进行修改。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/860379
推荐阅读
相关标签
  

闽ICP备14008679号