TensorMask 논문읽기

Source: Deep Learning on Medium

배경 & 목표

현재 instance segmentation은 대부분 Mask RCNN에서 사용한 객체의 위치를 찾고 그 피쳐맵을 잘라내서 segmentation을 하는 방법을 사용한다. Instance segmentation을 Bounding Box를 찾듯이 dense하게 예측할 수 없을까?

백본 네트워크에서 나오는 피쳐맵 (BS, C, H, W)을 (BS, V, U, H, W)로 나누어 (U, V)를 H, W를 기준으로 하는 새로운 그리드 셀을 생성한다. V, U는 H, W처럼 독립적인 2개의 축을 가진다.

V, U 의 표현을 정확하게 하기 위해서 unit of length(unit)를 정의한다. H, W에서 unit은 단순히 줄어드는 stride와 같다. 예를 들어, res4 stage 아웃풋의 stride는 16이므로(input / 16 이 res4의 아웃풋 피쳐맵 사이즈) unit(HW)는 16이다. 나는 이 표현을 피쳐맵의 한 엘리멘트가 인풋 이미지의 몇 픽셀을 담당하는지 표현하는 것 이라고 이해했다. unit은 VU 축에서도 마찬가지로 VU 축의 피쳐맵 한 엘리멘트가 이미지의 몇 픽셀을 담당할 것인지 결정하는 단위다.
논문에 나온 예를 들자면 unit(VU)를 1으로 정했다고 할 때 tensor (V, U, H, W)에서 VU 축 텐서인 V * U은 각 엘리멘트가 인풋 이미지 1픽셀을 담당한다. 그래서 V * U 가 이미지 사이즈와 같은 윈도우인 V * U가 된다.
unit(VU)가 2라고 하면 각 엘리멘트가 인풋 이미지 2픽셀을 담당해서 이미지윈도우는 2V * 2U가 된다.

TensorMask방법을 사용하면 align 문제가 발생한다. 단순히 말해서 마스크 예측이 잘 안된다. 저자는 이 이유를 align에서 찾았고 aligned representation에서 natural representation으로 변환해 해결했다.
align 문제가 일어나는 이유를 생각해 보자면. 마스크를 예측하는 텐서인 V, U가 결국은 채널에서 나온 정보고 각기 다른 위치의 픽셀을 예측하는데 receptive field는 동일하기 때문이다. 그래서 예측하는 픽셀 위치(H, W기준)의 텐서 하나를 가져와서 사용한다(natural representation).
요약하자면 aligned representation은 모델을 통과한 피쳐맵의 상태이고 (피쳐맵의 HW엘리멘트가 자신의 receptive field만큼의 정보만 가지고 있는 상태) natural representation은 V, U, H, W 텐서의 V, U가 예측하는 이미지 픽셀의 정보를 가지고 있는 상태이다.

Aligned Representation(v, u, y + av, x + au)
= Natural Representation(v, u, y, x)

나머지는 아키텍쳐에 대한 내용으로 간략하게 정리하면, H, W의 stride에 맞춰서 V, U의 사이즈도 늘려줘서 unit(VU)는 동일하게 유지하고 unit(HW)는 2배수로 늘여준다.
FPN을 쓰는데 가장 낮은 resolution에 맞춰 피쳐맵을 C, H, W로 만들어준다. V,U는 2의 배수로 늘여주기 위해 bilinear interpolation하고 H, W는 원 피쳐맵상태로 줄여주기 위해 subsample한다.

representation을 바꿔주는 부분이나 interpolation, subsample 부분의 구현이 궁금해서 코드 오픈을 기다리고 있다.