• 카테고리

    질문 & 답변
  • 세부 분야

    컴퓨터 비전

  • 해결 여부

    미해결

multi-class segmentation mask일 때 COCO format으로 변환하는 방법

23.04.09 09:44 작성 조회수 628

0

구글링을 해도 도저히 답을 못 찾겠어서 질문 드립니다.

지금 맡고 있는 프로젝트에서는, 총 4개의 class가 masking되어있는 이미지 형태로 annotation이 준비되어 있고 이걸 json annotation으로 만들어야 하는데 이럴 경우에는 어떻게 해야 하죠?

답변 1

답변을 작성해보세요.

1

안녕하십니까,

지금 kaggle nucleus segmentation과 같이 mask가 png 파일로 되어 있고, kaggle nucleus 강의를 들으셔도 본인이 가지고 계시는 mask image를 어떻게 변환해야 할지 모르신다는 건지요?

여러개의 multi class mask 라도 이걸 json 포맷으로 만드는 것은 큰 차이가 없습니다. 강의 코드를 참조하셔서 변환을 하고 계시다면, 어떤 부분을 어떻게 변경하는데 잘 안된다거나등의 보다 상세한 내용을 적어 주셨으면 합니다.

감사합니다.

넵 일단 제가 사용하고자 하는 이미지와 마스크 파일은 디렉토리 구조는 다음과 같이 되어 있습니다.

images

|-0001.jpg

|-0002.jpg

...

ann

|- 0001m.png

|-0002m.png

..

그리고 각 마스크 파일은 다음과 같이 되어 있습니다. 총 4개의 클래스로,

image위와 같이 마스크 파일이 되어 있는데,

공교롭게도 nucleus dataset은 클래스가 한 개 뿐이라 다음과 같이 모두 category_id를 0으로 지정하고 있습니다.

imageimage

위 데이터셋에서는 이 category_id를 처리하기 위해 어떻게 해야 하는지 궁금합니다.

음, 이건 하나의 mask에 여러개의 object가 함께 들어가 있군요.

kaggle nucleus는 하나의 mask에 단 하나의 object만 들어가 있습니다. 그러니까

def get_annotation_info(mask_dir, mask_filename)

는 mask_filename 한개에 하나의 object만 segmentation을 뽑아내게 되어 있습니다. object가 100개면 mask file이 100개가 있습니다.

제 생각엔 사용하시는 데이터 세트는 pascal voc 데이터 세트와 비슷한 segmentation 같습니다.

아래와 같은 방법을 적용해 볼 수 있습니다.

  1. pascal voc와 같은 형태로 데이터 세트를 만드셔서 MMDetection의 이해와 Faster RCNN 적용 실습 - 02 섹션의 COCO 형태 BCCD 데이터 학습 - VOC 형태의 BCCD 데이터를 COCO 형태로 변환하기 영상을 참조하셔서 Coco dataset으로 변경하시거나

     

  2. 개별 mask 파일을 클래스 id값 별로 (즉 0값, 1값, 2값, 3값 별로) 다시 여러개의 mask 파일로 만듭니다. 즉 cv2.imread()로 로드한 array값이 0인것, 1인것, 2인것, 3인것 을 별도 4개의 mask 파일로 만든 후에 이들 파일에 get_annotation_info()를 적용합니다. 이때 개별 클래스값(즉 0, 1, 2, 3값)은 개별 mask별로 별도의 dataframe 등에 저장하셔서 해당 mask를 읽어 들일 때마다 category_id 값을 지정할 수 있도록 해줍니다.

    annotation = dict(segmentation=segmentation,

    area=bbox[2]*bbox[3] , iscrowd=0, bbox=bbox,
    category_id= 별도의 dataframe등에서 mask 파일별로 category_id 추출, image_id=image_id, id = obj_index)

감사합니다. 일단 별도의 annotation없이 마스크 이미지만 존재하는 경우여서 두 번째 방법으로 한번 시도 해보겠습니다!