当前位置:   article > 正文

yolo格式转换成coco格式_yolo数据转coco

yolo数据转coco
  1. # 说明:
  2. '''
  3. 1)military_object.names文件内容如下:
  4. label1
  5. label2
  6. label3
  7. 2)此训练针对矩形框的标注
  8. 3)代码中很多键值都是自己造的,因为训练用不到这些(比如mask的训练),仅仅只是为了跟coco格式保持一致
  9. '''
  10. import os
  11. import json
  12. import cv2
  13. import random
  14. import time
  15. # coco格式最后储存位置
  16. coco_format_save_path = '../datasets/military/annotations/instances_val_military.json'
  17. # 类别文件,一行一个类
  18. yolo_format_classes_path = '../datasets/military/annotations/military_object.names'
  19. # yolo格式的注释文件
  20. yolo_format_annotation_path = '../datasets/military/annotations/military_val_yolo.txt'
  21. # 根据自己的数据集写类别。举个例子:
  22. # categories_dict = [{'supercategory': 'None', 'id': 1, 'name': 'w3'},{'supercategory': 'None', 'id': 2, 'name': 'h3'}]
  23. # 我有类别文件,本着能用代码绝不手写的原则
  24. with open(yolo_format_classes_path,'r') as f1:
  25. lines1 = f1.readlines()
  26. categories = []
  27. for j,label in enumerate(lines1):
  28. label = label.strip()
  29. categories.append({'id':j+1,'name':label,'supercategory': 'None'})
  30. """========================================后文就正式开始了========================================="""
  31. write_json_context = dict()
  32. write_json_context['info'] = {'description': '', 'url': '', 'version': '', 'year': 2020, 'contributor': '', 'date_created': '2020-06-16 11:00:08.5'}
  33. write_json_context['licenses'] = [{'id': 1, 'name': None, 'url': None}]
  34. write_json_context['categories'] = categories
  35. write_json_context['images'] = []
  36. write_json_context['annotations'] = []
  37. # 前面都造好了基础(为了和coco一致,其实很多都用不到的),现在开始解析自己的数据
  38. with open(yolo_format_annotation_path,'r') as f2:
  39. lines2 = f2.readlines()
  40. # 第n个标注框计数,也就是annotations中的id
  41. num_bboxes = 0
  42. # 每一行就是一张图片的标注信息。
  43. # 其他格式也很好做,这个遍历就是图片文件路径,后面bboxes的遍历就是解析当前图片的标注信息
  44. # 如果xml或者json的,我的csdn中也有labelme标注的xml和json的解析代码(很久很久以前的代码,其实有更简洁的解析,但是我懒得写,哈哈)
  45. # 看懂我的代码,改起来不要太简单
  46. for i,line in enumerate(lines2):
  47. img_context = {}
  48. # 我的数据以空格分隔的,具体查看上面的截图
  49. line = line.split(' ')
  50. # 我在想:如果这张图没有任何标注,要不要保留呢,我选择保留负样本,当然你也可以打开下面这段代码舍弃
  51. # if len(line) < 2:
  52. # continue
  53. # 文件名最好不要有空格,这是一种习惯
  54. img_path = line[0].rstrip()
  55. img_name = os.path.basename(img_path)
  56. # 因为需要width和height,而我得yolo文件里没有,所以我还得读图片,很烦
  57. # 我就用opencv读取了,当然用其他库也可以
  58. # 别把图片路径搞错了,绝对路径和相对路径分清楚!
  59. height,width = cv2.imread(img_path).shape[:2]
  60. img_context['file_name'] = img_name
  61. img_context['height'] = height
  62. img_context['width'] = width
  63. img_context['date_captured'] = '2020-06-16 11:00:08.5'
  64. # 这么多id搞得我头都懵了,我猜这是第几张图序号吧,每行一张图,那当然就是第i张了
  65. img_context['id'] = i
  66. img_context['license'] = 1
  67. img_context['coco_url'] =''
  68. img_context['flickr_url'] = ''
  69. write_json_context['images'].append(img_context)
  70. # 这个地方如果有标注框继续,没有的话跳过,跟上面的区别在于是否将图片加入到images中
  71. # 如果images中有这张图但是没有标注信息,那就是负样本,反之亦然
  72. if len(line) < 2:
  73. continue
  74. for bbox in line[1:]:
  75. bbox_dict = {}
  76. xmin,ymin,xmax,ymax,class_id = bbox.strip().split(',')
  77. # 我就有时候int和str不注意各种报错
  78. xmin,ymin,xmax,ymax,class_id= float(xmin),float(ymin),float(xmax),float(ymax),int(class_id)
  79. bbox_dict['id'] = num_bboxes
  80. bbox_dict['image_id'] = i
  81. bbox_dict['category_id'] = class_id + 1
  82. bbox_dict['iscrowd'] = 0 # 前面有解释
  83. h,w = abs(ymax-ymin),abs(xmax-xmin)
  84. bbox_dict['area'] = h * w
  85. bbox_dict['bbox'] = [xmin,ymin,w,h]
  86. bbox_dict['segmentation'] = [[xmin,ymin,xmax,ymin,xmax,ymax,xmin,ymax]]
  87. write_json_context['annotations'].append(bbox_dict)
  88. num_bboxes+=1
  89. i+=1
  90. # 终于搞定了,保存!
  91. with open(coco_format_save_path,'w') as fw:
  92. json.dump(write_json_context,fw)

 

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

闽ICP备14008679号