当前位置:   article > 正文

yolo格式转coco格式_yolo转coco

yolo转coco

参考:目标检测标注文件yolov5(txt)格式转coco(json)格式详解及代码实现_yolo标注格式_纯粹ss的博客-CSDN博客

由于原作者imageFile打印出来是图片名字加图片格式比如15454.jpg,imageFile[:5]这里的索引不能自由匹配长度所以,我进行了修改
 

txtFile=imageFile.replace('.jpg', '.txt')   

修改后代码如下:

  1. import os
  2. import json
  3. import cv2
  4. import random
  5. import time
  6. from PIL import Image
  7. coco_format_save_path=r'D:\datasets\AFOCOCO\coco\annotations' #要生成的标准coco格式标签所在文件夹
  8. yolo_format_classes_path=r'D:\datasets\AFOv1.1\AFOv1.1\names.txt' #类别文件,一行一个类
  9. yolo_format_annotation_path=r'D:\datasets\AFOv1.1\AFOv1.1\labels\test' #yolo格式标签所在文件夹
  10. img_pathDir=r'D:\datasets\AFOv1.1\AFOv1.1\images\test' #图片所在文件夹
  11. with open(yolo_format_classes_path,'r') as fr: #打开并读取类别文件
  12. lines1=fr.readlines()
  13. # print(lines1)
  14. categories=[] #存储类别的列表
  15. for j,label in enumerate(lines1):
  16. label=label.strip()
  17. categories.append({'id':j+1,'name':label,'supercategory':'None'}) #将类别信息添加到categories中
  18. # print(categories)
  19. write_json_context=dict() #写入.json文件的大字典
  20. write_json_context['info']= {'description': '', 'url': '', 'version': '', 'year': 2023, 'contributor': 'JeJe', 'date_created': '2023-05-18'}
  21. write_json_context['licenses']=[{'id':1,'name':None,'url':None}]
  22. write_json_context['categories']=categories
  23. write_json_context['images']=[]
  24. write_json_context['annotations']=[]
  25. #接下来的代码主要添加'images'和'annotations'的key值
  26. imageFileList=os.listdir(img_pathDir) #遍历该文件夹下的所有文件,并将所有文件名添加到列表中
  27. for i,imageFile in enumerate(imageFileList):
  28. imagePath = os.path.join(img_pathDir,imageFile) #获取图片的绝对路径
  29. image = Image.open(imagePath) #读取图片,然后获取图片的宽和高
  30. W, H = image.size
  31. img_context={} #使用一个字典存储该图片信息
  32. #img_name=os.path.basename(imagePath) #返回path最后的文件名。如果path以/或\结尾,那么就会返回空值
  33. img_context['file_name']=imageFile
  34. img_context['height']=H
  35. img_context['width']=W
  36. img_context['date_captured']='2022-07-8'
  37. img_context['id']=i #该图片的id
  38. img_context['license']=1
  39. img_context['color_url']=''
  40. img_context['flickr_url']=''
  41. write_json_context['images'].append(img_context) #将该图片信息添加到'image'列表中
  42. txtFile=imageFile.replace('.jpg', '.txt') #获取该图片获取的txt文件
  43. with open(os.path.join(yolo_format_annotation_path,txtFile),'r') as fr:
  44. lines=fr.readlines() #读取txt文件的每一行数据,lines2是一个列表,包含了一个图片的所有标注信息
  45. for j,line in enumerate(lines):
  46. bbox_dict = {} #将每一个bounding box信息存储在该字典中
  47. # line = line.strip().split()
  48. # print(line.strip().split(' '))
  49. class_id,x,y,w,h=line.strip().split(' ') #获取每一个标注框的详细信息
  50. class_id,x, y, w, h = int(class_id), float(x), float(y), float(w), float(h) #将字符串类型转为可计算的int和float类型
  51. xmin=(x-w/2)*W #坐标转换
  52. ymin=(y-h/2)*H
  53. xmax=(x+w/2)*W
  54. ymax=(y+h/2)*H
  55. w=w*W
  56. h=h*H
  57. bbox_dict['id']=i*10000+j #bounding box的坐标信息
  58. bbox_dict['image_id']=i
  59. bbox_dict['category_id']=class_id+1 #注意目标类别要加一
  60. bbox_dict['iscrowd']=0
  61. height,width=abs(ymax-ymin),abs(xmax-xmin)
  62. bbox_dict['area']=height*width
  63. bbox_dict['bbox']=[xmin,ymin,w,h]
  64. bbox_dict['segmentation']=[[xmin,ymin,xmax,ymin,xmax,ymax,xmin,ymax]]
  65. write_json_context['annotations'].append(bbox_dict) #将每一个由字典存储的bounding box信息添加到'annotations'列表中
  66. name = os.path.join(coco_format_save_path,"train"+ '.json')#生成json文件的名字
  67. with open(name,'w') as fw: #将字典信息写入.json文件中
  68. json.dump(write_json_context,fw,indent=2)

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

闽ICP备14008679号