인프런 커뮤니티 질문&답변

sung-chul lee님의 프로필 이미지
sung-chul lee

작성한 질문수

[개정판] 딥러닝 컴퓨터 비전 완벽 가이드

matterport mask rcnn의 image_id 와 class_id의 연결

작성

·

537

0

안녕하세요 ,

강의와 답변에 항상 감사드립니다.

matterport mask rcnn 에서 이미지 로딩시 class_id와 image_id가 어떻게 연결이 되나요?

질문을 올리고 몇 번 수정했습니다.제가 질문하는 것이 명확하지 않은 것 같아서요.^^

질문의 요지는

class_id 등록을 add_class를 이용해서 dataset에서 등록을 해주고 있는데,

image_id와 class_id가 어딘가에서 연결이 되어야 할 것 같은데, 그 위치를 찾질 못하고 있습니다.

강의 중에 설명을 하신것 같기도 하고,,,

예를 들어 coco_dataset의 사람이면 class_id가 1번일텐데, train전 image와 class_id를 연결하는 부분이

어디인지를 못찾고 있습니다

감사합니다.

강의와 관련있는 질문을 남겨주세요.
• 강의와 관련이 없는 질문은 지식공유자가 답변하지 않을 수 있습니다. (사적 상담, 컨설팅, 과제 풀이 등)
• 질문을 남기기 전, 비슷한 내용을 질문한 수강생이 있는지 먼저 검색을 해주세요. (중복 질문을 자제해주세요.)
서비스 운영 관련 질문은 인프런 우측 하단 ‘문의하기’를 이용해주세요. (영상 재생 문제, 사이트 버그, 강의 환불 등)

질문 전달에도 요령이 필요합니다.
• 지식공유자가 질문을 좀 더 쉽게 확인할 수 있게 도와주세요.
• 강의실 페이지(/lecture) 에서 '질문하기'를 이용해주시면 질문과 연관된 수업 영상 제목이 함께 등록됩니다.
• 강의 대시보드에서 질문을 남길 경우, 관련 섹션 및 수업 제목을 기재해주세요. 
• 수업 특정 구간에 대한 질문은 꼭 영상 타임코드를 남겨주세요!

구체적인 질문일수록 명확한 답을 받을 수 있어요.
• 질문 제목은 핵심 키워드를 포함해 간결하게 적어주세요.
• 질문 내용은 자세하게 적어주시되, 지식공유자가 답변할 수 있도록 구체적으로 남겨주세요.
• 정확한 질문 내용과 함께 코드를 적어주시거나, 캡쳐 이미지를 첨부하면 더욱 좋습니다.

기본적인 예의를 지켜주세요.
• 정중한 의견 및 문의 제시, 감사 인사 등의 커뮤니케이션은 더 나은 강의를 위한 기틀이 됩니다. 
• 질문이 있을 때에는 강의를 만든 지식공유자에 대한 기본적인 예의를 꼭 지켜주세요. 
반말, 욕설, 과격한 표현 등 지식공유자를 불쾌하게 할 수 있는 내용은 스팸 처리 등 제재를 가할 수 있습니다. 

답변 12

1

권 철민님의 프로필 이미지
권 철민
지식공유자

https://github.com/matterport/Mask_RCNN/blob/master/samples/shapes/train_shapes.ipynb

에 가시면 여러개의 object 들을 학습하는 예제가 있습니다. 여기서 아래 load_shapes()를 참조해 보시면 어떨가요?

class ShapesDataset(utils.Dataset):
    """Generates the shapes synthetic dataset. The dataset consists of simple
    shapes (triangles, squares, circles) placed randomly on a blank surface.
    The images are generated on the fly. No file access required.
    """

    def load_shapes(self, count, height, width):
        """Generate the requested number of synthetic images.
        count: number of images to generate.
        height, width: the size of the generated images.
        """
        # Add classes
        self.add_class("shapes", 1, "square")
        self.add_class("shapes", 2, "circle")
        self.add_class("shapes", 3, "triangle")

        # Add images
        # Generate random specifications of images (i.e. color and
        # list of shapes sizes and locations). This is more compact than
        # actual images. Images are generated on the fly in load_image().
        for i in range(count):
            bg_color, shapes = self.random_image(height, width)
            self.add_image("shapes", image_id=i, path=None,
                           width=width, height=height,
                           bg_color=bg_color, shapes=shapes)

1

권 철민님의 프로필 이미지
권 철민
지식공유자

아이고, 고생이 많으십니다. 제가 일이 밀려서 답변이 늦었습니다. 

네, 클래스 명을 넣어 주셔야 합니다. 'source'의미가 클래스 명입니다.

1

권 철민님의 프로필 이미지
권 철민
지식공유자

안녕하십니까,

class BalloonDataset(utils.Dataset) 을 보시면 annotation별로 iteration하면서 self.add_image()를 호출하는데 여기서 class명과 image_id를 인자로 넣어주면 내부적으로 class_id와 image_id를 매핑 시켜 줍니다.

BalloonDataset class는 utils.Dataset 클래스를 상속 받는데 내부에 self.image_info 라는 리스트 객체 변수에 여러개의 image정보를 딕셔너리 형태로 저장할 수 있습니다. self.add_image('클래스명', image_id, 기타 인자값...)을 입력해주면 image_info에 개별 이미지의 image_id와 클래스명을 Dictionary형태로 가지게 되며 이를 여러 image별로 저장합니다.  그리고 클래스명은 호출되는 함수에 따라 class_id로 변환됩니다.

for a in annotations:

             .......

            self.add_image(
                "balloon",
                image_id=a['filename'],  # use file name as a unique image id
                path=image_path,
                width=width, height=height,
               polygons=polygons)

utils.Dataset 소스코드를 보시면 더 이해가 쉬우실 수 있습니다.

https://github.com/matterport/Mask_RCNN/blob/master/mrcnn/utils.py

의 255 line __init__(),  262 line add_class(), 276 line의 add_image()을 참조하시면 좋을 것 같습니다.

감사합니다.

0

권 철민님의 프로필 이미지
권 철민
지식공유자

해결이 되었다니 다행입니다. 수고 많으셨습니다.

0

sung-chul lee님의 프로필 이미지
sung-chul lee
질문자

휴~~작가님.^^

coco 데이터 셋과 비교해보고 , 로그도 찍어보고 하다가 문제점을 발견하고 이제서야 해결했습니다.^^

load_mask메서드를  coco 데이터 셋과 비교해서 category_id를 만드는 작업을 했습니다.

막 두서없이 질문하는데 답변해 주셔서 감사합니다.

최소한 데이터 셋을 어떻게 구성해야 하는지는 정확히 알게 되었네요.^^;;;

학습 결과로 segmentation 진행해 봤는데 성공적으로 되었습니다.^^;;;

도움을 주셔서 정말 감사드립니다

0

권 철민님의 프로필 이미지
권 철민
지식공유자

어떤 에러가 나는지 에러 내용을 올려 주시겠습니까?

0

sung-chul lee님의 프로필 이미지
sung-chul lee
질문자

수정을 해서 테스트를 해보니

model.py  load_image_gt 메소드의 

source_class_ids = dataset.source_class_ids[dataset.image_info[image_id]["source"]] 에서 에러가 나고 있는데요

 dataset.source_class_ids 에는 현재 {'': [0], 'AL': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]}  이렇게 들어가 있고요

dataset.image_info[image_id]["source"] 의 값은 단일값 (예.  1 혹은 3 ) 과 같은 값이 들어오고 있습니다.

그러다보니 여기에서 에러가 나고 있고요..

사전에 클래스 등록은 

  self.add_class("AL", 1, "1")

        self.add_class("AL", 2, "2")

        self.add_class("AL", 3, "3")

        self.add_class("AL", 4, "4")

        self.add_class("AL", 5, "5")

        self.add_class("AL", 6, "6")

        self.add_class("AL", 7, "7")

        self.add_class("AL", 8, "8")

        self.add_class("AL", 9, "9")

        self.add_class("AL", 10, "0")

이렇게 하고 

 self.add_image(

                category_name,

                image_id=a['filename'],  # use file name as a unique image id

                path=image_path,

                width=width, height=height,

                polygons=polygons

                )

여기에서 category_name에 클래스 명을 넣어주고 있습니다.

category_name 이 "1","2"...이와 같습니다.

귀찮게 해서 정말 죄송합니다.. 도움을 부탁드립니다..

괜찮으시면 정말 찾아뵙고 도움을 부탁드리고 싶네요.ㅜㅜ

0

sung-chul lee님의 프로필 이미지
sung-chul lee
질문자

제가 작가(^^-어디에선가 작가님이라 불리시는 것을 좋아하신다고 되어 있는것 같아서..^^)님의 설명을 잘 못 이해해서 많이 돌고 있군요.ㅎㅎ.다시 해보겠습니다.ㅎㅎㅎ

0

sung-chul lee님의 프로필 이미지
sung-chul lee
질문자

아,,소스 상의 comment가 add_class 시에 source로 되어 있던데, source가 아니라 그냥 클래스 명을 넣어주면 되는 건가요? ^^;;;아직 삽질 중입니다.ㅎㅎㅎ

0

sung-chul lee님의 프로필 이미지
sung-chul lee
질문자

계속 질문을 하게 되네요.^^;;

BallonDataset의 경우 class가 balllon 하나 뿐이지 않나요?

그래서 add_class 후에 add_image를 할 때 입력하는 값이 source이지 않나요?

그래서 coco dataset의 경우 그냥 coco로 입력하는 것으로 보였는데요

coco dataset의 경우는 class 가 80여 가지일텐데요..소스를 보다보니 coco dataset의 경우

load_mask 에서 category_id로 

연결하는것 같다는 생각이 들었습니다.(솔직히 맞는지는 잘 모르겠습니다)

coco dataset처럼 여러 종류를 가진 이미지들을 train 시키고 싶은건데요

계속 class_id와 image_id가 어떻게 연결되는지를 몰라 혼돈 중에 있습니다.^^;;

하나의 이미지는 train시켜서 detection 했는데요, 여러가지 하려니 막히네요.ㅎㅎㅎ

도움을 부탁드립니다.

0

권 철민님의 프로필 이미지
권 철민
지식공유자

네, 맞습니다.

도움이 되셨다니 저도 기쁩니다. 감사합니다.

0

sung-chul lee님의 프로필 이미지
sung-chul lee
질문자

아, 그렇다면 여러개의 클래스에 대해서는 먼저 add_class를 통해 클래스를 등록하고, add_image시 클래스명을 이미지에 따라 등록되게 해주면 이미지와 클래스가 연결이 되겠군요..?

맞게 이해한 건가요? ^^;;

그런데, 정말 상세한 설명 감사드립니다. ^^

강의를 만들어 주신것만도 정말 감사드리는데,  문의에 대한 답변도 정말 잘 해주셔서 감사합니다.

sung-chul lee님의 프로필 이미지
sung-chul lee

작성한 질문수

질문하기