Vector of Locally Aggregated Descriptors (VLAD) 소개
VLAD는 BOF 기반(BoVW) 방법론들을 개선하여 더 적은 연산과 메모리 사용량으로 높은 성능을 낼 수 있는 handcrafted feature descriptor 생성 방법으로, Aggregating local descriptors into a compact image representation라는 논문에서 소개되었다.
이전 BOF 기반 방법과 유사하면서도, Histogram을 이용하지 않고 SIFT 등으로 뽑아낸 descriptor vector를 누적하는 방법을 사용하여 성능이 향상되었다.
VLAD를 소개한 논문에서는 이외에도 quantization 등의 방법을 통해 연산량과 메모리 사용량까지 줄였는데, 이번 글에서는 VLAD를 통한 이미지의 표현 방법에 집중해보겠다.
Extracting Local Descriptions
VLAD의 실행 과정은 전체적으로 BOF와 비슷하니, 필자의 이전 글을 참고하여도 좋다.
그래도 한번 다시 소개를 해보자면, 먼저 이미지에서 특징점들을 추출해준다.
Dense SIFT와 같은 방법을 이용하여, 이미지에서 Local Descriptor라고 하는 특징점들을 추출한다.
이미지의 각 영역은 $D$ 사이즈의 벡터로 표현되어 한 개의 이미지는 $(m, D)$ 형태의 행렬로 변환된다.
($m$은 이미지에서 추출한 descriptor의 갯수이다.)
Codebook Generation
전체 이미지 $n$개에서 local descriptor들을 추출하여 $(n, m, D)$의 데이터를 얻었다.
이제 뽑아낸 특징들을 가장 잘 대표하는 $k$개의 군집들을 K-means 군집화를 통해 생성한다.
이렇게 $(k, D)$ 크기의 codebook을 얻었다.
Description - Codebook Accumulation
이제 한 이미지를 VLAD Description으로 변환할 차례이다.
우리는 한 이미지에서 추출한 $(m, D)$ 형태의 local description들과, $(k, D)$ 형태의 codebook을 가지고 있다.
먼저, 이미지에서 추출한 $m$개의 descriptor들을 가장 유사한 codebook 속 centroid와 매칭한다.
(그 다음 매칭들의 갯수를 세어 histogram을 만들면 BoVW 방법이다.)
그 다음, 매칭된 descriptor들과 codebook 사이의 차이(잔차)를 구한다.
이 잔차들을 모두 더하여 $(k, D)$ 형태로 만든다.
예를들어, 어떤 descriptor $(d_1 = [1, -4], d_4 = [2, 1])$들이 codebook 속 centroid $c_{19} = [1, 1]$와 매칭되었다면, 최종 image descriptor의 $19$번째 값은 $v_{19} = [1-1+1-2, 1+4 + 1-1] = [-1, 5]$이 된다.
이렇게 생성된 $(k, D)$ 형태의 행렬을 flatten하여 $k\times D$ 크기의 벡터를 만든다.
L2 Normalization
마지막으로 벡터를 L2 정규화하여 scale을 조정해준다.
VLAD Descriptor로 이미지를 표현하는데 성공하였다!
파이썬 코드
def VLAD(descriptor, codebook):
"""
:param descriptor: 이미지 한 장에서 추출한 (m, D) 크기의 local descriptors
:param codebook: 학습 데이터로 생성한 (k, D) 크기의 codebook
:return desc: 생성된 (k, D) 크기의 VLAD description
"""
desc = np.zeros([codebook.shape[0], descriptor.shape[1]]) # (k, D) -> (200, 1024) # [k, D] 사이즈의 tensor 생성
index = vq.vq(descriptor, codebook)[0] # 각 local descriptor와 유사한 visual word 매칭 (vq 라이브러리 사용)
for i, d in enumerate(descriptor):
desc[index[i]] += codebook[index[i]] - d # 각 visual word에 매칭된 local description들의 잔차를 누적
return desc / np.linalg.norm(desc, 2)
'Deep Learning > 영상처리' 카테고리의 다른 글
Bag of Visual Words (BoVW) (2) | 2023.03.10 |
---|---|
이미지 변형 (Image Transformation) (1) | 2023.03.09 |
SIFT: Scale Invariant Feature Transform을 이용한 Feature Matching (0) | 2023.03.08 |
SIFT: Scale Invariant Feature Transform 을 이용한 Blob Detection (0) | 2023.03.08 |
코너 검출 (Corner Detection) (0) | 2023.03.08 |
댓글
이 글 공유하기
다른 글
-
Bag of Visual Words (BoVW)
Bag of Visual Words (BoVW)
2023.03.10 -
이미지 변형 (Image Transformation)
이미지 변형 (Image Transformation)
2023.03.09 -
SIFT: Scale Invariant Feature Transform을 이용한 Feature Matching
SIFT: Scale Invariant Feature Transform을 이용한 Feature Matching
2023.03.08 -
SIFT: Scale Invariant Feature Transform 을 이용한 Blob Detection
SIFT: Scale Invariant Feature Transform 을 이용한 Blob Detection
2023.03.08