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

김연승님의 프로필 이미지
김연승

작성한 질문수

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

큰 object와 작은 object 동시 segmentation성능 관련 질문

작성

·

299

0

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
 
안녕하세요 선생님, 선생님 덕분에 segmentation 과제를 재미있게 수행하고 있습니다
제가 하고 있는 과제 중에 큰 object와 작은 object를 동시에 판별하는 task가 있습니다
비유를 하자면 콩이 큰콩과 작은콩이 섞여 있고 나머지 특성은 동일한 콩이라 class는 한개로 했습니다 (큰 콩과 작은콩은 많으면 지름 기준 최대 10~20 배 차이)
그런데 작은 콩은 많으면 1000~2000 개씩 있고 큰 콩만 있는 이미지 (30~100 개)도 있습니다
또 쪼개진 콩도 있습니다 (쓰고 나니까 task가 너무 어렵네요...)
 
그래서 제가 이문제를 잘 맞추기 위해 접근한 방식은 mmdetection에서
max object를 3000 개로 늘리고 roi 제안은 6000개로 늘렸습니다
(cfg.model.test_cfg.rcnn.max_per_img = 3000 #default 100 cfg.model.test_cfg.rpn.nms_pre = 6000 # default 1000 cfg.model.test_cfg.rpn.max_per_img = 6000 # default 1000)
그 다음에 anchor generator stride라는것이 중요하다는 것을 찾아서 기존 [8]에서 [1, 2, 4]로 바꿨습니다
(구글 검색해서 찾은건데 사이트를 지금은 못 찾겠네요;;;)
(cfg.model.rpn_head.anchor_generator.scales = [1, 2, 4] # default [8])
그랬더니 어느정도 작은 입자를 잘 찾는 모델을 만들었습니다만
문제는 큰입자가 있을때 큰입자의 일부분을 쪼개서 작은입자로 찾는 문제가 발견되었습니다
여기서 여쭈어 보고 싶은 점은
 
1) anchor generator stride 의 정확한 의미가 궁금합니다
제가 이해하기로는 피쳐맵에서 anchor 를 찾는 stride 같은데 (8로 하면 8 grid에 한번 4면 4 grid에 한번)
이걸 1, 2, 4로 하는 것은 무슨 의미인지 아시나요?
 
2) 큰입자를 찾으면 작은입자를 못잡고 작은입자를 찾으면 큰입자를 못잡는 (잡긴하는데 실제로는 쪼개진 영역이 아닌데 쪼개서 잡는 영역 존재) 문제가 발생하는데
두가지 task를 동시에 하는것이 가능할까요?
 
3) 다른 모델 (efficient det 등?)을 써야할지 아니면 다른 일반적인 해결책인 있는지 문의드립니다
 
감사합니다!!
 
 

답변 1

1

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

안녕하십니까, 

 

오, 대단하시군요. 환경 세팅을 오브젝트 크기에 맞춰서 하시다니요, 

1)

먼저, 수행하시는게 Segmentation 맞는지요?  지금 config가 mask-rcnn인가요? faster-rcnn인가요? 

 

그리고 확인해보니, scales가 8로 기본값이 되어 있군요.  여기서 scale은 anchor 크기의 척도를 의미합니다. 단일 scale의 anchor가 ratio별로 크기 8로 feature map의 stride별로 3개가 만들어지는 군요. 원래 faster rcnn은 개별 stride별로 9개의 anchor를 만들어야 하는데,  scales를 [1, 2, 4]로 하면 단일 크기보다 8보다는 작지만, 개별 크기 [1, 2, 4]로 rations [0.5, 1.0, 2.0] 으로 9개의 anchor를 만듭니다. 

 

그리고 mmdetection은 faster-rcnn, mask-rcnn 둘다 fpn기반으로 모델을 만드는데,  아래와 같이 strides를 설정하면 fpn 층별로 서로 다른 anchor scale(크기)값을 가지게 됩니다. 그래서 아래와 같이 strides를 만들어 주면 개별 fpn별로 서로 다른 anchor 크기를 가지게 됩니다. 크기는 개별 fpn층 별로 다르지만 개별 feature map의 stride별로는 3개의 anchor를 만듭니다. 

anchor_generator=dict(

            type='AnchorGenerator',

            scales=[8],

            ratios=[0.5, 1.0, 2.0],

            strides=[4, 8, 16, 32, 64])

 

요약하자면 scales를 [1, 2, 4]와 같이 할당하면 크기가 서로 다른 anchor 3개를 만듭니다. strides는 fpn 층별로 만들어지는 anchor의 크기를 재 설정하는데, fpn 층별로 [8*4, 8*8, 8*16, 8*32, 8*64] 로 scale값을 재 설정합니다. 

2) 이건 저도 어렵군요. 일단 [1, 2, 4] 가 아니라 [2, 4, 8] 로 scale 설정을 바꿔 보시면 어떨까 싶습니다. 

감사합니다. 

김연승님의 프로필 이미지
김연승
질문자

감사합니다!! Mask rcnn입니다!!

쉽지않더라구요ㅠ 그래도 코멘트주신대로 시도해보도록하겠습니다!!

김연승님의 프로필 이미지
김연승

작성한 질문수

질문하기