You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

voc_to_yolo.py 5.3 kB

3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  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 = ['hava_mask','no_mask']
  9. TRAIN_RATIO =70
  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('VOCdevkit/VOC2007/Annotations/%s.xml' % image_id)
  33. out_file = open('VOCdevkit/VOC2007/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:
  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, "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, "VOC2007/")
  58. if not os.path.isdir(work_sapce_dir):
  59. os.mkdir(work_sapce_dir)
  60. annotation_dir = os.path.join(work_sapce_dir, "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, "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, "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, "yolov7_train.txt"), 'w')
  97. test_file = open(os.path.join(wd, "yolov7_val.txt"), 'w')
  98. train_file.close()
  99. test_file.close()
  100. train_file = open(os.path.join(wd, "yolov7_train.txt"), 'a')
  101. test_file = open(os.path.join(wd, "yolov7_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()

随着人工智能和大数据的发展,任一方面对自动化工具有着一定的需求,在当下疫情防控期间,使用mindspore来实现yolo模型来进行目标检测及语义分割,对视频或图片都可以进行口罩佩戴检测和行人社交距离检测,来对公共场所的疫情防控来实行自动化管理。