🎡

Deformable Convolutional Networks

Tags
Model Architecture
Created
2021/01/31 08:43
Publication
ICCV'17
Rate
4
Source
https://arxiv.org/abs/1703.06211
Summary
표준적인 convolution layer나 pooling layer의 receptive field는 그리드 모양이다. 즉 그 계산 과정을 생각해보면 쉽게 알 수 있듯, convolution layer나 pooling layer는 이미지의 직사각형 범위를 대상으로 패턴을 인식한다. 이는 비전 모델에 분명한 한계를 안겨주는데, 현실 세계의 이미지에는 카메라의 각도, 물체의 자세나 상태, 위치 등에 의해 다양한 형태의 변형이 나타날 수 있기 때문이다. Deformable convolution(pooling) layer는 이름에서도 알 수 있듯, 이러한 그리드 모양이라는 제한에서 벗어나 적절한 receptive field의 형태를 데이터로부터 학습하도록 고안된 layer이다. (상세 페이지 참고)
표준적인 convolution layer나 pooling layer의 receptive field는 그리드 모양이다. 즉 그 계산 과정을 생각해보면 쉽게 알 수 있듯, convolution layer나 pooling layer는 이미지의 직사각형 범위를 대상으로 패턴을 인식한다. 이는 비전 모델에 분명한 한계를 안겨주는데, 현실 세계의 이미지에는 카메라의 각도, 물체의 자세나 상태, 위치 등에 의해 다양한 형태의 변형이 나타날 수 있기 때문이다. Deformable convolution(pooling) layer는 이름에서도 알 수 있듯, 이러한 그리드 모양이라는 제한에서 벗어나 적절한 receptive field의 형태를 데이터로부터 학습하도록 고안된 layer이다.

Deformable Convolution

먼저 일반적인 3×33 \times 3 convolution을 생각해보자. 그러면 convolution kernel의 각 위치를 다음과 같이 표현할 수 있다.
R={(1,1),(1,0),...,(0,1),(1,1)}R = \{ (-1, -1), (-1, 0), ..., (0, 1), (1, 1) \}
각 위치 pnRp_n \in R의 kernel value를 w(pn)w(p_n)라 표시하고, feature map(혹은 이미지) 위 임의의 위치 p0p_0의 픽셀 값을 x(p0)x(p_0)라 표시하자. 그러면 임의의 위치 p0p_0에서의 일반적인 convolution 연산은 다음과 같다.
y(p0)=pnRw(pn)x(p0+pn)y(p_0) = \sum_{p_n \in R}{ w(p_n) x(p_0 + p_n) }
이제 deformable convolution은 위 연산의 x(..)x(..) 위치에 offset Δpn\Delta{p_n}을 더함으로써 임의의 형태의 receptive field를 표현한다.
y(p0)=pnRw(pn)x(p0+pn+Δpn)y(p_0) = \sum_{p_n \in R}{ w(p_n) x(p_0 + p_n + \Delta{p_n}) }
일반적으로 Δpn\Delta{p_n}는 (정수가 아닌) 유리수이기 때문에, x(p)x(p)의 값은 bilinear interpolation으로 도출한다.
그러면 이제 offset의 값을 구해야겠다. Offset은 동일한 input feature map에 수행하고자 하는 convolution layer와 동일한 kernel size(위 예시에서는 3×33 \times 3)를 가진 convolution 연산을 통해 계산한다. Output channel dimension은 (kernel size $N$에 대해 - 위 예시에서는 N=9N = 9) 2N2N이며, kernel의 각 위치에 대한 offset 좌표 (x,y)(x, y)를 나타낸다. 따라서 output feature map의 각 위치는 input feature map의 동일한 위치를 나타내며, 따라서 output feature map의 resolution은 input feature map과 동일하다. (이 부분 불명확하다. convolution 연산을 가했는데 feature map size가 동일하다면 padding이나 stride 설정은 어떻게 되는 걸까?) 이러한 convolution layer는 backward propagation을 통해 다른 layer와 동시에 학습된다.

Deformable RoI Pooling

RoI(Region of Interest) pooling layer는 RCNN 계열의, 즉 Region Proposal을 통해 object detection을 수행하는 모델에서 서로 다른 크기의 RoI를 동일한 규격으로 통일하기 위해 사용된다. 간단히 말하면, k×kk \times k RoI pooling layer는 input feature map을 k×kk \times k bin으로 나눈 다음, 각 bin의 값의 평균(혹은 최대)값을 취하여 해당 bin의 값에 할당함으로써 k×kk \times k feature map을 출력한다.
즉 임의의 bin bin(i,j)bin(i, j)과 feature map의 top-left corner p0p_0 에 대해 다음과 같은 값을 할당한다.
y(i,j)=pbin(i,j)x(p0+p)/nijy(i, j) = \sum_{p \in bin(i, j)}{ x(p_0 + p)/n_{ij} }
그러면 위와 동일하게 deformable RoI pooling에서는 offset을 더하여 임의의 pooling field를 형성한다.
y(i,j)=pbin(i,j)x(p0+p+Δpij)/nijy(i, j) = \sum_{p \in bin(i, j)}{ x(p_0 + p + \Delta{p_{ij}})/n_{ij} }
역시 Δpij\Delta{p_{ij}}는 유리수이기 때문에 bilinear interpolation을 이용하며, offset은 pooled feature map에서 FC layer 연산을 통해 구한다. RoI pooling은 한물 간 구시대의 산물이니 더 자세하게 적지는 않도록 한다.
Deformable convolution(RoI pooling) layer는 기존의 convolution(RoI pooling) layer와 동일한 규격의 데이터를 출력하기 때문에, 기존의 프레임워크에 쉽게 적용할 수 있다. 이 때 페이퍼에서는 offset을 학습하는 convolution(혹은 FC) layer의 weight을 0으로 초기화하고, 학습률에 β(=0.01)\beta(= 0.01)를 곱하여 조정한다. 학습은 bilinear interpolation을 포함하여 backward propagation으로 동일하게 진행된다.
또한 페이퍼에서는 기존의 프레임워크의 convolution layer를 deformable로 바꾸는 실험을 진행하는데, kernel size가 2 이상인 마지막 1~6개의 convolution layer를 대체한다. 왜 그런지는 모르겠지만, 주로 마지막의 layer들을 바꾸나 보다. 페이퍼에서는 3개의 deformable convolution layer가 적절한 trade-off를 보여주었다고 밝힌다. 효용이 꽤 직관적이기 때문에 굉장히 흥미로운 페이퍼였다.
E.O.D.