python 图像检测之yolo txt格式转成coco json格式

python 图像检测之yolo txt格式转成coco json格式

import os
import json
import random
import time
from PIL import Image
import csv

coco_format_save_path='./coco'                      #要生成的标准coco格式标签所在文件夹
yolo_format_classes_path='./name.csv'               #类别文件,用csv文件表示,一行一个类
yolo_format_annotation_path='/volumes/wmzzz/ges/train/annotation'        #yolo格式标签所在文件夹
img_pathDir='/volumes/wmzzz/ges/train/image'                        #图片所在文件夹

with open(yolo_format_classes_path, 'r') as f:
    reader = csv.reader(f)
    for label in reader:
        print(label)
categories=[]                                                                 
for i in label:
    categories.append({'id':label.index(i)+1,'name':i,'supercategory':""})     #存储类别

write_json_context=dict()                                                      #写入.json文件的大字典
write_json_context['licenses']=[{'name':"",'id':0,'url':""}]
write_json_context['info']= {'contributor': "",'date_created': "",'description': "", 'url': "", 'version': "", 'year': ""}
write_json_context['categories']=categories
write_json_context['images']=[]
write_json_context['annotations']=[]

#接下来的代码主要添加'images'和'annotations'的key值
imageFileList=os.listdir(img_pathDir)
#遍历该文件夹下的所有文件,并将所有文件名添加到列表中
key = 0 #图片编号
for i,imageFile in enumerate(imageFileList):
    if '_' not in imageFile:
        key+=1
        imagePath = os.path.join(img_pathDir,imageFile)                             #获取图片的绝对路径
        image = Image.open(imagePath)                                               #读取图片
        W, H = image.size                                                           #获取图片的高度宽度
        img_context={}                                                              #使用一个字典存储该图片信息
        #img_name=os.path.basename(imagePath)
        img_context['id']=key
        img_context['width']=W  
        img_context['height']=H
        img_context['file_name']='image/'+imageFile
        img_context['license']=0
        img_context['flickr_url']=""
        img_context['color_url']=""
        img_context['date_captured']=""
                                                                 



        write_json_context['images'].append(img_context)                            #将该图片信息添加到'image'列表中


        txtFile=imageFile+'.txt'                                               #获取该图片获取的txt文件
        with open(os.path.join(yolo_format_annotation_path,txtFile),'r') as fr:
            lines=fr.readlines()                                                   #读取txt文件的每一行数据,lines2是一个列表,包含了一个图片的所有标注信息
        for j,line in enumerate(lines):

            bbox_dict = {}                                                          #将每一个bounding box信息存储在该字典中
            # line = line.strip().split()
            # print(line.strip().split(' '))

            class_id,x,y,w,h=line.strip().split(' ')                                          #获取每一个标注框的详细信息
            class_id,x, y, w, h = int(class_id), float(x), float(y), float(w), float(h)       #将字符串类型转为可计算的int和float类型

            xmin=(x-w/2)*W                                                                    #坐标转换
            ymin=(y-h/2)*H
            xmax=(x+w/2)*W
            ymax=(y+h/2)*H
            w=w*W
            h=h*H
            height,width=abs(ymax-ymin),abs(xmax-xmin)
            bbox_dict['id']=key                                                         #bounding box的坐标信息
            bbox_dict['image_id']=key
            bbox_dict['category_id']=class_id+1   
            bbox_dict['segmentation']=[[xmin,ymin,xmax,ymin,xmax,ymax,xmin,ymax]]  
            bbox_dict['area']=height*width
            bbox_dict['bbox']=[xmin,ymin,w,h]                                          #注意目标类别要加一
            bbox_dict['iscrowd']=0
            bbox_dict['attributes']=""


            write_json_context['annotations'].append(bbox_dict)                               #将每一个由字典存储的bounding box信息添加到'annotations'列表中

name = os.path.join(coco_format_save_path,"train"+ '.json')
with open(name,'w') as fw:                                                                #将字典信息写入.json文件中
    json.dump(write_json_context,fw)

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将YOLOtxt格式转换COCOjson格式,可以按照以下步骤进行操作: 1. 首先,需要将YOLOtxt文件中的标注信息提取出来。每个txt文件对应一张图像,每行表示一个目标的标注信息,包括目标类别、边界框的位置和大小等。可以使用Python的文件读取操作将txt文件中的内容读取到内存中。 2. 接下来,需要将提取出的标注信息转换COCOjson格式COCOjson格式包括了图像信息、目标类别信息和边界框信息等。可以使用Pythonjson库来创建一个空的COCO格式的字典,并逐个添加图像和目标信息。 3. 在添加图像信息时,需要提供图像的文件名、宽度、高度等信息。可以根据YOLOtxt文件的文件名来获取对应的图像文件,并使用Python的PIL库来获取图像的宽度和高度。 4. 在添加目标信息时,需要提供目标的类别、边界框的位置和大小等信息。可以根据YOLOtxt文件中的标注信息来获取这些信息,并将它们添加到COCO格式的字典中。 5. 最后,将生成的COCO格式的字典保存为json文件即可。 需要注意的是,以上步骤只是一种实现方式,具体的代码实现可能会有所不同。可以根据自己的需求和实际情况进行相应的修改和调整。 #### 引用[.reference_title] - *1* [目标检测数据集标签转换COCO2VOC、YOLO2VOC、JSON2YOLO](https://blog.csdn.net/Abo_luo/article/details/128920367)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Yolo v5的txt标注文件转为coco格式json标注文件](https://blog.csdn.net/qq_42308217/article/details/123547150)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值