VOC数据集到RRPN所需数据格式转换脚本

- 日理万妓 2022-02-13 09:47 334阅读 0赞

1. 前言

在之前的文章中已经介绍了过了RRPN的原理,在给出的代码里面也写了相关数据转换的脚本,其实只需要理解了其内部所需数据的类型就可以按照自己的意愿将现有的数据集转换过去,而且该算法可以做到多类别检测,只是需要很小的修改就可以实现。

2. 转换脚本

  1. def get_PascalVOC_2007():
  2. DATASET_DIR = 'xxx/data/VOCdevkit2007' # VOC数据集路径
  3. img_dir = os.path.join(DATASET_DIR, 'VOC2007', 'JPEGImages')
  4. gt_dir = os.path.join(DATASET_DIR, 'VOC2007', 'Annotations')
  5. img_set = os.path.join(DATASET_DIR, 'VOC2007', 'ImageSets', 'Main', 'trainval.txt')
  6. num_classes = 5 # 分类的数目
  7. box_classes = ('__background__', 'class1', 'class2', 'class3', 'class4')
  8. box_classes_to_ind = dict(zip(box_classes, np.arange(num_classes)))
  9. im_infos = [] # 标注信息
  10. with open(img_set, 'r') as f:
  11. gt_file_list = f.readlines()
  12. print("buddy: all labeled image size: {}".format(len(gt_file_list)))
  13. # gt_file_list = gt_file_list[0:100]
  14. for index, gt_file in enumerate(gt_file_list):
  15. if index % 10000 == 0:
  16. print('buddy: load process-{}/{}'.format(index, len(gt_file_list)))
  17. gt_file = gt_file.strip('\n')
  18. gt_fobj = open(os.path.join(gt_dir, gt_file + '.xml'))
  19. tree = ET.parse(gt_fobj)
  20. objs = tree.findall('object') # 找到所有的标注框节点
  21. img_name = os.path.join(img_dir, gt_file + '.jpg')
  22. img = cv2.imread(img_name)
  23. len_of_bboxes = len(objs)
  24. gt_boxes = np.zeros((len_of_bboxes, 5), dtype=np.int16)
  25. gt_classes = np.zeros((len_of_bboxes), dtype=np.int32)
  26. overlaps = np.zeros((len_of_bboxes, num_classes), dtype=np.float32) # text or non-text
  27. seg_areas = np.zeros((len_of_bboxes), dtype=np.float32)
  28. # Load object bounding boxes into a data frame.
  29. for idx, obj in enumerate(objs):
  30. bbox = obj.find('bndbox')
  31. # Make pixel indexes 0-based
  32. x1 = float(bbox.find('xmin').text) - 1
  33. y1 = float(bbox.find('ymin').text) - 1
  34. x2 = float(bbox.find('xmax').text) - 1
  35. y2 = float(bbox.find('ymax').text) - 1
  36. cls = box_classes_to_ind[obj.find('name').text.lower().strip()]
  37. width = x2 - x1
  38. height = y2 - y1
  39. x_ctr = x1 + width/2
  40. y_ctr = y1 + height/2
  41. gt_boxes[idx, :] = [x_ctr, y_ctr, height, width, 0]
  42. gt_classes[idx] = cls
  43. overlaps[idx, cls] = 1.0
  44. seg_areas[idx] = (x2 - x1 + 1) * (y2 - y1 + 1)
  45. max_overlaps = overlaps.max(axis=1)
  46. # gt class that had the max overlap
  47. max_classes = overlaps.argmax(axis=1)
  48. im_info = {
  49. 'gt_classes': gt_classes,
  50. 'max_classes': max_classes,
  51. 'image': os.path.join(img_dir, gt_file + '.jpg'),
  52. 'boxes': gt_boxes,
  53. 'flipped': False,
  54. 'gt_overlaps': overlaps,
  55. 'seg_areas': seg_areas,
  56. 'height': img.shape[0],
  57. 'width': img.shape[1],
  58. 'max_overlaps': max_overlaps,
  59. 'rotated': True # 使用旋转增广数据
  60. }
  61. im_infos.append(im_info)
  62. return im_infos

发表评论

表情:
评论列表 (有 0 条评论,334人围观)

还没有评论,来说两句吧...

相关阅读

    相关 VOC数据格式介绍

    深度学习很多框架都在使用VOC数据集,所以先来研究一下voc数据集的具体内容。 以[PASCAL VOC2017][]为例,它包含如下5个文件夹: JPEGImage