当前位置:   article > 正文

yolo格式数据转换为coco格式_coco数据集转yolo

coco数据集转yolo

参考文章:https://blog.csdn.net/qq_26074263/article/details/86626833

将参考博客中的代码进行了补全,现在只需要有图片和yolo格式的标签就可以转换为coco格式的标签

第一步:将yolo格式的标签:classId, xCenter, yCenter, w, h转换为coco格式:classId, xMin, yMim, xMax, yMax格式。coco的id编号从1开始计算,所以这里classId应该从1开始计算。最终annos.txt中每行为imageName, classId, xMin, yMim, xMax, yMax, 一个bbox对应一行

  1. import os
  2. import cv2
  3. # 原始标签路径
  4. originLabelsDir = r'G:\data\cell_phone_samples\correct_images_and_labels' \
  5. r'\cellphone_labels_cut_person_and_cellphone_total\labels\val'
  6. # 转换后的文件保存路径
  7. saveDir = r'G:\data\cell_phone_samples\correct_images_and_labels' \
  8. r'\cellphone_labels_cut_person_and_cellphone_total\labels_coco_format\annos.txt'
  9. # 原始标签对应的图片路径
  10. originImagesDir = r'G:\data\cell_phone_samples\correct_images_and_labels' \
  11. r'\cellphone_labels_cut_person_and_cellphone_total\images\val'
  12. txtFileList = os.listdir(originLabelsDir)
  13. with open(saveDir, 'w') as fw:
  14. for txtFile in txtFileList:
  15. with open(os.path.join(originLabelsDir, txtFile), 'r') as fr:
  16. labelList = fr.readlines()
  17. for label in labelList:
  18. label = label.strip().split()
  19. x = float(label[1])
  20. y = float(label[2])
  21. w = float(label[3])
  22. h = float(label[4])
  23. # convert x,y,w,h to x1,y1,x2,y2
  24. imagePath = os.path.join(originImagesDir,
  25. txtFile.replace('txt', 'jpg'))
  26. image = cv2.imread(imagePath)
  27. H, W, _ = image.shape
  28. x1 = (x - w / 2) * W
  29. y1 = (y - h / 2) * H
  30. x2 = (x + w / 2) * W
  31. y2 = (y + h / 2) * H
  32. # 为了与coco标签方式对,标签序号从1开始计算
  33. fw.write(txtFile.replace('txt', 'jpg') + ' {} {} {} {} {}\n'.format(int(label[0]) + 1, x1, y1, x2, y2))
  34. print('{} done'.format(txtFile))

第二步:将标签转换为coco格式并以json格式保存,代码如下。根路径root_path中,包含images(图片文件夹),annos.txt(bbox标注),classes.txt(一行对应一种类别名字), 以及annotations文件夹(如果没有则会自动创建,用于保存最后的json)

  1. import json
  2. import os
  3. import cv2
  4. # ------------用os提取images文件夹中的图片名称,并且将BBox都读进去------------
  5. # 根路径,里面包含images(图片文件夹),annos.txt(bbox标注),classes.txt(类别标签),
  6. # 以及annotations文件夹(如果没有则会自动创建,用于保存最后的json)
  7. root_path = r'G:\data\cell_phone_samples\correct_images_and_labels\cellphone_labels_cut_person_and_cellphone_total\labels_coco_format'
  8. # 用于创建训练集或验证集
  9. phase = 'train' # 需要修正
  10. # dataset用于保存所有数据的图片信息和标注信息
  11. dataset = {'categories': [], 'annotations': [], 'images': []}
  12. # 打开类别标签
  13. with open(os.path.join(root_path, 'classes.txt')) as f:
  14. classes = f.read().strip().split()
  15. # 建立类别标签和数字id的对应关系
  16. for i, cls in enumerate(classes, 1):
  17. dataset['categories'].append({'id': i, 'name': cls, 'supercategory': 'mark'})
  18. # 读取images文件夹的图片名称
  19. indexes = os.listdir(os.path.join(root_path, 'images'))
  20. # 统计处理图片的数量
  21. global count
  22. count = 0
  23. # 读取Bbox信息
  24. with open(os.path.join(root_path, 'annos.txt')) as tr:
  25. annos = tr.readlines()
  26. # ---------------接着将,以上数据转换为COCO所需要的格式---------------
  27. for k, index in enumerate(indexes):
  28. count += 1
  29. # 用opencv读取图片,得到图像的宽和高
  30. im = cv2.imread(os.path.join(root_path, 'images/') + index)
  31. height, width, _ = im.shape
  32. # 添加图像的信息到dataset中
  33. dataset['images'].append({'file_name': index,
  34. 'id': k,
  35. 'width': width,
  36. 'height': height})
  37. for ii, anno in enumerate(annos):
  38. parts = anno.strip().split()
  39. # 如果图像的名称和标记的名称对上,则添加标记
  40. if parts[0] == index:
  41. # 类别
  42. cls_id = parts[1]
  43. # x_min
  44. x1 = float(parts[2])
  45. # y_min
  46. y1 = float(parts[3])
  47. # x_max
  48. x2 = float(parts[4])
  49. # y_max
  50. y2 = float(parts[5])
  51. width = max(0, x2 - x1)
  52. height = max(0, y2 - y1)
  53. dataset['annotations'].append({
  54. 'area': width * height,
  55. 'bbox': [x1, y1, width, height],
  56. 'category_id': int(cls_id),
  57. 'id': i,
  58. 'image_id': k,
  59. 'iscrowd': 0,
  60. # mask, 矩形是从左上角点按顺时针的四个顶点
  61. 'segmentation': [[x1, y1, x2, y1, x2, y2, x1, y2]]
  62. })
  63. print('{} images handled'.format(count))
  64. # 保存结果的文件夹
  65. folder = os.path.join(root_path, 'annotations')
  66. if not os.path.exists(folder):
  67. os.makedirs(folder)
  68. json_name = os.path.join(root_path, 'annotations/{}.json'.format(phase))
  69. with open(json_name, 'w') as f:
  70. json.dump(dataset, f)

 

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

闽ICP备14008679号