Deformable Convolution의 핵심은 일반 convolution의 고정 sampling 위치마다 학습 가능한 2차원 offset을 더하고, 정수가 아닌 위치의 값은 bilinear interpolation으로 읽는 것입니다. Kernel weight가 사라지는 것이 아니라 sampling 위치를 결정하는 offset branch가 추가됩니다. 적용 후 오류는 feature 계산, offset shape, 보간과 task 성능을 분리해 확인해야 합니다.
Deformable Convolution은 Offset을 어디에 더하나: DCN 수식 해설
고정 grid가 놓치는 기하학적 변화
일반 CNN은 고정된 위치에서 feature map을 sampling합니다. Pooling은 고정 비율로 해상도를 줄이고, RoI Pooling은 영역을 고정된 bin으로 나눕니다.
같은 종류의 물체라도 scale, 위치, 관점, 부분 변형이 달라질 수 있는데 이 고정 구조만으로는 sampling 모양을 물체에 맞춰 바꾸기 어렵습니다.
기존 글은 두 가지 대응을 소개합니다.
- 충분한 변형을 data augmentation으로 만들어 학습합니다.
- scale, rotation에 불변인 SIFT나 sliding-window 방식의 특징을 사용합니다.
DCN은 네트워크 내부의 sampling 위치 자체를 학습하는 세 번째 방향입니다. 논문이 제안한 모듈은 deformable convolution과 deformable RoI Pooling입니다.
Convolution 수식에서 바뀌는 한 항
Dilation 1인 3×3 convolution의 정규 grid R은 중심을 둘러싼 아홉 위치입니다. 일반 convolution은 출력 위치 p₀에서 다음처럼 계산합니다.
\[y(p_0) = \sum_{p_n \in R} w(p_n)\,x(p_0+p_n)\]Deformable convolution은 각 sampling 위치에 offset Δpₙ을 더합니다.
\[y(p_0) = \sum_{p_n \in R} w(p_n)\, x(p_0+p_n+\Delta p_n)\]3×3 grid에는 아홉 위치가 있고 각 위치의 offset은 x, y 두 값이므로, offset을 예측하는 convolution의 channel 수는 2N입니다.
학습된 offset은 일반적으로 정수가 아닙니다. feature map의 격자 사이 값을 읽기 위해 bilinear interpolation을 사용합니다.
\[x(p) = \sum_q G(q,p)x(q)\] \[G(q,p) = g(q_x,p_x)g(q_y,p_y)\] \[g(a,b) = \max(0, 1-|a-b|)\]여기서 p는 offset이 더해진 sampling 위치이고, q는 보간에 필요한 주변 격자 위치입니다.
이 구조 덕분에 offset까지 backpropagation으로 학습할 수 있습니다. 별도의 offset 정답을 제공하는 것이 아니라 task loss에서 sampling 위치를 조절한다는 것이 논문의 핵심입니다.
Deformable RoI Pooling은 bin을 움직인다
일반 RoI Pooling은 임의 크기의 RoI를 k×k bin으로 나누고 고정 크기 feature를 만듭니다.
\[y(i,j) = \frac{1}{n_{ij}} \sum_{p \in bin(i,j)} x(p_0+p)\]Deformable RoI Pooling은 각 bin 위치에 offset Δpᵢⱼ를 추가합니다.
\[y(i,j) = \frac{1}{n_{ij}} \sum_{p \in bin(i,j)} x(p_0+p+\Delta p_{ij})\]Fully connected layer가 정규화된 offset을 만들고, RoI의 너비 w와 높이 h 및 scale γ를 곱해 실제 offset으로 변환합니다. 원문에 기록된 γ는 0.1입니다.
\[\Delta p_{ij} = \gamma\, \Delta\hat{p}_{ij} \circ (w,h)\]Position-Sensitive RoI Pooling에서는 일반 feature map 대신 object class별 k² score map에서 해당 bin의 값을 모읍니다.
Convolution과 RoI Pooling의 공통 원리는 같습니다. 고정된 sampling 위치 또는 bin에 task가 학습한 offset을 더합니다.
기존 모델에 붙일 때 확인할 것
논문에서 deformable 모듈은 대응하는 일반 모듈과 입출력 크기가 같아 기존 모델의 일부를 대체할 수 있습니다. Offset을 예측하는 convolution layer와 fully connected layer의 weight는 0으로 초기화합니다. 초기에는 일반 sampling과 같은 위치에서 시작한 뒤 학습으로 변형되는 셈입니다.
구조를 구현에서 확인할 때는 다음 네 가지를 보면 됩니다.
- Offset branch가 어디의 feature에서 값을 예측하는지 확인합니다.
- Kernel 위치 수 N에 대해 2N개의 좌표가 나오는지 확인합니다.
- Fractional coordinate를 bilinear interpolation으로 읽는지 확인합니다.
- Detection model에서는 convolution뿐 아니라 RoI pooling도 deformable하게 바뀌는지 구분합니다.
기존 글은 object detection과 semantic segmentation에서의 효과를 소개하지만, benchmark 그림 하나만으로 모든 backbone과 task의 개선폭을 보장할 수는 없습니다.
기준 자료는 DCN 논문과 공식 코드입니다. 이 글은 설치, 학습 명령이 아니라 수식에서 실제로 바뀌는 좌표와 보간 과정을 이해하기 위한 해설입니다.
Offset 구현이 맞는지 어떤 작은 예제로 확인하나
먼저 offset을 모두 0으로 둔 상태에서 일반 convolution과 출력이 대응하는지 확인합니다. 같은 weight와 padding, stride를 사용했는데 결과가 다르면 변형 학습 이전에 tensor 순서나 보간 구현을 봐야 합니다. 이 baseline은 DCN이 기존 모델에서 시작한다는 의미도 보여 줍니다.
다음으로 offset tensor의 channel과 공간 크기를 출력합니다. 3×3 sampling 위치마다 x, y 두 값이 필요하므로 kernel 위치와 channel이 어떤 순서로 대응하는지 구현 계약을 확인합니다. Batch와 feature 해상도가 입력 layer의 출력과 맞지 않으면 좌표를 올바르게 더할 수 없습니다.
비정수 위치 하나를 고정해 주변 네 pixel의 bilinear 가중치와 합을 손으로 확인합니다. 좌표축 x, y를 뒤바꾸거나 이미지 밖 padding을 다르게 처리하면 학습은 실행돼도 기대한 geometry를 보지 않을 수 있습니다.
학습 중에는 offset의 분포와 시각화를 함께 봅니다. 모든 값이 계속 0에 가깝거나 경계 밖으로 지나치게 커지는 경우, gradient 연결과 learning rate, 데이터 신호를 확인합니다. 화려한 offset 그림 자체가 정확도 향상을 증명하는 것은 아니므로 task baseline과 비교합니다.
Deformable RoI Pooling에서는 feature sampling grid가 아니라 각 bin 위치에 offset이 적용된다는 차이를 유지합니다. 두 모듈의 offset shape와 좌표계를 같은 코드로 오해하지 않고, RoI 좌표 변환과 bin별 sampling을 따로 점검합니다.
함께 읽으면 이해가 이어지는 글
- Darknet col2im에서 픽셀값을 덮어쓰지 않고 +=로 더하는 이유 — Darknet col2im_cpu가 column buffer의 값을 원본 feature map 위치로 되돌릴 때 겹치는 kernel 기여를 누적하는 이유를 index 계산과 padding 경계 처리로 설명합니다.
- DarkNet image와 OpenCV Mat 변환: 채널 순서, 스트림 설정 주의점 — DarkNet의 CHW float image와 OpenCV의 HWC 8비트 Mat를 오갈 때 생기는 RGB, BGR 변환, VideoCapture 속성 설정 오류와 이미지 로드 실패 처리를 점검합니다.
- Latent Bridge Matching의 1 NFE는 정말 한 번의 계산일까: 수식, 속도, 한계 해설 — LBM이 source와 target latent 사이 stochastic bridge를 학습해 1회 drift network 평가로 변환하는 과정을 설명하고, VAE 비용, paired data, sigma와 NFE…
자주 묻는 질문
Deformable Convolution은 kernel weight 대신 offset만 학습하나요?
아닙니다. 일반 convolution weight와 함께 각 sampling 위치에 더할 2차원 offset도 학습합니다. Offset이 비정수 위치를 가리키면 bilinear interpolation으로 값을 계산합니다.
Offset에 별도 정답 좌표가 필요한가요?
이 구조의 offset은 detection, segmentation 같은 최종 task loss를 통해 학습됩니다. 특정 변형 좌표를 직접 label로 주는 방식이 핵심은 아닙니다.
DCN을 붙이면 모든 기하 변형에 강해지나요?
보장되지 않습니다. Offset layer가 올바르게 초기화, 연결되고 task 데이터가 필요한 변형을 포함해야 하며, 계산 비용과 구현 지원도 함께 확인해야 합니다.
←→ 키와 좌우 스와이프를 지원합니다. 읽던 페이지는 이 기기에 저장됩니다.