• YoloV8训练自己的模型 && Pycharm Remote Development


    参考视频:https://www.youtube.com/watch?v=m9fH9OWn8YM

    YOLO官方网站:GitHub - ultralytics/ultralytics: NEW - YOLOv8 🚀 in PyTorch > ONNX > OpenVINO > CoreML > TFLite

    在本地的pycharm上面建立一个项目

    使用scp把代码传递到远程服务器

    scp -r /Users/xxx/PycharmProjects/Yolov8-second/* xxx@xxx:/home/ps/Code/Python/YoloV8

    有个问题是:如果我们直接这样传过去,那我们这个地方是空的

     如果不是空的,我们直接给原来的删掉,这个时候,pycharm会自动提示让你添加一个python解释题,然后添加即可。

    如果不这样做的话,好多package都会报红

    使用romote development进行远程开发

    什么是远程开发?就是把远程服务器上面的项目,给直接拿到本地的pycharm上面进行开发,这样可以使用pycharm的debug等各种方便。

    输入一下服务器的账号密码,选中要远程开发的项目文件夹 

    安装Yolov8

    如果需要不修改Yolov8的源代码,直接pip install安装即可,参考官方网站安装即可

    在main.py中写入如下代码

    1. from ultralytics import YOLO
    2. # Create a new YOLO model from scratch
    3. # model = YOLO('yolov8n.yaml')
    4. # Load a pretrained YOLO model (recommended for training)
    5. model = YOLO('yolov8n.pt') # load a pretrained model (recommended for training)
    6. results = model.train(data="config.yaml", epochs=500) # train the model

    model = YOLO('yolov8n.pt')  # load a pretrained model (recommended for training)

    这个是我们直接使用一个yolo官方训练好的模型,在此基础上继续训练,这样效果会比较好

    results = model.train(data="config.yaml", epochs=500)  # train the model

     这个是用我们自己的config.yaml,里面有数据集,自己训练一个模型,这个模型,可以按照自己的想法,只识别指定的几种物体,用一定量的数据集

    1. path: /Users/roy/PycharmProjects/YoloV8/clean_data
    2. train: images/train
    3. val: images/val
    4. names:
    5. 0: Person
    6. 1: CoffeeCup
    7. 2: Book
    8. 3: ComputerMouse

    path必须使用绝对路径,train和val也必须使用我上面的格式,names也必须按照上面的格式,一个空格都不能错位,names就是我只识别这四个物体,这个地方的Person,CoffeeCup,Book,这些单词都是我们下载的数据集中的数据

    下载数据集

    先在项目根目录下面创建一个datasets文件夹,创建一个raw_data文件夹,然后再根目录下来再创建一个download_raw_dataset.py

    1. import fiftyone.zoo
    2. classes = ["Coffee cup", "Book", "Computer mouse", "Person"]
    3. for i in range(len(classes)):
    4. item = classes[i]
    5. print(item)
    6. dataset = fiftyone.zoo.load_zoo_dataset(
    7. "open-images-v7",
    8. splits=["train", "val", "test"],
    9. label_types=["detections"],
    10. classes=[item],
    11. max_samples=1000,
    12. dataset_dir="./datasets/raw_data",
    13. )
    14. for i in range(len(classes)):
    15. item = classes[i]
    16. print(item)
    17. dataset = fiftyone.zoo.load_zoo_dataset(
    18. "open-images-v7",
    19. splits=["val"],
    20. label_types=["detections"],
    21. classes=[item],
    22. max_samples=100,
    23. dataset_dir="./datasets/raw_data",
    24. )

    这是下载完成之后的数据集的结构

    _path结尾的变量,可以直接使用鼠标定位到文件夹的位置

    数据清洗

    在datasets文件下面,创建一个clean_data文件夹,里面存储清洗后,可以让Yolov8使用的数据

    detections.csv不是干净的数据,我们需要在创建一个clean.csv文件

    在根目录下面创建一个clean.py

    1. import csv
    2. from tqdm import tqdm
    3. import os
    4. # csv_file_path = os.path.join('.', 'datasets', 'raw_data', 'train', 'labels', 'detections.csv')
    5. csv_file_path = './datasets/raw_data/train/labels/detections.csv'
    6. # 图像文件夹路径
    7. # images_file_path = os.path.join('.', 'train', "data")
    8. images_file_path = './datasets/raw_data/train/data'
    9. images_name = os.listdir(images_file_path)
    10. images_name = [x.split(".")[0] for x in images_name]
    11. # 类别
    12. LabelName = ['/m/01g317', '/m/02p5f1q', '/m/0bt_c3', '/m/020lf']
    13. # 保存标注文件路径
    14. # data_annotation_csv = os.path.join('.', 'train', 'labels', 'clean.csv')
    15. data_annotation_csv_path = './datasets/raw_data/train/labels/clean.csv'
    16. with open(csv_file_path, 'r', encoding='utf-8') as f:
    17. with open(data_annotation_csv_path, "w", encoding='utf-8') as ff:
    18. csv_f = csv.reader(f)
    19. bar = tqdm(csv_f)
    20. for row in bar:
    21. if row[0] in images_name and row[2] in LabelName:
    22. for index in range(len(row)):
    23. ff.write(row[index])
    24. if (index != (len(row) - 1)):
    25. ff.write(",")
    26. ff.write("\n")

    现在clean.csv就是干净的数据,我们还需要再进行一步操作,创建Yolo需要的格式

    在根目录下面创建文件create_dataset_yolo_format.py

    1. import os
    2. import shutil
    3. DATA_OUT_DIR = os.path.abspath(os.path.join('datasets/clean_data'))
    4. for set_ in ['train', 'val', 'test']:
    5. for dir_ in [os.path.join(DATA_OUT_DIR, set_),
    6. os.path.join(DATA_OUT_DIR, set_, 'imgs'),
    7. os.path.join(DATA_OUT_DIR, set_, 'labels')]:
    8. if os.path.exists(dir_):
    9. shutil.rmtree(dir_)
    10. os.makedirs(dir_, exist_ok=True)
    11. LabelName = ['/m/01g317', '/m/02p5f1q', '/m/0bt_c3', '/m/020lf']
    12. # 使用enumerate函数创建键值对,键是元素,值是索引
    13. alpaca_id_dict = {alpaca_id: index for index, alpaca_id in enumerate(LabelName)}
    14. print(alpaca_id_dict)
    15. train_bboxes_filename = os.path.join('datasets/raw_data/train/labels', 'clean.csv')
    16. # validation_bboxes_filename = os.path.join('datasets/raw_data/validation/labels', 'clean.csv')
    17. # test_bboxes_filename = os.path.join('datasets/raw_data/test/labels', 'clean.csv')
    18. # for j, filename in enumerate([train_bboxes_filename, validation_bboxes_filename, test_bboxes_filename]):
    19. for j, filename in enumerate([train_bboxes_filename]):
    20. set_ = ['train', 'val', 'test'][j]
    21. print(filename)
    22. with open(filename, 'r') as f:
    23. line = f.readline()
    24. while len(line) != 0:
    25. id, _, class_name, _, x1, x2, y1, y2, _, _, _, _, _ = line.split(',')[:13]
    26. if class_name in LabelName:
    27. if not os.path.exists(os.path.join(DATA_OUT_DIR, set_, 'imgs', '{}.jpg'.format(id))):
    28. shutil.copy(os.path.join("datasets/raw_data", set_, "data", '{}.jpg'.format(id)),
    29. os.path.join(DATA_OUT_DIR, set_, 'imgs', '{}.jpg'.format(id)))
    30. with open(os.path.join(DATA_OUT_DIR, set_, 'labels', '{}.txt'.format(id)), 'a') as f_ann:
    31. # class_id, xc, yx, w, h
    32. x1, x2, y1, y2 = [float(j) for j in [x1, x2, y1, y2]]
    33. xc = (x1 + x2) / 2
    34. yc = (y1 + y2) / 2
    35. w = x2 - x1
    36. h = y2 - y1
    37. f_ann.write('{} {} {} {} {}\n'.format(alpaca_id_dict[class_name], xc, yc, w, h))
    38. print(alpaca_id_dict[class_name])
    39. f_ann.close()
    40. line = f.readline()

    执行之后,数据清洗工作就完成了

    下来就是开始训练了,执行main方法,训练500轮(epoch),然后模型会保存在根目录下面的runs

  • 相关阅读:
    JUC——CyclicBarrier
    统计学习、机器学习以及python的学习顺序是什么
    算法——哈希表篇
    聊透 GPU 通信技术——GPU Direct、NVLink、RDMA
    122 买卖股票的最佳时机||(状态机DP)(灵神笔记)
    讲解嵌入式软件中超时机制设计
    001计算机网络基础习题+答案+解析
    什么是Monkey,以及Monkey异常
    数据分箱(分层)的几种方法
    【实战】硅基物语.AI写作高手:从零开始用ChatGPT学会写作
  • 原文地址:https://blog.csdn.net/sunriseYJP/article/details/133575894