Bag of Words의 요약:
# BoW를 이해하기 위한 Toy example
# BoW algorithm analysis
# 2013/06/28, 2014/12/03 개선
# by funmv
#
from PIL import Image
from pylab import *
import os
from numpy import *
from scipy.cluster.vq import *
import sift
import vocabulary
# 물체의 class는 3개이다 (즉, 0~3/4~7/8~11의 4개씩 동일 물체를 다른 자세에서 찍었음. 아래 그림 참조)
imlist = ['ukbench00000.jpg', 'ukbench00001.jpg', 'ukbench00002.jpg', 'ukbench00003.jpg', 'ukbench00004.jpg', 'ukbench00005.jpg', 'ukbench00006.jpg', 'ukbench00007.jpg', 'ukbench00008.jpg', 'ukbench00009.jpg', 'ukbench00010.jpg', 'ukbench00011.jpg']
nbr_images=len(imlist)
featlist=[ imlist[i][:-3]+'sift' for i in range(nbr_images)]
"""for i in range(nbr_images):
sift.process_image(imlist[i], featlist[i])
"""
descr = []
descr.append(sift.read_features_from_file(featlist[0])[1])
descriptors = descr[0]
# sift.read_features_from_file(featlist[i])[0]:
# list of [pixel coord of each feature point, scale, rotation angle] for i-image
# size: (# of feature point x 4) for i-th image
#
# sift.read_features_from_file(featlist[i])[1]:
# list of [feature values] for i-th image
# size: (# of feature point x 128) for i-th image
for i in arange(1, nbr_images):
descr.append(sift.read_features_from_file(featlist[i])[1])
descriptors = vstack((descriptors, descr[i])) # stack of vector
#len(descr[0]): number of feature points -> 2276
#len(descr[0][1]): size of 1st feature vector -> 128
voc, distortion = kmeans(descriptors[::10,:],3,1) # select one per 10 rows, 3개의 word를 뽑아냄
len(voc) #3, voc = 3x128
len(voc[0]) #3
len(voc[1]) #128
nbr_words = voc.shape[0] #3
# (# of images, bins of histogram(= # of words))
# = (12x3)
imwords=zeros((nbr_images, nbr_words))
print imwords
words, distance = vq(descr[0],voc) # vector quantization
# len(words)->2276
# words: index vector of the cluster that each feature involves
# [1, 2, 1, 0, 1, 2, ...]
#voca = vocabulary.Vocabulary('ukbenchtest')
for i in range(nbr_images): # def project
hist = zeros((nbr_words))
words, distance = vq(descr[i],voc)
# 현재 im에 대해 각 feature가 속하는 word의 index와 이 word까지의 거리가 리턴
# index를 이용하여 해당 word에 보팅하여 histogram을 만듬
for w in words:
hist[w] += 1
imwords[i] = hist
print imwords # degree that each im involve to each cluster
"""
0 1 2 : cluster index (word가 3개이니까 index는 2까지)
[[ 766. 461. 1049.]: 1st image의 histogram의 모양
[ 725. 451. 1020.]: 2nd image의 "
[ 671. 461. 1133.]: ...
[ 1101. 630. 1403.]
[ 260. 317. 409.]
[ 267. 308. 370.]
[ 283. 394. 476.]
[ 239. 331. 410.]
[ 1105. 468. 1317.]
[ 116. 191. 390.]
[ 122. 251. 439.]
[ 1183. 597. 1475.]]: 12번째 im의 histogram모양
12번째 이미지의 모든 특징 중에서 word 0에 속하는 것은 1183개, 1번 597개, 2번 1475개이다. 3경우 합하면 특징의 개수이다. 따라서 test영상의 특징에 대한 histogram을 그리고 위 12개 중에서 hist모양이 비슷한 것을 찾으면 그것이 해당 영상이다.
"""
다음의 코드에서 voc의 내용을 알 수 있음.
댓글 없음:
댓글 쓰기