当前位置:   article > 正文

yolov8-seg 训练自己的数据集(Linux)--详细步骤_ultralytics源码地址

ultralytics源码地址

1、源码地址:https://github.com/ultralytics/ultralytics​​​​​

2、环境准备:

         有直接能用的镜像:docker pull ultralytics/ultralytics:latest

          镜像拉下来就有源码

3、准备数据集(labelme标注)

  •         数据集结构:images为存放的原图,json文件夹下为labelme的标注文件,txt用来存放转化后的txt标注文件,spilt存放划分好,用来训练的的数据集

  •     将json转化为txt,运行labelme2txt.py,将最后一行的class_list,需改成自己的数据集类型        
    1. import json
    2. import os
    3. import glob
    4. import os.path as osp
    5. from shutil import copy, rmtree
    6. def mk_file(file_path: str):
    7. if os.path.exists(file_path):
    8. # 如果文件夹存在,则先删除原文件夹在重新创建
    9. rmtree(file_path)
    10. os.makedirs(file_path)
    11. def labelme2txt(jsonfilePath="", resultDirPath="", classList=["YiBiao", "ZhiZhen"]):
    12. """
    13. 此函数用来将labelme软件标注好的数据集转换为yolov5_7.0sege中使用的数据集
    14. :param jsonfilePath: labelme标注好的*.json文件所在文件夹
    15. :param resultDirPath: 转换好后的*.txt保存文件夹
    16. :param classList: 数据集中的类别标签
    17. :return:
    18. """
    19. # 0.创建保存转换结果的文件夹
    20. mk_file(resultDirPath)
    21. # 1.获取目录下所有的labelme标注好的Json文件,存入列表中
    22. jsonfileList = glob.glob(osp.join(jsonfilePath, "*.json"))
    23. #print(jsonfileList) # 打印文件夹下的文件名称
    24. # 2.遍历json文件,进行转换
    25. for jsonfile in jsonfileList:
    26. # 3. 打开json文件
    27. with open(jsonfile, "r") as f:
    28. file_in = json.load(f)
    29. # 4. 读取文件中记录的所有标注目标
    30. shapes = file_in["shapes"]
    31. # 5. 使用图像名称创建一个txt文件,用来保存数据
    32. with open(resultDirPath + "/" + jsonfile.split("/")[-1].replace(".json", ".txt"), "w") as file_handle:
    33. # 6. 遍历shapes中的每个目标的轮廓
    34. for shape in shapes:
    35. # 7.根据json中目标的类别标签,从classList中寻找类别的ID,然后写入txt文件中
    36. file_handle.writelines(str(classList.index(shape["label"])) + " ")
    37. # 8. 遍历shape轮廓中的每个点,每个点要进行图像尺寸的缩放,即x/width, y/height
    38. for point in shape["points"]:
    39. x = point[0]/file_in["imageWidth"] # mask轮廓中一点的X坐标
    40. y = point[1]/file_in["imageHeight"] # mask轮廓中一点的Y坐标
    41. file_handle.writelines(str(x) + " " + str(y) + " ") # 写入mask轮廓点
    42. # 9.每个物体一行数据,一个物体遍历完成后需要换行
    43. file_handle.writelines("\n")
    44. # 10.所有物体都遍历完,需要关闭文件
    45. file_handle.close()
    46. # 10.所有物体都遍历完,需要关闭文件
    47. f.close()
    48. print("运行完成")
    49. if __name__ == "__main__":
    50. jsonfilePath = "/workspace/dataset/json" # 要转换的json文件所在目录
    51. resultDirPath = "/workspace/dataset/txt" # 要生成的txt文件夹
    52. labelme2txt(jsonfilePath=jsonfilePath, resultDirPath=resultDirPath, classList=["people", "car"])
  •         划分数据集,运行split.py,修改 train_percent 调整数据集划分比例。
  1. # 将图片和标注数据按比例切分为 训练集和测试集
  2. import shutil
  3. import random
  4. import os
  5. import argparse
  6. from shutil import copy, rmtree
  7. # 检查文件夹是否存在
  8. def mk_file(file_path: str):
  9. if os.path.exists(file_path):
  10. # 如果文件夹存在,则先删除原文件夹在重新创建
  11. rmtree(file_path)
  12. os.makedirs(file_path)
  13. def main(image_dir, txt_dir, save_dir):
  14. # 创建文件夹
  15. mk_file(save_dir)
  16. images_dir = os.path.join(save_dir, 'images')
  17. labels_dir = os.path.join(save_dir, 'labels')
  18. img_train_path = os.path.join(images_dir, 'train')
  19. img_test_path = os.path.join(images_dir, 'test')
  20. img_val_path = os.path.join(images_dir, 'val')
  21. label_train_path = os.path.join(labels_dir, 'train')
  22. label_test_path = os.path.join(labels_dir, 'test')
  23. label_val_path = os.path.join(labels_dir, 'val')
  24. mk_file(images_dir);
  25. mk_file(labels_dir);
  26. mk_file(img_train_path);
  27. mk_file(img_test_path);
  28. mk_file(img_val_path);
  29. mk_file(label_train_path);
  30. mk_file(label_test_path);
  31. mk_file(label_val_path);
  32. # 数据集划分比例,训练集75%,验证集15%,测试集15%,按需修改
  33. train_percent = 0.8
  34. val_percent = 0.2
  35. test_percent = 0
  36. total_txt = os.listdir(txt_dir)
  37. num_txt = len(total_txt)
  38. list_all_txt = range(num_txt) # 范围 range(0, num)
  39. num_train = int(num_txt * train_percent)
  40. num_val = int(num_txt * val_percent)
  41. num_test = num_txt - num_train - num_val
  42. train = random.sample(list_all_txt, num_train)
  43. # 在全部数据集中取出train
  44. val_test = [i for i in list_all_txt if not i in train]
  45. # 再从val_test取出num_val个元素,val_test剩下的元素就是test
  46. val = random.sample(val_test, num_val)
  47. print("训练集数目:{}, 验证集数目:{},测试集数目:{}".format(len(train), len(val), len(val_test) - len(val)))
  48. for i in list_all_txt:
  49. name = total_txt[i][:-4]
  50. srcImage = os.path.join(image_dir, name + '.jpg')
  51. srcLabel = os.path.join(txt_dir, name + '.txt')
  52. if i in train:
  53. dst_train_Image = os.path.join(img_train_path, name + '.jpg')
  54. dst_train_Label = os.path.join(label_train_path, name + '.txt')
  55. shutil.copyfile(srcImage, dst_train_Image)
  56. shutil.copyfile(srcLabel, dst_train_Label)
  57. elif i in val:
  58. dst_val_Image = os.path.join(img_val_path, name + '.jpg')
  59. dst_val_Label = os.path.join(label_val_path, name + '.txt')
  60. shutil.copyfile(srcImage, dst_val_Image)
  61. shutil.copyfile(srcLabel, dst_val_Label)
  62. else:
  63. dst_test_Image = os.path.join(img_test_path, name + '.jpg')
  64. dst_test_Label = os.path.join(label_test_path, name + '.txt')
  65. shutil.copyfile(srcImage, dst_test_Image)
  66. shutil.copyfile(srcLabel, dst_test_Label)
  67. if __name__ == '__main__':
  68. """
  69. python split_datasets.py --image-dir my_datasets/color_rings/imgs --txt-dir my_datasets/color_rings/txts --save-dir my_datasets/color_rings/train_data
  70. """
  71. parser = argparse.ArgumentParser(description='split datasets to train,val,test params')
  72. parser.add_argument('--image-dir', type=str, default='/workspace/dataset/images', help='image path dir')
  73. parser.add_argument('--txt-dir', type=str, default='/workspace/dataset/txt', help='txt path dir')
  74. parser.add_argument('--save-dir', default='/workspace/dataset/split', type=str, help='save dir')
  75. args = parser.parse_args()
  76. image_dir = args.image_dir
  77. txt_dir = args.txt_dir
  78. save_dir = args.save_dir
  79. main(image_dir, txt_dir, save_dir)
  80. print("运行完成")

到这里数据集准备完成

4、修改源码的配置文件

  •         ultralytics\datasets\coco128-seg.yaml  

                将path和class修改为自己数据集,可以将coco128-seg.yaml  另存为自己项目的名字。

  1. path: /workspace/dataset/split # dataset root dir
  2. train: /workspace/dataset/split/images/train # train images (relative to 'path') 128 images
  3. val: /workspace/dataset/split/images/val # val images (relative to 'path') 128 images
  4. test: # test images (optional)
  5. names:
  6. 0: people
  7. 1: car
  •         ultralytics\models\v8\yolov8-seg.yaml  ,修改nc的值,我这里只有两个类别。

                

  •         ultralytics\yolo\cfg\default.yaml  ,修改配置文件,预训练权重的路径,训练次数等
  1. model: /workspace/ultralytics/models/v8/yolov8-seg.yaml # path to model file, i.e. yolov8n.pt, yolov8n.yaml
  2. data:  ultralytics\datasets\coco128-seg.yaml

5、 开始训练:ultralytics\yolo\v8\segment\train.py

6、预测:ultralytics\yolo\v8\segment\predict.py

        预测相关的参数测试也在ultralytics\yolo\cfg\default.yaml  里面,可以设置图片路径,置信度,保存预测结果等。

我不想修改default.py,就改了predict.py文件的源码。

         将model和source注释掉,修改成自己的权重文件和自己要预测的文件夹或图片的路径。

        加一行:cfg.mode='predict',预测的结果就保存在 ultralytics\yolo\cfg\default.yaml里面设置的project的路径/predict 下面,不加也不影响,运行完会提示保存路径的。

  1. def predict(cfg=DEFAULT_CFG, use_python=False):
  2. """Runs YOLO object detection on an image or video source."""
  3. #model = cfg.model or 'yolov8m-seg.pt'
  4. #source = cfg.source if cfg.source is not None else ROOT / 'assets' if (ROOT / 'assets').exists() \
  5. # else 'https://ultralytics.com/images/bus.jpg'
  6. model = "/workspace/runs/train/weights/best.pt"
  7. source = '/workspace/test/'
  8. args = dict(model=model, source=source)
  9. cfg.mode='predict'
  10. if use_python:
  11. from ultralytics import YOLO
  12. YOLO(model)(**args)
  13. else:
  14. predictor = SegmentationPredictor(overrides=args)
  15. predictor.predict_cli()

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

闽ICP备14008679号