ML-개발환경/Tools

COCO Data format과 Pycocotools 사용법

dohyeon2 2021. 8. 25. 10:38

이 글은 2021년 8월 25일 기준 작성된 글입니다. 

 

 

 

COCO Dataset 은 머신러닝을 하시는 분들이라면 다들 알고 계신 데이터셋일 겁니다. 

Object Detection, Segmentation, Keypoint Detection 등 여러가지 Annotation 정보를 제공하는 데이터셋인데 

최신 논문의 성능비교 지표로서 사용되고 있습니다.

 

이 글에서는 최근 MMdetection이라는 config기반 toolbox를 공부하면서 해당 toolbox에서 주로 사용되는

데이터 저장형식인 COCO Data format과 데이터를 불러올 때 유용한 Pycocotools에 대해 설명하려고 합니다.

 

COCO data format


출처: 딥러닝 컴퓨터 비전 완벽 가이드 수업자료

 

COCO Dataset은 아시다싶이 이미지와 annotation 파일 두가지로 분류됩니다.

 

하지만 COCO Dataset이 다른 Data format과 구분되는 가장 큰 특징은 

여러 이미지에 대한 annotation이 단 하나의 json 파일로 표현된다는 점입니다.

 

COCO 2017 데이터셋을 기준으로 

이미지 파일은 Train, val, test 크게 세개의 압축파일로 제공되고 

각 압축파일에 대응하는 annotation 파일은 마찬가지로 3개의 json 파일로 제공됩니다.  

 

JSON 파일은 크게 5가지로 구분된 정보를 담고 있습니다. 

 

  • info : 데이터셋의 버전, 생성 일자 등을 가지는 헤더정보 

JSON - info

  • license : 이미지 파일들의 라이센스에 대한 정보

  • images : 모든 이미지들의 고유 ID, 파일명, width, height 정보

  • annotations : 한장의 이미지에는 여러 object들이 존재할 수 있으므로 image ID + 여러개의 object ID , bbox, segmentation  상세 정보

 

  • categories : 80개 object 카테고리의 ID , 이름, supercategory(Group) 

+추가

  • image_id : 해당 annotation이 어떤 image에 속하는지 매핑
  • category_id : 해당 annotation의 object가 어떤 category에 속하는지 매핑
  • bbox : 순서대로 좌상단 x,y 좌표, width, height 정보
  • segmentation : 각 class에 해당하는 픽셀의 x,y 좌표

 

 

Pycocotools


앞서 살펴본 JSON 파일은 정보가 흩어져 있어서 보기 어렵고 , 또한 하나의 이미지에 속한 모든 annotation 정보등을 

불러오는 작업들이 필요한데 별도의 코드작성 없이 이러한 작업을 도와주는 API가 바로 Pycocotools입니다. 

 

오늘은 Pycocotools의 여러 class중 COCO class를 이용하여 COCO Dataset annotation 파일에서 원하는 정보를 

가져오는 작업을 해보려 합니다. (pycocotools는 설치되어 있다는 가정)

 

1. 불러오기

from pycocotools.coco import COCO

 

2. coco dataset 다운로드

wget http://images.cocodataset.org/annotations/annotations_trainval2017.zip

 

3. annFile 정의

dataDir='/content/data'
dataType='val2017'
annFile='{}/annotations/instances_{}.json'.format(dataDir,dataType)

 

4. 한줄로 된 JSON 파일을 보기좋게 변환 (using jq)

 

sudo apt-get install jq
# json 파일의 절대경로 입력
jq . /content/data/annotations/instances_val2017.json > output.json

 

5. COCO API를 활용하기 위해 annotation 파일을 COCO 객체로 로드

from pycocotools.coco import COCO

coco=COCO(annFile)

 

API


1. getCatIds() 

category나 supercategory 이름을 input으로 그에 해당하는 category id를 return

#coco json 파일에서 카테고리 ID 정보 가져오기
coco.getCatIds()

#coco json 파일에서 특정 class 카테고리 ID 정보 가져오기
coco.getCatIds(catNms=['person','dog','skateboard'])

#coco json 파일에서 특정 supercategory에 속하는 카테고리 ID 정보 가져오기
coco.getCatIds(supNms='vehicle')

 

 

2. getAnnIds()

image ID, category ID를 input으로 그에 해당하는 annotation ID를 return

#img_id가 1인 이미지에 속하는 모든 annotation ID
coco.getAnnIds(imgIds=1)

#category_id가 1인 이미지에 속하는 모든 annotation ID 
coco.getAnnIds(catIds=1)

 

3. getImgIds()

category ID를 input으로 그에 해당하는 Image ID를 return

#category ID=1 인 모든 img ID 
coco.getImgIds(catIds=1)

4. loadCats

category ID를 input으로 category name, supercategory dict 전체(상세정보) return

#category id가 1인 딕셔너리 세부정보
coco.loadCats(1)

 

5. loadAnns()

Annotation ID를 input으로 annotation dict 전체(상세정보)를 return

coco.loadAnns(1)

 

6. loadImgs()

Image ID를 input으로 annotations의 image dict 전체(상세정보) return 

coco.loadImgs(1)