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

hgene0929님의 프로필 이미지
hgene0929

작성한 질문수

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

opencv DNN을 이용하여 Mask RCNN Inference 수행 - Inference 수행 후 Mask 결과 시각화

질문드립니다!!

작성

·

143

0

안녕하십니까,

이게 opencv에서 한번에 가능한 함수가 있는지 잘 모르겠군요.

제 생각에 이렇게 하시면 될것 같은데 테스트는 해보지 않았습니다.

먼저 segmentation inference 결과인 mask 이미지 array가 있을 때

mask_array = inference_segentation결과 반환 array

해당 mask_array에서 값이 0 이상인 위치 인덱스를 뽑아내서 non_zero_indexes에 저장합니다.

non_zero_indexes = np.where(mask_array > 0 )

다음에 원본 이미지 array를 org_img_array라고 하면 원본 이미지의 해당 non_zero_indexes 위치에 있는 원소값을 모두 0으로 만듭니다.

org_img_array[non_zero_indexes] = 0

이렇게 하면 원본 이미지에서 segmentation mask결과 영역만 검은색으로 표시됩니다.

이제 덮어 씌우려는 새로운 이미지를 해당 영역만 제외하고 나머지 영역은 mask를 적용하듯이 모두 0으로 만듭니다. 이렇게 만든 새로운 이미지를 new_img_array라고 하겠습니다.

그런 다음 opencv의 add() 연산을 이용하여 org_img_array와 new_img_array를 더하면 원하시는 이미지가 만들어 질것 같습니다.

added_new_img_array = cv2.add(org_img, array, new_img_array)

감사합니다.

에 관한 질문입니다!!

안녕하세요 선생님 너무 감사하게도 친절한 답변을 남겨주신 덕분에 실습을 잘 진행하고 있는 학생입니다.

다름이 아니라 알려주신 코드로 실습을 진행하는 와중에 궁금한 점이 생겨 질문드립니다.

위에서 봐주신 코드를 제가 이해하기론

mask_array = inference_segentation결과 반환 array

=> mask_array = s_mask_b (object 를 감지한 결과를 원본 이미지만큼 scale out 한 배열)

non_zero_indexes = np.where(mask_array > 0 )

=> non_zero_indexes = np.where(mask_array > 0 ) (mask 배열값 중 object라고 인지한 인덱스의 배열)

org_img_array[non_zero_indexes] = 0

=> draw_img = img.copy()

draw_img[non_zero_indexes] (원본 이미지를 복사한 배열 중 object라고 인지한 인덱스의 배열을 0으로 만듦)

가 맞나요?

 

답변 1

0

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

네, 지난번에 적어드린 코드가 pseudo code긴 한데, 이해하신 부분이 대부분 맞습니다.

그리고 mask_array = s_mask_b

를 object 를 감지한 결과를 원본 이미지만큼 scale out 한 배열이라고 적어주셨는데 mask_array는 scale out한 배열은 아닙니다.

mask_array는 원본 이미지의 사이즈와 크기가 동일한 array입니다. 다만 원본 이미지는 3차원이지만 mask_array는 2차원 입니다. MMDetection을 이용한 Mask RCNN Inference 실습 - Masking inference 반환 결과 분석 강의 영상을 다시 보시면 mask inferece 결과값이 어떻게 되는지 확인 하실 수 있습니다.

그리고 non_zero_indexes = np.where(mask_array > 0 )를 하게 되면 tuple 값이 반환되는데 detect 된 object의 instance segmentation 행과 열의 좌표값을 가지게 됩니다. 그래서 원본 이미지에 해당 instance segmentation 영역을 검은색(0값)으로 표시하려면

non_zero_indexes = np.where(mask_array > 0 )

draw_img = img.copy()

draw_img[non_zero_indexes[0], non_zero_indexs[1], :] = 0 하시면 됩니다.

 

 

hgene0929님의 프로필 이미지
hgene0929

작성한 질문수

질문하기