当前位置:   article > 正文

YOLO V8训练自己的数据集并测试_yolov8测试集

yolov8测试集

目录

1 YOLOV8部署

2 标注软件labelme安装

3 将labelme转化为YOLOV8支持的数据格式

4 开始训练

5 利用训练结果进行测试


1 YOLOV8部署

        我的一篇博客已经提到,这里不再赘述:

YOLO V8语义分割模型部署-CSDN博客YOLO V8语义分割模型部署https://blog.csdn.net/qq_41694024/article/details/133983334

2 标注软件labelme安装

        我们采用一键安装的方式:

 pip install labelme

        这个对python版本有要求,python版本最好是3.8。如果不是那就再茶ungjiange虚拟环境吧。

        直接命令行输入labelme启动,可能会出现这个问题:

  1. (yo) liuhongwei@liuhongwei-Legion-Y9000P-IRX8H:~/Desktop/ultralytics/examples/YOLOv8-CPP-Inference/build$ labelme
  2. [INFO ] __init__:get_config:70 - Loading config file from: /home/liuhongwei/.labelmerc
  3. QObject::moveToThread: Current thread (0x564cffaed340) is not the object's thread (0x564d01248510).
  4. Cannot move to target thread (0x564cffaed340)
  5. qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "/home/liuhongwei/anaconda3/envs/yo/lib/python3.8/site-packages/cv2/qt/plugins" even though it was found.
  6. This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
  7. Available platform plugins are: xcb, eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, wayland-egl, wayland, wayland-xcomposite-egl, wayland-xcomposite-glx, webgl.

        这是QT版本太高了.....,降低QT版本:

pip install pyqt5==5.14.0

        再次启动labelme:

        可以用了。

        label使用就是打开一个含有图像的文件夹就可以,使用很简单,上过本科的一看界面就会,给大家展示一张标注结果:

3 将labelme转化为YOLOV8支持的数据格式

        先装依赖:

pip install pycocotools

        用我的脚本将labelme形式的标注文件转化为yolo格式的文件:

  1. '''
  2. Created on Oct 23, 2023
  3. @author: Liuhongwei
  4. '''
  5. import os
  6. import sys
  7. import argparse
  8. import shutil
  9. import math
  10. from collections import OrderedDict
  11. import json
  12. import cv2
  13. import PIL.Image
  14. from sklearn.model_selection import train_test_split
  15. from labelme import utils
  16. class Labelme2YOLO(object):
  17. def __init__(self, json_dir):
  18. self._json_dir = json_dir
  19. self._label_id_map = self._get_label_id_map(self._json_dir)
  20. def _make_train_val_dir(self):
  21. self._label_dir_path = os.path.join(self._json_dir,
  22. 'YOLODataset/labels/')
  23. self._image_dir_path = os.path.join(self._json_dir,
  24. 'YOLODataset/images/')
  25. for yolo_path in (os.path.join(self._label_dir_path + 'train/'),
  26. os.path.join(self._label_dir_path + 'val/'),
  27. os.path.join(self._image_dir_path + 'train/'),
  28. os.path.join(self._image_dir_path + 'val/')):
  29. if os.path.exists(yolo_path):
  30. shutil.rmtree(yolo_path)
  31. os.makedirs(yolo_path)
  32. def _get_label_id_map(self, json_dir):
  33. label_set = set()
  34. for file_name in os.listdir(json_dir):
  35. if file_name.endswith('json'):
  36. json_path = os.path.join(json_dir, file_name)
  37. data = json.load(open(json_path))
  38. for shape in data['shapes']:
  39. label_set.add(shape['label'])
  40. return OrderedDict([(label, label_id) \
  41. for label_id, label in enumerate(label_set)])
  42. def _train_test_split(self, folders, json_names, val_size):
  43. if len(folders) > 0 and 'train' in folders and 'val' in folders:
  44. train_folder = os.path.join(self._json_dir, 'train/')
  45. train_json_names = [train_sample_name + '.json' \
  46. for train_sample_name in os.listdir(train_folder) \
  47. if os.path.isdir(os.path.join(train_folder, train_sample_name))]
  48. val_folder = os.path.join(self._json_dir, 'val/')
  49. val_json_names = [val_sample_name + '.json' \
  50. for val_sample_name in os.listdir(val_folder) \
  51. if os.path.isdir(os.path.join(val_folder, val_sample_name))]
  52. return train_json_names, val_json_names
  53. train_idxs, val_idxs = train_test_split(range(len(json_names)),
  54. test_size=val_size)
  55. train_json_names = [json_names[train_idx] for train_idx in train_idxs]
  56. val_json_names = [json_names[val_idx] for val_idx in val_idxs]
  57. return train_json_names, val_json_names
  58. def convert(self, val_size):
  59. json_names = [file_name for file_name in os.listdir(self._json_dir) \
  60. if os.path.isfile(os.path.join(self._json_dir, file_name)) and \
  61. file_name.endswith('.json')]
  62. folders = [file_name for file_name in os.listdir(self._json_dir) \
  63. if os.path.isdir(os.path.join(self._json_dir, file_name))]
  64. train_json_names, val_json_names = self._train_test_split(folders, json_names, val_size)
  65. self._make_train_val_dir()
  66. # convert labelme object to yolo format object, and save them to files
  67. # also get image from labelme json file and save them under images folder
  68. for target_dir, json_names in zip(('train/', 'val/'),
  69. (train_json_names, val_json_names)):
  70. for json_name in json_names:
  71. json_path = os.path.join(self._json_dir, json_name)
  72. json_data = json.load(open(json_path))
  73. print('Converting %s for %s ...' % (json_name, target_dir.replace('/', '')))
  74. img_path = self._save_yolo_image(json_data,
  75. json_name,
  76. self._image_dir_path,
  77. target_dir)
  78. yolo_obj_list = self._get_yolo_object_list(json_data, img_path)
  79. self._save_yolo_label(json_name,
  80. self._label_dir_path,
  81. target_dir,
  82. yolo_obj_list)
  83. print('Generating dataset.yaml file ...')
  84. self._save_dataset_yaml()
  85. def convert_one(self, json_name):
  86. json_path = os.path.join(self._json_dir, json_name)
  87. json_data = json.load(open(json_path))
  88. print('Converting %s ...' % json_name)
  89. img_path = self._save_yolo_image(json_data, json_name,
  90. self._json_dir, '')
  91. yolo_obj_list = self._get_yolo_object_list(json_data, img_path)
  92. self._save_yolo_label(json_name, self._json_dir,
  93. '', yolo_obj_list)
  94. def _get_yolo_object_list(self, json_data, img_path):
  95. yolo_obj_list = []
  96. img_h, img_w, _ = cv2.imread(img_path).shape
  97. for shape in json_data['shapes']:
  98. # labelme circle shape is different from others
  99. # it only has 2 points, 1st is circle center, 2nd is drag end point
  100. if shape['shape_type'] == 'circle':
  101. yolo_obj = self._get_circle_shape_yolo_object(shape, img_h, img_w)
  102. else:
  103. yolo_obj = self._get_other_shape_yolo_object(shape, img_h, img_w)
  104. yolo_obj_list.append(yolo_obj)
  105. return yolo_obj_list
  106. def _get_circle_shape_yolo_object(self, shape, img_h, img_w):
  107. obj_center_x, obj_center_y = shape['points'][0]
  108. radius = math.sqrt((obj_center_x - shape['points'][1][0]) ** 2 +
  109. (obj_center_y - shape['points'][1][1]) ** 2)
  110. obj_w = 2 * radius
  111. obj_h = 2 * radius
  112. yolo_center_x= round(float(obj_center_x / img_w), 6)
  113. yolo_center_y = round(float(obj_center_y / img_h), 6)
  114. yolo_w = round(float(obj_w / img_w), 6)
  115. yolo_h = round(float(obj_h / img_h), 6)
  116. label_id = self._label_id_map[shape['label']]
  117. return label_id, yolo_center_x, yolo_center_y, yolo_w, yolo_h
  118. def _get_other_shape_yolo_object(self, shape, img_h, img_w):
  119. def __get_object_desc(obj_port_list):
  120. __get_dist = lambda int_list: max(int_list) - min(int_list)
  121. x_lists = [port[0] for port in obj_port_list]
  122. y_lists = [port[1] for port in obj_port_list]
  123. return min(x_lists), __get_dist(x_lists), min(y_lists), __get_dist(y_lists)
  124. obj_x_min, obj_w, obj_y_min, obj_h = __get_object_desc(shape['points'])
  125. yolo_center_x= round(float((obj_x_min + obj_w / 2.0) / img_w), 6)
  126. yolo_center_y = round(float((obj_y_min + obj_h / 2.0) / img_h), 6)
  127. yolo_w = round(float(obj_w / img_w), 6)
  128. yolo_h = round(float(obj_h / img_h), 6)
  129. label_id = self._label_id_map[shape['label']]
  130. return label_id, yolo_center_x, yolo_center_y, yolo_w, yolo_h
  131. def _save_yolo_label(self, json_name, label_dir_path, target_dir, yolo_obj_list):
  132. txt_path = os.path.join(label_dir_path,
  133. target_dir,
  134. json_name.replace('.json', '.txt'))
  135. with open(txt_path, 'w+') as f:
  136. for yolo_obj_idx, yolo_obj in enumerate(yolo_obj_list):
  137. yolo_obj_line = '%s %s %s %s %s\n' % yolo_obj \
  138. if yolo_obj_idx + 1 != len(yolo_obj_list) else \
  139. '%s %s %s %s %s' % yolo_obj
  140. f.write(yolo_obj_line)
  141. def _save_yolo_image(self, json_data, json_name, image_dir_path, target_dir):
  142. img_name = json_name.replace('.json', '.png')
  143. img_path = os.path.join(image_dir_path, target_dir,img_name)
  144. if not os.path.exists(img_path):
  145. img = utils.img_b64_to_arr(json_data['imageData'])
  146. PIL.Image.fromarray(img).save(img_path)
  147. return img_path
  148. def _save_dataset_yaml(self):
  149. yaml_path = os.path.join(self._json_dir, 'YOLODataset/', 'dataset.yaml')
  150. with open(yaml_path, 'w+') as yaml_file:
  151. yaml_file.write('train: %s\n' % \
  152. os.path.join(self._image_dir_path, 'train/'))
  153. yaml_file.write('val: %s\n\n' % \
  154. os.path.join(self._image_dir_path, 'val/'))
  155. yaml_file.write('nc: %i\n\n' % len(self._label_id_map))
  156. names_str = ''
  157. for label, _ in self._label_id_map.items():
  158. names_str += "'%s', " % label
  159. names_str = names_str.rstrip(', ')
  160. yaml_file.write('names: [%s]' % names_str)
  161. if __name__ == '__main__':
  162. parser = argparse.ArgumentParser()
  163. parser.add_argument('--json_dir',type=str,
  164. help='Please input the path of the labelme json files.')
  165. parser.add_argument('--val_size',type=float, nargs='?', default=None,
  166. help='Please input the validation dataset size, for example 0.1 ')
  167. parser.add_argument('--json_name',type=str, nargs='?', default=None,
  168. help='If you put json name, it would convert only one json file to YOLO.')
  169. args = parser.parse_args(sys.argv[1:])
  170. convertor = Labelme2YOLO(args.json_dir)
  171. if args.json_name is None:
  172. convertor.convert(val_size=args.val_size)
  173. else:
  174. convertor.convert_one(args.json_name)

        将标注文件全部放在labelmeannotation文件夹内:

        启动脚本,参数1为这个文件夹,参数2为val占数据集的比例,比如是0.1。命令如下:

 python 222.py --json_dir labelmeannotation/ --val_size 0.1

        开始转换ing:

        转化完毕:

        转化好的文件在labelmeannotation文件夹内。

        我们把这个文件拷贝到yolo的主目录下:

        新建一个文件default_copy.yaml,里面有几个部分注意修改。

  1. # Ultralytics YOLO 本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
    推荐阅读
    相关标签