작성
·
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
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:
.......
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
휴~~작가님.^^
coco 데이터 셋과 비교해보고 , 로그도 찍어보고 하다가 문제점을 발견하고 이제서야 해결했습니다.^^
load_mask메서드를 coco 데이터 셋과 비교해서 category_id를 만드는 작업을 했습니다.
막 두서없이 질문하는데 답변해 주셔서 감사합니다.
최소한 데이터 셋을 어떻게 구성해야 하는지는 정확히 알게 되었네요.^^;;;
학습 결과로 segmentation 진행해 봤는데 성공적으로 되었습니다.^^;;;
도움을 주셔서 정말 감사드립니다
0
0
수정을 해서 테스트를 해보니
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
제가 작가(^^-어디에선가 작가님이라 불리시는 것을 좋아하신다고 되어 있는것 같아서..^^)님의 설명을 잘 못 이해해서 많이 돌고 있군요.ㅎㅎ.다시 해보겠습니다.ㅎㅎㅎ
0
아,,소스 상의 comment가 add_class 시에 source로 되어 있던데, source가 아니라 그냥 클래스 명을 넣어주면 되는 건가요? ^^;;;아직 삽질 중입니다.ㅎㅎㅎ
0
계속 질문을 하게 되네요.^^;;
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
아, 그렇다면 여러개의 클래스에 대해서는 먼저 add_class를 통해 클래스를 등록하고, add_image시 클래스명을 이미지에 따라 등록되게 해주면 이미지와 클래스가 연결이 되겠군요..?
맞게 이해한 건가요? ^^;;
그런데, 정말 상세한 설명 감사드립니다. ^^
강의를 만들어 주신것만도 정말 감사드리는데, 문의에 대한 답변도 정말 잘 해주셔서 감사합니다.