Análise de conjunto de dados Coco (instâncias)

Introdução

Os arquivos instances_train2017.json e instances_val2017.json são divididos em cinco partes, e as palavras-chave correspondentes a essas cinco partes são informações, licenças, imagens, anotações, categorias .

{ 
    "info" : info,  
    "licenses" : [license1, license2, license3, ...],  
    "images" : [image1, image2, image3, ...],  
    "annotations" : [annataton1, annataton2, annataton3, ...],  
    "categories" : [category1, category2, category3, ...]
}

A seção de informações contém informações como ano, versão, autor e descrição do conjunto de dados:

  info
  {
    "description": string类型
    "url": string类型
    "version": string类型
    "year": int类型
    "contributor": string类型
    "date_created": string类型
  }

A parte das licenças contém as informações do certificado de liberação do conjunto de dados. Como existem vários certificados, suas informações são armazenadas na forma de uma tabela de sequência. A forma de armazenamento de cada certificado na tabela de sequência é a mesma:

      licenses
      {
        "url": string 类型
        "id": int类型
        "name": string 类型
      }

A seção de imagens contém informações da imagem, que são armazenadas na forma de uma lista, e a forma de armazenamento de cada informação da imagem é a mesma:

  images
  {
    "license": int 类型,表示该图像的liecens证书属于licenses部分中的哪一个证书,对应licenses部分中证书的id号           
    "file_name": string 类型,图片的文件名,比如000000000001.jpg
    "coco_url": string 类型,coco图片链接url
    "height": int 类型,图片的高
    "width": int 类型,图片的宽
    "date_captured": string 类型,图片的获取日期
    "flickr_url": string 类型,flickr图片链接url
    "id": int 类型,图片id,和annotations中的image_id相对应
  }

A parte de anotações inclui principalmente as informações de classificação e localização do alvo de detecção na imagem. Como existem várias imagens e cada imagem pode conter vários alvos de detecção, as informações de cada alvo de detecção são armazenadas na forma de uma tabela de sequência. Em a tabela de sequência A forma de armazenamento de cada informação do alvo de detecção é a mesma:

  annotations
  {
    "segmentation": float类型,检测目标的轮廓分割级标签
    "area": float类型,检测目标的面积
    "iscrowd": int型,0或1:目标是否被遮盖,默认为0
    "image_id": 该检测目标所属于的图片的id,对应images部分的id
    "bbox": float型,包含该检测目标的矩形框信息:左上角点的x坐标、y坐标、矩形宽、矩形高
    "category_id": 该检测目标所属的类别id,对应categories部分的id
    "id": 数据集中每个检测目标的id号
  }

A parte de categorias contém principalmente as informações de classificação do alvo de detecção. Como o alvo de detecção tem um total de 80 categorias, as informações de cada categoria são armazenadas na forma de uma tabela de sequência. O formulário de armazenamento de cada informação de categoria na tabela de sequência é o mesmo:

  categories
  {
    "supercategory": string 类型,类别所属的大类,如卡车和轿车都属于机动车这个大类
    "id": int类型,类别的id,对应以上annotations部分的category_id
    "name": string 类型,类别名称,比如person、dog、cat等
  };

extração de informações

Veja a extração de instances_val2017.json como exemplo:

O diretório inicial é o seguinte:

annotations/instances_val2017.json é a informação de anotação de 5000 imagens

Existem 5000 fotos em imagens

import json
import os
json_path = "annotations/instances_val2017.json"
json_labels = json.load(open(json_path, "r"))
annotations = json_labels['annotations'] # list
images = json_labels['images'] # list
categories = json_labels['categories'] # list

CLASSES = [
    'person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train', 'truck', 'boat', 'traffic light',
    'fire hydrant',
    'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', 'cow', 'elephant', 'bear', 'zebra',
    'giraffe', 'backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee', 'skis', 'snowboard', 'sports ball',
    'kite',
    'baseball bat', 'baseball glove', 'skateboard', 'surfboard', 'tennis racket', 'bottle', 'wine glass', 'cup', 'fork',
    'knife', 'spoon', 'bowl', 'banana', 'apple', 'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza',
    'donut',
    'cake', 'chair', 'couch', 'potted plant', 'bed', 'dining table', 'toilet', 'tv', 'laptop', 'mouse', 'remote',
    'keyboard', 'cell phone', 'microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase',
    'scissors',
    'teddy bear', 'hair drier', 'toothbrush']

Armazene o relacionamento de mapeamento entre o nome da imagem e o ID da imagem:

idtoimage = {}
for image in images:
    file_name = image['file_name']
    image_id = image['id'] 
    height = image['height'] 
    width = image['width'] 
    idtoimage[image_id] = [file_name,height,width]

Armazena o relacionamento de mapeamento entre nomes de categoria e IDs de categoria. O id da categoria aqui não é 0-79, você precisa convertê-lo com CLASSES

idtoclss = {}
for category in categories:
    id = category['id']
    name = category['name'] # 类别名
    idtoclss[id] = name

Segmentação de análise: <class-index> <x1> <y1> <x2> <y2> ... <xn> <yn>, normalizado

for annotation in annotations:
    try:
        segmentation = annotation['segmentation'][0]  # 分割点坐标
        image_id = annotation['image_id']  
        category_id = annotation['category_id']  # 类别编号
                
        classname = idtoclss[category_id] # 类别名
        category_id = CLASSES.index(classname) # 转下编号
        
        file = idtoimage[image_id]
        filename,h,w = file[0],file[1],file[2]
        x = [i/w for i in segmentation[0::2]] # x坐标归一化
        y = [i/h for i in segmentation[1::2]] # y坐标归一化
        xy = ''
        for i in range(len(x)):
            xy += str(x[i]) + ' ' + str(y[i]) + ' '
        line = str(category_id)+ ' ' + xy + '\n'
        outfile = filename.split('.')[0]+'.txt'
        outfile = os.path.join('labels_instances',outfile)
        with open(outfile,'a') as f:
            f.write(line)
    except:
        continue

Analisando a detecção do alvo: <object-class> <cx> <cy> <width> <height>, normalizado

for annotation in annotations:
    try:
        bbox = annotation['bbox']  # 左上角x,y,w,h
        image_id = annotation['image_id']  
        category_id = annotation['category_id']  # 类别编号
                
        classname = idtoclss[category_id] # 类别名
        category_id = CLASSES.index(classname) # 转下编号

        file = idtoimage[image_id]
        filename,h,w = file[0],file[1],file[2]

        box_w, box_h = bbox[2]/w, bbox[3]/h
        cx = (bbox[0] + bbox[2]/2) / w
        cy = (bbox[1] + bbox[3]/2) / h
        line = [str(i) for i in [category_id, cx, cy, box_w, box_h]]
        line = ' '.join(line) + '\n'
        outfile = filename.split('.')[0]+'.txt'
        outfile = os.path.join('labels_bbox',outfile)
        with open(outfile,'a') as f:
            f.write(line)
    except:
        continue

おすすめ

転載: blog.csdn.net/qq_39066502/article/details/130852028