본문 바로가기

컴린이 탈출기/Vision

COCO Data format과 Pycocotools

반응형

COCO Dataset은 Object Detection, Segmentation, Keypoint Detection 등을 위한 데이터셋으로, 매년 전 세계의 여러 대학과 기업이 참가하는 대회에서 사용되고 있습니다. COCO Dataset 자체를 이용하기도 하지만, 데이터를 저장하는 방식인 COCO Data format 역시 많이 활용되기도 합니다. 오늘은  이 COCO Data format과, 이를 불러오고 사용할 때 유용한 COCO API인 Pycocotools에 대해 알아보려 합니다.

🎈 모든 내용은 제가 일하고 있는 회사에서 제공받은 데이터셋을 기준으로 작성한 내용입니다. COCO format을 따르는 데이터라고 전달받았지만, 공식 홈페이지에서 다운로드한 데이터 형식과 차이가 있을 수 있습니다.

Remember↗ Me↘

 

COCO Data Format

Detection, Segmentation 등 태스크를 위해서는 bounding box의 좌표, segmentation mask 픽셀 등 필요한 정보가 많습니다. 따라서 이러한 정보들(annotation)을 json 형태로 제공합니다. 


+ Dictionary와 JSON의 차이점? 🙄

:그것은 마치 사과와 오렌지를 비교하는 것과 같다! JSON은 데이터 포맷이고, Dictionary는 Python의 데이터 구조 (자료구조)이다. 따라서 Dictionary 데이터를 JSON 포맷으로 이용하기 위해서는 Serialization(직렬화, 객체를 바이트 스트림으로 바꾸는 과정)이 필요하다.

출처: stackoverflow.com/questions/33169404/whats-the-difference-between-python-dictionary-and-json


JSON 파일은 Info, Licences, Images, Categories, Annotations, 크게  5가지로 구분된 정보를 담고 있습니다. 

1) Info

Info는 데이터셋에 대한 데이터셋 버전, 설명, 생성 날짜 등 high-level한 정보를 포함하고 있습니다. 

2) Licences

이미지의 라이센스 목록이 포함되어 있습니다.

3) Images

데이터셋에 속하는 전체 이미지 목록과 같습니다. 이미지 각각의 파일명, width, height 등의 정보가 포함되어 있습니다.

4) Categories

데이터셋에 존재하는 Category에 대한 정보(id, name)가 담겨 있습니다.

5) Annotations

한 이미지에는 여러 객체가 존재할 수 있기 때문에, Annotation은 이미지가 아닌 객체를 기준으로 작성되어 있습니다. (json 파일을 annotations 변수에 불러왔다고 가정했을 때, annotations ['Images']는 이미지 id당 한 개의 dict만 존재하지만,  annoatations['annotations']는 이미지 id 당 여러 개(= 해당 이미지에 담긴 객체 수만큼)의 dict가 존재합니다. 

하나의 image_id지만 각기 다른 object에 대한 정보를 담고 있다!

위에서도 알 수 있듯이 annotations 내 각각의 dictionary는 여러 정보를 담고 있습니다.

(1) image_id

해당 annotation이 어떤 image에 속하는지를 가리킵니다.

(2) category_id

해당 annotation의 object가 어떤 카테고리에 속하는지를 가리킵니다. 이 숫자 각각이 어떤 것이 의미하는지는 4) Categories의 정보로 확인할 수 있습니다.

(3) segmentation

각 class에 해당하는 pixel의 x, y 좌표가 포함되어 있습니다.(4) bboxObject detection 태스크를 위한 bouding box 정보로, 순서대로 좌측 상단 지점의 (x, y) 좌표, width, height를 의미합니다. 이외에도 iscrowd, id 데이터가 포함되어 있습니다.

 

Pycocotools

위 json 파일에서 우리가 주로 이용하게 될 데이터는 Images와 Annotations인데요, 정보가 흩어져 있기 때문에 두 정보를 잘 join 해 활용할 수 있어야 할 듯합니다. 또한 데이터 EDA, 시각화 등을 위해서는 한 Image에 속하는 모든 annotation을 불러오는 코드 등도 있으면 좋을 것 같고요. 바로 이러한 작업들을 수월하게 해주는 API가 바로 Pycocotools입니다. Pycocotools의 여러 class 중에서도 오늘 소개하고자 하는 class는 COCO class입니다. 저를 위한 cheat sheet 겸 class 내 함수들을 정리해두었지만, 코드가 어렵지 않아서 코드 읽는데 어려움이 없으시는 분들은 공식 github에서 직접 확인해보시는 것도 좋을 것 같습니다.

1) 불러오기

COCO 클래스를 불러오는 방법은 아주 간단합니다. pycocotools 패키지에서 import 해온 뒤, json 파일 주소와 함께 선언해주시면 됩니다.

 

2) getAnnIds

Image id, Category id를 input으로, 그에 해당하는 annotation id를 return 하는 함수입니다. 

0번 image에 해당하는 Annotations id
Category 9에 속하는 Annotations id

 

3) getCatIds

Category 이름, Super Category 이름을 input으로, 그에 해당하는 Category  id를 return하는 함수입니다. 

 

4) getImgIds

Img id, Category id를 input으로, 그에 해당하는 Image id를 return하는 함수입니다. getAnnIds의 Image 버전이라고 생각하시면 될 것 같네요!

 

5) loadAnns
Annotation id를 input으로 annotation dict 전체를 return하는 함수입니다.

 

6) loadCats

Category id를 input으로 Category name, super category 정보가 담긴 dict를 return하는 함수입니다.

 

7) loadImgs

Image id를 input으로 annotations의 image dict를 return하는 함수입니다.

 

COCO format에 익숙하지 않으신 분들은 '이게 뭐야!' 하실 수 있겠지만, 쭉 보시면 어려운 기능을 하는 함수들은 아닙니다! 하지만 이러한 라이브러리와 함수를 알고 적재적소 가져다 쓴다면 코딩 시간을 팍⚡ 단축할 수 있겠죠?

이상으로 COCO Datast과 pycocotools에 대한 간단한 소개를 마치도록 하겠습니다. 참가하시는 대회에서 좋은 성과 거두시길 바랄게요! 😊

 

 

반응형