当前位置:   article > 正文

YOLOv5_5.0训练自己的数据集_yolov5训练自己数据集

yolov5训练自己数据集

目录

第一步:下载YOLOv5代码,并配置环境,测试一下是否有无环境问题

第二步:数据集格式的转换与划分

第三步:修改配置文件,准备训练


第一步:下载YOLOv5代码,并配置环境,测试一下是否有无环境问题

yolov5_5.0源代码开源地址

1.源代码下载后右击选择PyCharm打开,等待一会,会弹出一个要你配置环境的对话框,关掉它,我们自己配置环境。

配置环境: 点击【文件】->【设置】->【Python解释器】,选择相应的环境【我的是:pytorch】

配置要有个一两分钟,等待一下

2.找到【detect.py】,右击运行,报错如下:

原因:没有放权重文件进去,下载地址:权重地址

解决方法:下载后放到项目文件中去。

3.再次运行【detect.py】结果:在D:\DeepLearning\projectone\yolov5-5.0\runs\detect\exp2中生成了预测的结果图片,但是没有预测框?????

 解决方法1:在53行添加如下代码:

cudnn.benchmark = True

添加后就是这样的:

然后再运行【detect.py】,结果如下,有了预测框,但是出现的问题就是检测速度变慢了,具体也不知道为啥,有懂得小伙伴可以留言呐!!

解决方法2:在【detect.py】,定位到32行,注释掉原来的代码,更改为

half = False

结果:预测框就出现了!!!!

经过以上测试,说明我们得环境是没有问题的,可以进行下一步啦。

---------------------------------------------------手动分割线---------------------------------------------------------------

第二步:数据集格式的转换与划分

参考博客:

(70条消息) 使用Yolov5训练自己制作的数据集,快速上手_佐咖的博客-CSDN博客_yolov5数据集格式

我使用的是Make Sense在线标注,还是挺方便的,不过要注意一次不要导入太多图片,因为是在线网页上的操作,要是误关了网页,就要重来了。。。使用很简单,这里不赘述。

标注完后得到一份压缩包:

解压后得到xml文件:

下面开始对标注的格式进行转换,并划分数据集,这里是VOC格式

1.首先创建VOC格式数据集文件格式:先对格式做个说明:这里是划分前的文件夹形式,自己按照如下格式创建好文件夹:(说明:dataset是我D盘下的一个文件夹,这里自己定,我没有把VOCdevkit数据集文件夹放到yolo项目根目录中

 在创建好文件夹后,将图片放入JPEGImages,将makesense导出的xml文件放入Annotations。

2.转换脚本:主要修改一下路径

  1. import xml.etree.ElementTree as ET
  2. import pickle
  3. import os
  4. from os import listdir, getcwd
  5. from os.path import join
  6. import random
  7. from shutil import copyfile
  8. classes = ["cat","dog","fox"] ## 这里要写好标签对应的类
  9. TRAIN_RATIO = 80 # 表示将数据集划分为训练集和验证集,按照2:8比例来的
  10. def clear_hidden_files(path):
  11. dir_list = os.listdir(path)
  12. for i in dir_list:
  13. abspath = os.path.join(os.path.abspath(path), i)
  14. if os.path.isfile(abspath):
  15. if i.startswith("._"):
  16. os.remove(abspath)
  17. else:
  18. clear_hidden_files(abspath)
  19. def convert(size, box):
  20. dw = 1. / size[0]
  21. dh = 1. / size[1]
  22. x = (box[0] + box[1]) / 2.0
  23. y = (box[2] + box[3]) / 2.0
  24. w = box[1] - box[0]
  25. h = box[3] - box[2]
  26. x = x * dw
  27. w = w * dw
  28. y = y * dh
  29. h = h * dh
  30. return (x, y, w, h)
  31. def convert_annotation(image_id):
  32. in_file = open('D:/DeepLearning/dataset/VOCdevkit/VOC2022/Annotations/%s.xml' % image_id)
  33. out_file = open('D:/DeepLearning/dataset/VOCdevkit/VOC2022/YOLOLabels/%s.txt' % image_id, 'w')
  34. tree = ET.parse(in_file)
  35. root = tree.getroot()
  36. size = root.find('size')
  37. w = int(size.find('width').text)
  38. h = int(size.find('height').text)
  39. for obj in root.iter('object'):
  40. difficult = obj.find('difficult').text
  41. cls = obj.find('name').text
  42. if cls not in classes or int(difficult) == 1:
  43. continue
  44. cls_id = classes.index(cls)
  45. xmlbox = obj.find('bndbox')
  46. b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),
  47. float(xmlbox.find('ymax').text))
  48. bb = convert((w, h), b)
  49. out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
  50. in_file.close()
  51. out_file.close()
  52. wd = os.getcwd()
  53. wd = os.getcwd()
  54. data_base_dir = os.path.join(wd, "D:/DeepLearning/dataset/VOCdevkit/")
  55. if not os.path.isdir(data_base_dir):
  56. os.mkdir(data_base_dir)
  57. work_sapce_dir = os.path.join(data_base_dir, "D:/DeepLearning/dataset/VOCdevkit/VOC2022/")
  58. if not os.path.isdir(work_sapce_dir):
  59. os.mkdir(work_sapce_dir)
  60. annotation_dir = os.path.join(work_sapce_dir, "D:/DeepLearning/dataset/VOCdevkit/VOC2022/Annotations/")
  61. if not os.path.isdir(annotation_dir):
  62. os.mkdir(annotation_dir)
  63. clear_hidden_files(annotation_dir)
  64. image_dir = os.path.join(work_sapce_dir, "D:/DeepLearning/dataset/VOCdevkit/VOC2022/JPEGImages/")
  65. if not os.path.isdir(image_dir):
  66. os.mkdir(image_dir)
  67. clear_hidden_files(image_dir)
  68. yolo_labels_dir = os.path.join(work_sapce_dir, "D:/DeepLearning/dataset/VOCdevkit/VOC2022/YOLOLabels/")
  69. if not os.path.isdir(yolo_labels_dir):
  70. os.mkdir(yolo_labels_dir)
  71. clear_hidden_files(yolo_labels_dir)
  72. yolov5_images_dir = os.path.join(data_base_dir, "images/")
  73. if not os.path.isdir(yolov5_images_dir):
  74. os.mkdir(yolov5_images_dir)
  75. clear_hidden_files(yolov5_images_dir)
  76. yolov5_labels_dir = os.path.join(data_base_dir, "labels/")
  77. if not os.path.isdir(yolov5_labels_dir):
  78. os.mkdir(yolov5_labels_dir)
  79. clear_hidden_files(yolov5_labels_dir)
  80. yolov5_images_train_dir = os.path.join(yolov5_images_dir, "train/")
  81. if not os.path.isdir(yolov5_images_train_dir):
  82. os.mkdir(yolov5_images_train_dir)
  83. clear_hidden_files(yolov5_images_train_dir)
  84. yolov5_images_test_dir = os.path.join(yolov5_images_dir, "val/")
  85. if not os.path.isdir(yolov5_images_test_dir):
  86. os.mkdir(yolov5_images_test_dir)
  87. clear_hidden_files(yolov5_images_test_dir)
  88. yolov5_labels_train_dir = os.path.join(yolov5_labels_dir, "train/")
  89. if not os.path.isdir(yolov5_labels_train_dir):
  90. os.mkdir(yolov5_labels_train_dir)
  91. clear_hidden_files(yolov5_labels_train_dir)
  92. yolov5_labels_test_dir = os.path.join(yolov5_labels_dir, "val/")
  93. if not os.path.isdir(yolov5_labels_test_dir):
  94. os.mkdir(yolov5_labels_test_dir)
  95. clear_hidden_files(yolov5_labels_test_dir)
  96. train_file = open(os.path.join(wd, "yolov5_train.txt"), 'w')
  97. test_file = open(os.path.join(wd, "yolov5_val.txt"), 'w')
  98. train_file.close()
  99. test_file.close()
  100. train_file = open(os.path.join(wd, "yolov5_train.txt"), 'a')
  101. test_file = open(os.path.join(wd, "yolov5_val.txt"), 'a')
  102. list_imgs = os.listdir(image_dir) # list image files
  103. prob = random.randint(1, 100)
  104. print("Probability: %d" % prob)
  105. for i in range(0, len(list_imgs)):
  106. path = os.path.join(image_dir, list_imgs[i])
  107. if os.path.isfile(path):
  108. image_path = image_dir + list_imgs[i]
  109. voc_path = list_imgs[i]
  110. (nameWithoutExtention, extention) = os.path.splitext(os.path.basename(image_path))
  111. (voc_nameWithoutExtention, voc_extention) = os.path.splitext(os.path.basename(voc_path))
  112. annotation_name = nameWithoutExtention + '.xml'
  113. annotation_path = os.path.join(annotation_dir, annotation_name)
  114. label_name = nameWithoutExtention + '.txt'
  115. label_path = os.path.join(yolo_labels_dir, label_name)
  116. prob = random.randint(1, 100)
  117. print("Probability: %d" % prob)
  118. if (prob < TRAIN_RATIO): # train dataset
  119. if os.path.exists(annotation_path):
  120. train_file.write(image_path + '\n')
  121. convert_annotation(nameWithoutExtention) # convert label
  122. copyfile(image_path, yolov5_images_train_dir + voc_path)
  123. copyfile(label_path, yolov5_labels_train_dir + label_name)
  124. else: # test dataset
  125. if os.path.exists(annotation_path):
  126. test_file.write(image_path + '\n')
  127. convert_annotation(nameWithoutExtention) # convert label
  128. copyfile(image_path, yolov5_images_test_dir + voc_path)
  129. copyfile(label_path, yolov5_labels_test_dir + label_name)
  130. train_file.close()
  131. test_file.close()

转换后结果:

1)在YOLOLabels中生成了txt格式的标注文件,完成了xml到txt格式的转换

2)在VOCdevkit下生成了两个文件夹Imageslabels,分别存放图片和txt格式的标注文件

Images下存放训练集和验证集图片,比例8:2,labels下存放训练集和验证集的标注文件,比例8:2,完成了训练集与验证集的划分

具体格式如下:

 第三步:修改配置文件,准备训练

1.在【data】中,复制coco.yaml,直接ctrl+c,然后ctrl+v,重命名为【my_obstacle.yaml】,名字可任意,然后保存在【data】下

修改【my_obstacle.yaml】文件内容,我这里的训练集验证集路径不在yolo根目录下,所以都是写的绝对路径。

2.在【models】文件夹下复制yolov5s.yaml,重命名为【yolov5s_obstacle.yaml】,名字可任意,然后保存在【models】下

修改类别为3

3.修改【train.py】

1)weights----模型权重在yolo项目根目录下

2)cfg----在pycharm左边目录栏,右击【yolov5s_obstacle.yaml】,复制路径,来自内容根的路径,粘贴即可

3)data----在pycharm左边目录栏,右击【my_obstacle.yaml】,复制路径,来自内容根的路径,粘贴即可

4)epochs----训练轮数,我这里是100轮

5)batch_size----根据电脑性能修改,我这里只能是1才能跑起来(我的显卡GTX1650)

6)workers----我一直用的是1,这里我不确定,可以自己尝试一下

 然后开始运行【train.py】

训练过程中输出的参数:刚好在训练时写这篇博客,贴个图吧

每次训练都要网上找个博客看步骤,这次索性自己写一个,记录一下

如有错误请指正!

2022.11.28补充:

今天在改网络结构,开始训练的时候会报错:

RuntimeError: result type Float can‘t be cast to the desired output type long int

解决方法参考:

(75条消息) 一步真实解决RuntimeError: result type Float can‘t be cast to the desired output type long int_蓝胖胖▸的博客-CSDN博客

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

闽ICP备14008679号