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

Daniel님의 프로필 이미지
Daniel

작성한 질문수

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

Mask rcnn mask 관련 질문입니다.

작성

·

488

0

안녕하세요. 

일전에 mask rcnn 모델 및 panoptic segmentation 모델 (Detectron2)의 mask boolean을 pixel coordinate으로 변경하는 것에 관한 질문을 했던 사람입니다. 

말씀하신대로 mask rcnn의 mask는 boolean 값만 뱉어내고, 그 boolean 값은 특정 threshold 값을 넘는지 안 넘는지에 대해 정해진다고 이해했습니다. (Detectron2의 panoptic segmentation의 경우 segment_id를 pixel 별로 출력하는 것으로 파악됩니다. )

그러나 mask rcnn의 경우 특정 threshold 값을 안다고 하더라도, 그 mask polygon의 pixel coordinate 값들을 어떤 식으로 구해야 하는지 아직 이해가 되지 않습니다. boolean을 integer로 바꾼다고 하더라도 0 혹은 1의 값일 테고, 이 값으로는 어떤 mask가 어떤 class에 속해있는 polygon인지 알 방법이 없다고 생각이 듭니다. 

혹 이러한 mask boolean 값을 original pixel coordinate polygon 값으로 변경하는 function이나 API가 존재할까요? 

어떤식으로 접근을 해야 이거를 해결할 수 있을지 도움 주시면 정말 감사하겠습니다. 

Detectron2 panoptic segmentation 결과값에 대해서도 혹 아시는 것이 있으시다면 조언 부탁드립니다. 

감사합니다. 

답변 4

0

Daniel님의 프로필 이미지
Daniel
질문자

감사합니다!!

0

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

아래로 다시 해보시지요.

https://colab.research.google.com/drive/1NkEUfCCsWoRviq4J6DezoxxsfSU-zUVr?usp=sharing

안되면 아래로 download 해보십시요,

https://raw.githubusercontent.com/chulminkw/DLCV/master/colab_tf115_modify_files/Matterport%ED%8C%A8%ED%82%A4%EC%A7%80%EB%A5%BC_%EC%9D%B4%EC%9A%A9%ED%95%9C_Segmentation_colab_mask_pixel_position.ipynb

0

Daniel님의 프로필 이미지
Daniel
질문자

보내주신 링크에 엑세스 권한을 주시면 감사하겠습니다. 

0

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

안녕하십니까,

mask boolean 행렬에서 행렬의 위치 인덱스를 뽑아내는 식을 사용하면 될 것 같습니다.

해당 소스코드를 제 코랩에서 작성하였습니다.

https://colab.research.google.com/drive/1NkEUfCCsWoRviq4J6DezoxxsfSU-zUVr?authuser=2#scrollTo=hBDWkp_kwI-P

안 열리시면 아래 공유 소스코드 눌러 주십시요.

https://colab.research.google.com/drive/1NkEUfCCsWoRviq4J6DezoxxsfSU-zUVr?usp=sharing

해당 소스코드에서 아래 내용을 참조 하시면 될 것 같습니다.

# mask array 추출
mask_array  = results[0]['masks']
# class id 추출 
class_array = results[0]['class_ids']
print(class_array)
print(mask_array.shape, class_array.shape)
# mask_array값 중에서 True 즉 값이 0 보다 큰 값에 대한 array의 위치 인덱스를 추출하고 이를 다시 transpose로 변환. 
mask_array_index = np.transpose((mask_array > 0).nonzero())
print(mask_array_index)
print(mask_array_index.shape)
# 추출된 전체 mask 위치 인덱스와 class_id를 기반으로 순차적으로 class_id별 mask 위치 인덱스를 추출하여 total_class_id_positio에 Set형태로 저장. 
total_class_id_position_list = []
for class_array_index, class_id in enumerate(class_array):
  #print('class_array_index:', class_array_index, ' class_id:', class_id)
  #print('mask position index:', mask_array_index[mask_array_index[:,2] == class_array_index])
  class_id_position_set = (class_id, mask_array_index[:, :2])
  total_class_id_position_list.append(class_id_position_set)

print(total_class_id_position_list)
찾고자 하는 코드였으면 합니다.
Daniel님의 프로필 이미지
Daniel

작성한 질문수

질문하기