본문 바로가기

OpenCV

선형 보간법과 쌍선형 보간법

320x100
320x100

 

 

 

 다양한 Conv 연산 방법들 중 하나인 Deformable Conv에 대해 공부하기 위해 [논문] Deformable Convolutional Networks을 읽던 중, 쌍선형 보간법(Bilinear Interpolation)이라는 처음 보는 개념을 접하게 됐다. 보간법, 선형 보간법은 들어봤는데 쌍선형 보간법은 뭘까? 그래서 이 놈은 무엇인지 구글링하면서 공부 좀 해봤고, 그 과정에서 깨달은 내용들을 수식과 코드 위주로 정리해놓고자 한다.

 

 

보간법 ?

 

이미 알려진 값들을 활용하여 원하는 위치에서의 값을 추정하는 방법의 한 종류이다.

보간법, 선형 보간법, 쌍선형 보간법에 대한 더 자세한 정의는 여기에서 참고하길 바란다.

 

 

1. 선형 보간법

 우리는 이미 알고 있는 x1, y1, x2, y2, a 값을 활용하여 b의 값을 선형 보간법을 통해 추정할 수 있다. 이를 위해 우리는 식 (1)이나 식 (2) 처럼 x1, y1, x2, y2, a로만 구성된 b에 관한 식을 유도해주면 된다. 여기까지만 해도 b 값을 계산하는데는 아무 문제 없다.

 

 하지만 뒤에 이어질 쌍선형 보간법 수식 설명을 위해서는 b에 관한 식이 d1과 d2로 표현되도록 추가 유도를 해줄 필요가 있다. 그래서 그 과정을 추가로 정리했고, 이를 여기서는 최종식으로 부르고자 한다. 아무래도 최종식 형태가 일반 형태보다 덜 복잡하고, 코드 짜기에도 수월하고, 계산도 좀 더 간단하게 할 수 있어서 추가 식 유도를 해주는 것 같다.

 

 

코드를 짤 때는 최종식 형태를 참고해서 구현하면 된다.

 

 

 

2. 쌍선형 보간법

 쌍선형 보간법은 1차원 공간에서 사용하는 선형 보간법을 2치원 공간에서도 사용하기 위해 확장한 보간법이라 생각하면 된다. 예제를 통해서 점 P의 Pixel 값을 추정하는 과정에 대해 알아보자.

 

 

코드 구현은 간단하다.

import numpy as np

A = np.array([0,0,6])
B = np.array([3,0,10])
C = np.array([0,3,9])
D = np.array([3,3,12])
P = np.array([2,2,0])

d1 = (P - A)[0]
d2 = (B - P)[0]
d3 = (P - A)[1]
d4 = (D - P)[1]

fI = (d1*B[2] + d2*A[2]) / (d1 + d2)
fJ = (d1*D[2] + d2*C[2]) / (d1 + d2)
fP = (d3 * fJ + d4 * fI) / (d3 + d4)
  • [Line 3 ~ 7]
    이미 알고있는 좌표의 픽셀 값과 추정하고자 하는 점 P의 좌표 설정
  • [Line 9 ~ 16]
    쌍선형 보간법을 통해 점 P의 픽셀 값을 구하는 과정

 

 


 

 

 쌍선형 보간법은 Deformable Conv 연산 과정에서 수정된 kernel 좌표의 Pixel 값을 구하기 위해 사용된다. Deformable Conv는 효과가 좋아서 Classification 뿐만 아니라 Object Detection, Segmentation에서도 활용되고 있는데, 쌍선형 보간법 연산이 시간을 많이 잡아먹는 연산이라 학습 시간이 길어진다는 점이 한계점으로 지적받고 있다.

 

 다음 글에서는 Deformabel Conv에 대해 알아보도록 하자.

 

 


 

 

2021.09.28 추가

 

 원래 Deformable Conv에 대한 내용도 정리하려고 했는데 시간이 없어서... 공부하면서 직접 구현했던 코드 공유로 대신하고자 한다. https://github.com/ballentain6811/Custom_DeformableConvNet

 

GitHub - ballentain6811/Custom_DeformableConvNet: Tensorflow and Keras implementation of Deformable ConvNet

Tensorflow and Keras implementation of Deformable ConvNet - GitHub - ballentain6811/Custom_DeformableConvNet: Tensorflow and Keras implementation of Deformable ConvNet

github.com

 

 

 

 

[ 참고 사이트 ]

https://m.blog.naver.com/PostView.nhn?blogId=aorigin&logNo=220947541918&proxyReferer=https:%2F%2Fwww.google.com%2F

 

https://darkpgmr.tistory.com/117

 

https://programmingfbf7290.tistory.com/entry/%ED%94%BD%EC%85%80-%EA%B0%92%EC%9D%98-%EB%B3%B4%EA%B0%84-%EB%B0%A9%EB%B2%952-%EC%8C%8D%EC%84%A0%ED%98%95-%EB%B3%B4%EA%B0%84

 

https://mathbang.net/443