当前位置:   article > 正文

YOLOV8制作训练数据集,使用数据集进行训练模型,使用训练模型权重验证数据集(以数据集coco128为例)_yolov8使用自己权重训练,如何造作

yolov8使用自己权重训练,如何造作

Yolo系列的数据集格式一般是jpg或者是png格式,标签是txt文件

本次数据集制作以coco128为例,制作自己的小型数据集,作为训练学习使用

coco128数据集大家自行下载,或者自己手里的数据集都可以使用,仅作为示例为大家展示,对于自己的数据集修改相应示例中的名称即可

第一:初始数据集

      在yolo系列的根目录下创建Dataset文件夹,在Dataset文件夹中放入coco128数据集,在coco128文件夹下创建image文件夹将数据集的图片和标签文件全部放入image中

将数据集的图片和标签文件全部放入image中

第二:数据集分割

在dataset文件夹下创建process.py文件,用来将image中的图片和标签进行分割,process.py代码如下:(ps:process.py一定放在dataset文件夹下,不要放在image里)

  1. import os
  2. import random
  3. import shutil
  4. def split_dataset(data_dir,train_val_test_dir, train_ratio, val_ratio, test_ratio):
  5. # 创建目标文件夹
  6. train_dir = os.path.join(train_val_test_dir, 'train')
  7. val_dir = os.path.join(train_val_test_dir, 'val')
  8. test_dir = os.path.join(train_val_test_dir, 'test')
  9. os.makedirs(train_dir, exist_ok=True)
  10. os.makedirs(val_dir, exist_ok=True)
  11. os.makedirs(test_dir, exist_ok=True)
  12. # 获取数据集中的所有文件
  13. files = os.listdir(data_dir)
  14. # 过滤掉非图片文件
  15. image_files = [f for f in files if f.endswith('.jpg') or f.endswith('.png')]
  16. # 随机打乱文件列表
  17. random.shuffle(image_files)
  18. # 计算切分数据集的索引
  19. num_files = len(image_files)
  20. num_train = int(num_files * train_ratio)
  21. num_val = int(num_files * val_ratio)
  22. num_test = num_files - num_train - num_val
  23. # 分离训练集
  24. train_files = image_files[:num_train]
  25. for file in train_files:
  26. src_image_path = os.path.join(data_dir, file)
  27. src_label_path = os.path.join(data_dir, file.replace('.jpg', '.txt').replace('.png', '.txt'))
  28. dst_image_path = os.path.join(train_dir, file)
  29. dst_label_path = os.path.join(train_dir, file.replace('.jpg', '.txt').replace('.png', '.txt'))
  30. shutil.copy(src_image_path, dst_image_path)
  31. shutil.copy(src_label_path, dst_label_path)
  32. # 分离验证集
  33. val_files = image_files[num_train:num_train+num_val]
  34. for file in val_files:
  35. src_image_path = os.path.join(data_dir, file)
  36. src_label_path = os.path.join(data_dir, file.replace('.jpg', '.txt').replace('.png', '.txt'))
  37. dst_image_path = os.path.join(val_dir, file)
  38. dst_label_path = os.path.join(val_dir, file.replace('.jpg', '.txt').replace('.png', '.txt'))
  39. shutil.copy(src_image_path, dst_image_path)
  40. shutil.copy(src_label_path, dst_label_path)
  41. # 分离测试集
  42. test_files = image_files[num_train+num_val:]
  43. for file in test_files:
  44. src_image_path = os.path.join(data_dir, file)
  45. src_label_path = os.path.join(data_dir, file.replace('.jpg', '.txt').replace('.png', '.txt'))
  46. dst_image_path = os.path.join(test_dir, file)
  47. dst_label_path = os.path.join(test_dir, file.replace('.jpg', '.txt').replace('.png', '.txt'))
  48. shutil.copy(src_image_path, dst_image_path)
  49. shutil.copy(src_label_path, dst_label_path)
  50. print("数据集分离完成!")
  51. print(f"训练集数量:{len(train_files)}")
  52. print(f"验证集数量:{len(val_files)}")
  53. print(f"测试集数量:{len(test_files)}")
  54. def move_files(data_dir):
  55. # 创建目标文件夹
  56. images_dir = os.path.join(data_dir, 'images')
  57. labels_dir = os.path.join(data_dir, 'labels')
  58. os.makedirs(images_dir, exist_ok=True)
  59. os.makedirs(labels_dir, exist_ok=True)
  60. # 获取数据集中的所有文件
  61. files = os.listdir(data_dir)
  62. # 移动PNG文件到images文件夹
  63. png_files = [f for f in files if f.endswith('.png')]
  64. for file in png_files:
  65. src_path = os.path.join(data_dir, file)
  66. dst_path = os.path.join(images_dir, file)
  67. shutil.move(src_path, dst_path)
  68. # 移动TXT文件到labels文件夹
  69. txt_files = [f for f in files if f.endswith('.txt')]
  70. for file in txt_files:
  71. src_path = os.path.join(data_dir, file)
  72. dst_path = os.path.join(labels_dir, file)
  73. shutil.move(src_path, dst_path)
  74. print(f"{data_dir}文件移动完成!")
  75. print(f"总共移动了 {len(png_files)} 个PNG文件到images文件夹")
  76. print(f"总共移动了 {len(txt_files)} 个TXT文件到labels文件夹")
  77. # 设置数据集路径和切分比例
  78. data_dir = './coco128/images' # 图片和标签路径
  79. train_val_test_dir= './coco128' # 目标文件夹
  80. train_ratio = 0.7 # 训练集比例
  81. val_ratio = 0.2 # 验证集比例
  82. test_ratio = 0.1 # 测试集比例
  83. # 调用函数分离数据集
  84. split_dataset(data_dir, train_val_test_dir,train_ratio, val_ratio, test_ratio)
  85. # 调用函数移动文件
  86. move_files(os.path.join(train_val_test_dir, 'train'))
  87. move_files(os.path.join(train_val_test_dir, 'val'))
  88. move_files(os.path.join(train_val_test_dir, 'test'))

在代码中需要将几个部分按照自己数据路径进行相应的修改:

  1. # 设置数据集路径和切分比例
  2. data_dir = './coco128/images' # 图片和标签路径
  3. train_val_test_dir= './coco128' # 目标文件夹
  4. train_ratio = 0.7 # 训练集比例
  5. val_ratio = 0.2 # 验证集比例
  6. test_ratio = 0.1 # 测试集比例

图片和标签路径要是第一步数据集的初始化时的image路径,此时的coco128与process.py是同一相对路径下,这样直接用相对路径就可以

下面的分割比例大家可以自行设置

随机打乱文件看需求是否需要

# 随机打乱文件列表
random.shuffle(image_files)

第三:数据集分离完成

运行process.py之前可以先检查一下image文件中的图片和标签是否是一一对应,后即可运行process.py文件,运行成功后会生形成相应的train、test、val文件夹,并按张相应的比例分离好

第四:制作数据集的yaml文件

数据集的yaml文件最好一起放在你所有的数据集yaml文件,我的示例是放在dataset里边了

其中train、test、val是图片的位置

nc是数据集中分类的总数

names 中要写入数据集的各个标签对应的名字

  1. train: ./coco128/train/images
  2. val: ./coco128/val/images
  3. test: ./coco128/test/images
  4. # 类别数
  5. nc: 80
  6. # 类别名称
  7. names:
  8. 0: person
  9. 1: bicycle
  10. 2: car
  11. 3: motorcycle
  12. 4: airplane
  13. 5: bus
  14. 6: train
  15. 7: truck
  16. 8: boat
  17. 9: traffic light
  18. 10: fire hydrant
  19. 11: stop sign
  20. 12: parking meter
  21. 13: bench
  22. 14: bird
  23. 15: cat
  24. 16: dog
  25. 17: horse
  26. 18: sheep
  27. 19: cow
  28. 20: elephant
  29. 21: bear
  30. 22: zebra
  31. 23: giraffe
  32. 24: backpack
  33. 25: umbrella
  34. 26: handbag
  35. 27: tie
  36. 28: suitcase
  37. 29: frisbee
  38. 30: skis
  39. 31: snowboard
  40. 32: sports ball
  41. 33: kite
  42. 34: baseball bat
  43. 35: baseball glove
  44. 36: skateboard
  45. 37: surfboard
  46. 38: tennis racket
  47. 39: bottle
  48. 40: wine glass
  49. 41: cup
  50. 42: fork
  51. 43: knife
  52. 44: spoon
  53. 45: bowl
  54. 46: banana
  55. 47: apple
  56. 48: sandwich
  57. 49: orange
  58. 50: broccoli
  59. 51: carrot
  60. 52: hot dog
  61. 53: pizza
  62. 54: donut
  63. 55: cake
  64. 56: chair
  65. 57: couch
  66. 58: potted plant
  67. 59: bed
  68. 60: dining table
  69. 61: toilet
  70. 62: tv
  71. 63: laptop
  72. 64: mouse
  73. 65: remote
  74. 66: keyboard
  75. 67: cell phone
  76. 68: microwave
  77. 69: oven
  78. 70: toaster
  79. 71: sink
  80. 72: refrigerator
  81. 73: book
  82. 74: clock
  83. 75: vase
  84. 76: scissors
  85. 77: teddy bear
  86. 78: hair drier
  87. 79: toothbrush

第五:训练数据集

以yolov8为例,在train.py中,使用自己的数据集进行训练

需要修改相应位置的data

我将train.py文件做了小的调整,如下:

  1. def train(model,data,cfg=DEFAULT_CFG, use_python=False):
  2. """Train and optimize YOLO model given training data and device."""
  3. # model = cfg.model or 'yolov8n.pt'
  4. # data = cfg.data or 'coco128.yaml' # or yolo.ClassificationDataset("mnist")
  5. device = cfg.device if cfg.device is not None else ''
  6. args = dict(model=model, data=data, device=device)
  7. if use_python:
  8. from ultralytics import YOLO
  9. YOLO(model).train(**args)
  10. else:
  11. trainer = DetectionTrainer(overrides=args)
  12. trainer.train()
  13. if __name__ == '__main__':
  14. model='yolov8n.pt'
  15. # SAR数据集
  16. # data='D://CVproject/ultralytics-main/Dataset/SARdata.yaml'
  17. # coco128数据集
  18. data='D:/CVproject/ultralytics-main/datasets/new_COCO128.yaml'
  19. train(model,data)

加入了model和data传参的过程,便于后期的使用其余数据集

使用的权重参数是yolov8.pt,data是数据集的yaml文件,最好是使用绝对路径不容易出错

记得将train中的model和data注释掉

可以开始训练

训练后的结果会保存在run中的train文件夹中

第六:使用所训练模型,验证数据集

在run中训练的最后一次train文件夹下会保存weight,最好的权重和最后的权重

我们示例是使用last.pt

在val.py文件中:

要进行相应的修改,因为yolov8由bug,目前train文件和val文件不能同时运行,会出现报错。

  1. Traceback (most recent call last):
  2. File "C:/Users/aoqia/Desktop/ultralytics-main/ultralytics/yolo/v8/detect/val.py", line 292, in <module>
  3. val()
  4. File "C:/Users/aoqia/Desktop/ultralytics-main/ultralytics/yolo/v8/detect/val.py", line 287, in val
  5. validator = DetectionValidator(args=args)
  6. File "C:/Users/aoqia/Desktop/ultralytics-main/ultralytics/yolo/v8/detect/val.py", line 23, in __init__
  7. super().__init__(dataloader, save_dir, pbar, args, _callbacks)
  8. File "C:\Users\aoqia\Desktop\ultralytics-main\ultralytics\yolo\engine\validator.py", line 78, in __init__
  9. project = self.args.project or Path(SETTINGS['runs_dir']) / self.args.task
  10. AttributeError: 'dict' object has no attribute 'project'

需要对相应的文件做修改后,val可以运行,但是train就会出错,后期再训练train时需把相应的位置再改回来

修改之处如下三处(参考博主:http://t.csdnimg.cn/UUujx):

这里不再陈列

修改好相应位置后,运行val.py验证之后如下:

大功告成!!!!!

仅作为进门小白学习参考,如有不对的地方,感谢指正!!!

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

闽ICP备14008679号