본문 바로가기
AIML 분야/Segmentation

Panoptic Segmentation COCO dataset 살펴보기

by 포숑은 맛있어 2021. 2. 3.
반응형

panoptic segmentation 논문들을 대략 살펴보면서 panoptic deeplab을 돌리기 위해 COCO dataset을 보고있다.

 

 

원래 COCO는 detection, keypoint, dense pose, panoptic 이렇게 여러가지 task에 적용될 수 있도록 어노테이션이 되어있다. 

아래 링크로 들어가면 COCO dataset의 panoptic segmentation 페이지로 갈 수 있다.

 

cocodataset.org/#panoptic-2020

 

COCO - Common Objects in Context

 

cocodataset.org

 

Class?

 

Semantic, Instance Segmentation을 동시에 해야하는데, 그래서 stuff와 thing class들을 각각 판단해야한다.

페이지에 이렇게 써있으나, 또 다른 페이지로 가면 다르게 써있다.

  • Stuff class : grass, sky, road같은 좀더 주변 환경에 가까운 클래스.
  • Thing class : 80가지.

원래는 각기 다른 클래스를 합쳤기 때문에 (consistency때문이라고 함) 비어있는 클래스 번호도 있다.

따라서, 실험을 돌릴때 보면 panoptic deeplab의 경우 번호를 당겨서 0~132로 (총 133개의 클래스) 맵핑하여 json 파일을 수정한다.

 

 

 

Evaluation?

 

COCO 판옵틱 이미지, 어노테이션, evaluation code, 서버 모두 지원이 된다고 한다.

competition은 종료되었으나 아직 열린 것 같다.

cocodataset.org/#panoptic-eval

 

Evaluation metric : PQ (Panoptic Quality)

metric에 대한 설명은 논문을 참고하라고 한다. arxiv.org/abs/1801.00868

 

 

Data format & Annotation? (공식 문서)

 

태스크에 구애받지 않고, 일단 모든 데이터 포맷은 아래와 같이 생겼다.

 

 

팬옵틱 어노테이션의 경우, 각각의 이미지마다 어노테이션이 따로 되어있다고 한다. (per-image)

 

  1. PNG : class-agnostic image segmentation
  2. JSON structure : semantic information
    우선은 json file을 읽어오면 각 이미지 id에 대해 PNG 파일 이름이 할당되어있을 것이다. (JSON file과 같은 이름)
    이미지를 읽는데, RGB값가지고 클래스 id (숫자)를 계산하나보다.

 

 

 


 

Data format & Annotation? (실제 확인)

 

여기까지는 웹에서 확인한 것, 실제로 읽어보면 이렇다.

 

annotations/panoptic_val2017.json 을 읽어보면,

  • info
  • licenses
  • images
  • annotations
  • categories

이렇게 다섯가지가 있는데 info, licenses는 학습할때 딱히 필요해보이지 않았다.

 

 

images는 대략 요런 dictionary의 리스트가 들어있다.

{

'license': 2

'file_name':'000000015335.jpg'

'coco_url': http://images.cocodataset.org/val2017/000000015335.jpg',

weight, height

'date_captured': '2013-11-25 14:00:10'

'flickr_url': 'http://farm6.staticflickr.com/5533/10257288534_c916fafd78_z.jpg',

'id': 15335

}

=> 데이터셋에 해당하는 이미지파일의 이름을 전부 저장할 필요가 있음.

 

 

categories에는 총 133개의 id가 들어있다.

설명에 적힌대로 1-200의 번호이지만 중간에 통합되고 안쓰는 번호가 있기 때문.

{

'supercategory': 'textile'

'isthing': 0

'id': 200

'name': 'rug-merged'

}

 

isthing의 경우, 시맨틱한 의미가 있을법한 클래스의 경우를 1로 표기한 것 같다. 예를 들어, 사람, 차, 자전거, 오븐, 포크, 나이프, 각종 동물 종류들, 침대 이런 것.

0의 경우는 커튼, 꽃, 집, 강, 길, 모래, 산 이런 식으로 배경에 있을법한 클래스이다.

 

컬러는 왜인지 안보인다.

 

모든 카테고리의 정의에 대해 저장하였다.

id의 경우, 0~132로 당길 것임. 저장이 필요하다.
그리고 해당 클래스가 thing/stuff 둘중 무엇인지 정보가 필요하다.
그리고 그 클래스의 이름이 무엇인지를 name에 저장해야한다.

(supercategory는 굳이 필요하지 않은 것 같다. 필요하다면 다시 한번 더 확인해봐야할 것 같다.)

 

 

annotations에는 이런 것들이 있다.

이미지에 표기된 색상 정보의 경우는 segments_info.id에 있다.

{

'segments_info': [

        {'area': 2840, 'category_id': 1, 'iscrowd': 0, 'id': 3226956, 'bbox': [413, 158, 53, 138]}

        {'area': 439, 'category_id': 1, 'iscrowd': 0, 'id': 6979964, 'bbox': [384, 172, 16, 36]}

        ...

        {'area': 83201, 'category_id': 199, 'iscrowd': 0, 'id': 4224910, 'bbox': [0, 0, 640, 358]}

        {'area': 12618, 'category_id': 200, 'iscrowd': 0, 'id': 6391959, 'bbox': [135, 359, 336, 67]}

        ],

'file_name': '000000000139.png'

'image_id': 139

}

 

실제 어노테이션이다.

하나의 파일은 filename을 통해 알 수 있고, 이는 image id와 같다.
이미지 한장에는 여러 세그멘트가 있기 때문에, segments_info를 통해 모든 영역에 대해 불러와야할 것이다.
한 영역에 대하여 area과, 아까 정의했던 category id, bbox, iscrowd가 포함된다.

단, 실제 panoptic segmentation 알고리즘 중에서는 bbox를 사용하지 않는 모델 또한 존재한다. panoptic deeplab에서는 bbox 정보를 쓰지 않는다.
iscrowd는 후술할 것이나, class 자체는 stuff처리가 되지 않지만 이미지 맥락상 (stuff처럼) 상대적으로 중요도가 떨어지는 경우에 1로 체크하는 것 같다. 단, 이것이 1인 세그먼트는 그리 많지 않다.

 


 

[annotations.segments_info.iscrowd에 대한 의문]

나중에 panoptic-deeplab의 코드를 보면 알겠지만 무시할 region에 대한 조건이, 'ignore_label'이거나, 'iscrowd'=1로 레이블이 되어있거나, (optional) stuff class의 경우이다.
그냥 하나로 통일하지 왜 나눠놨는지 잘 모르겠다.

 

(예시)

카테고리가 1이면 사람인데, 당연히 isthing=1 이다.
그런데 199는 wall (wall-other-merged), 200은 textile (rug-merged)이며 둘다 isthing=0이다.
그런데 isthing=1인것도, 0인것도 위의 예시에서는 전부 iscrowd=0으로 되어있다. 음..?
그리고 다른 데이터를 보면 isthing=1인데 iscrowd=0인 경우도 있다.
면적이 커서 그런가?하면 그것도 딱히 아니다.

 

 

대략 200장의 이미지에 있는 모든 area에서 iscrowd=1인 것만 뽑아봤는데 이거밖에 없었다.

이미지 한장에도 이거보단 많은 area가 들어있을텐데 말이다.

클래스를 보면 주로 사람이나 책같은것들 중에서 crowd로 표기하는 게 있는 모양.

 

 

아마 1차적으로는 일반적으로 '배경정보'라고 클래스를 구분해놓고, (길거리 등)

2차적으로 이미지마다 어노테이션을 할때 그 이미지의 특성에 맞게 iscrowd를 통해 배경정보스러운 것을 걸러내는 모양이다.

반응형

댓글