inflearn logo
강의

講義

知識共有

[改訂版] ディープラーニング・コンピュータビジョン完全ガイド

matterport mask rcnn의 image_id 와 class_id의 연결

777

sung-chul lee

投稿した質問数 4

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) 에서 '질문하기'를 이용해주시면 질문과 연관된 수업 영상 제목이 함께 등록됩니다.
• 강의 대시보드에서 질문을 남길 경우, 관련 섹션 및 수업 제목을 기재해주세요. 
• 수업 특정 구간에 대한 질문은 꼭 영상 타임코드를 남겨주세요!

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

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

keras 딥러닝 python 컴퓨터-비전 머신러닝 배워볼래요? tensorflow

回答 12

1

dooleyz3525

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

dooleyz3525

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

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

1

dooleyz3525

안녕하십니까,

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

dooleyz3525

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

0

sung-chul lee

휴~~작가님.^^

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

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

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

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

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

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

0

dooleyz3525

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

0

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

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

0

sung-chul lee

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

0

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

dooleyz3525

네, 맞습니다.

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

0

sung-chul lee

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

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

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

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

mmcv 문의 드립니다.

0

90

2

MMDetection 버전 이슈

0

110

2

강의 환경설정 질문

0

122

2

Custom Dataset에서의 polygon 정보 관련

0

180

3

cvat.ai 보안 수준이 궁금합니다

0

155

2

캐클 nucleus 챌린지 runpod 실습 코드 에러 질문드립니다.

0

209

3

추론 결과의 Precision(또는 mAP) 평가 방법

0

149

2

mmdetection mask rcnn inferenct 실습 시 runpod 템플릿 관해서 질문드립니다.

0

111

2

runpod에서 google drive 연결 시 오류 발생

0

180

2

로드맵 선택

0

107

1

mmcv

0

117

2

Anchor box의 Positive 처리 위치

0

109

2

해당 강의 runpod 적용 후 에러 제보드립니다

0

144

2

run pod credit 관련 제보

0

194

2

mmdetection 2.x과 3.x 호환 관련 표기

0

131

2

mm_faster_rcnn_train_kitti.ipynb 실행 오류

0

171

3

질문 드립니다.

0

130

3

mm_faster_rcnn_train_coco_bccd 실행 오류 질문드립니다.

0

121

1

강사님께 수정을 제안드리고 싶은 것이 있습니다.

0

139

1

google automl efficientdet 다운로드 및 설치 오류

0

121

1

이상 탐지에 사용할 비전 기술 조언 부탁드립니다.

0

157

2

OpenCV 관련 질문드립니다.

0

153

2

mmcv 설치관련해서 문의드려요

0

433

3

강의 구성 관련해서 질문이 있습니다

1

183

2