当前位置:   article > 正文

yolov5制作数据集(实测)_yolov5数据集制作

yolov5数据集制作

最近在克隆yolov5的时候,简单的做了一下数据集,在此总结一下自己的制作过程,还有一些小的技巧。

我用的是制作yolo标签常用的工具labelimg,labelimg具体怎么安装,在此省写,可以在csdn搜索相关的博客下载,本文是在大家已经具备labelimg下进行演示。

首先,大家可以打开anaconda prompt,输进去activate labelimg,接着输进去labelimg,打开labelimg,进行图像标注,下面图片展示。

​ 

然后建立一个文件夹mydatas,里面设置四个小的文件夹,如图所示

 在images和JPEGImages中存放相同的照片,打开刚刚打开的labelimg软件,进行如下操作。 

 ps:labelimg打标签的时候,要设置voc格式,还有一些小的快捷键,键盘的w是画框,a是上一张,d是下一张,工具栏中view中的第一个记得勾上,可以自动保存图,我给演示一个打标签的图片,如图所示,标签尽量用英文,我再看其他人的博客时候,用中文标注的时候,最后预测框,可能会出现乱码,还是最好用英文标注一下。

 但是有的时候,可能觉得自己的图片有点少,我们可以继续图像增强操作,下面给大家附上一个百度网盘,是别人制作的,里面有说明,操作比较简单,不懂的可以来问我。http://链接:https://pan.baidu.com/s/1drtkGYXFDynL1-hQPz6Uhw 提取码:05za

还有一个小小的技巧就是,有的时候图片名字比较乱,我给大家推荐一个好压软件,可批量进行图片重新命名的操作,如图所示

​ 

 打标签做好之后,把创建的mydatas文件夹复制到yolov5的目录中去,我用的是pycharm打开的。

 下面进行的是,划分训练集集,测试集,代码如下,这一部分基本不用修改,运行即可。

  1. import os
  2. import random
  3. trainval_percent = 1
  4. train_percent = 0.9
  5. xmlfilepath = 'mydatas/Annotations'
  6. txtsavepath = 'mydatas/ImageSets'
  7. total_xml = os.listdir(xmlfilepath)
  8. num = len(total_xml)
  9. list = range(num)
  10. tv = int(num * trainval_percent)
  11. tr = int(tv * train_percent)
  12. trainval = random.sample(list, tv)
  13. train = random.sample(trainval, tr)
  14. ftrainval = open('mydatas/ImageSets/trainval.txt', 'w')
  15. ftest = open('mydatas/ImageSets/test.txt', 'w')
  16. ftrain = open('mydatas/ImageSets/train.txt', 'w')
  17. fval = open('mydatas/ImageSets/val.txt', 'w')
  18. for i in list:
  19. name = total_xml[i][:-4] + '\n'
  20. if i in trainval:
  21. ftrainval.write(name)
  22. if i in train:
  23. ftrain.write(name)
  24. else:
  25. fval.write(name)
  26. else:
  27. ftest.write(name)
  28. ftrainval.close()
  29. ftrain.close()
  30. fval.close()
  31. ftest.close()

 在annotations下出现四个文本,

 下一步,创建一个py,把标记的labels转换成txt文件,代码如下

  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. sets = ['train', 'test', 'val']
  7. classes = ['boltl', 'gear', 'nut', 'shaft']
  8. def convert(size, box):
  9. dw = 1. / size[0]
  10. dh = 1. / size[1]
  11. x = (box[0] + box[1]) / 2.0
  12. y = (box[2] + box[3]) / 2.0
  13. w = box[1] - box[0]
  14. h = box[3] - box[2]
  15. x = x * dw
  16. w = w * dw
  17. y = y * dh
  18. h = h * dh
  19. return (x, y, w, h)
  20. def convert_annotation(image_id):
  21. in_file = open('mydatas/Annotations/%s.xml' % (image_id),encoding='utf-8')
  22. out_file = open('mydatas/labels/%s.txt' % (image_id), 'w',encoding='utf-8')
  23. tree = ET.parse(in_file)
  24. root = tree.getroot()
  25. size = root.find('size')
  26. w = int(size.find('width').text)
  27. h = int(size.find('height').text)
  28. for obj in root.iter('object'):
  29. difficult = obj.find('difficult').text
  30. cls = obj.find('name').text
  31. if cls not in classes or int(difficult) == 1:
  32. continue
  33. cls_id = classes.index(cls)
  34. xmlbox = obj.find('bndbox')
  35. b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),
  36. float(xmlbox.find('ymax').text))
  37. bb = convert((w, h), b)
  38. out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
  39. wd = getcwd()
  40. print(wd)
  41. for image_set in sets:
  42. if not os.path.exists('mydatas/labels/'):
  43. os.makedirs('mydatas/labels/')
  44. image_ids = open('mydatas/ImageSets/%s.txt' % (image_set)).read().strip().split()
  45. list_file = open('mydatas/%s.txt' % (image_set), 'w')
  46. for image_id in image_ids:
  47. list_file.write('mydatas/images/%s.jpg\n' % (image_id))
  48. convert_annotation(image_id)
  49. list_file.close()

值得要注意的是,这个代码中要修改几个地方,就是你自己打标签的名字,换成你自己的就可以了。

 到此为止,数据集制作完成。

下面我给大家一个yaml文件,代码如下,

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