Bag - of - Visual - Works SIFT 구현 (matlab 버 전)
(copy 상기 링크 2 의 절차 설명)
훈련 집합 에 M 폭 의 그림 이 있다 고 가정 하고 훈련 이미지 집합 을 미리 처리 합 니 다. 이미지 강화, 분할, 이미지 통일 형식, 통일 규격 등 을 포함 합 니 다. 1. SIFT 특징 을 추출 합 니 다. 그림 마다 SIFT 특징 을 추출 합 니 다. (그림 마다 몇 개의 SIFT 특징 을 추출 합 니까?)... 모든 SIFT 특징 은 128 차원 의 설명자 벡터 로 M 폭 이미지 에서 N 개의 SIFT 특징 을 추출한다 고 가정 합 니 다. 2. K - means 로 2 에서 추출 한 N 개의 SIFT 특징 을 집합 합 니 다. K - Means 알고리즘 은 샘플 간 유사 성 을 바탕 으로 하 는 간접 집합 방법 입 니 다. 이 알고리즘 은 K 를 매개 변수 로 N 개의 대상 을 K 개의 클 러 스 터 로 나 누 어 클 러 스 터 내 에서 비교적 높 은 싱크로 율 을 가지 게 하고 클 러 스 터 간 의 싱크로 율 을 가지 게 합 니 다.유사 도가 낮 습 니 다. 집합 중심 에는 k 개 (BOW 모델 에서 집합 중심 은 시각 어 라 고 부 릅 니 다) 가 있 습 니 다. 코드 북 의 길이 도 k 입 니 다. 각 그림 의 모든 SIFT 특징 을 이 k 개의 시각 단어의 거리 로 계산 하고 이 를 가장 가 까 운 시각 단어 에 투사 합 니 다 (곧 이 시각 단어의 대응 단어 주파수 + 1).이 단 계 를 마 친 후, 모든 그림 은 시각 단어 서열 에 대응 하 는 주파수 벡터 가 되 었 습 니 다. 3. 구조 코드 북. 코드 본 벡터 귀 일 화 는 각 그림 의 SIFT 특징 개수 가 정 해 지지 않 기 때문에 귀 일 화 를 필요 로 합 니 다. 테스트 이미지 도 예비 처 리 를 거 쳐 SIFT 특징 을 추출 하여, 이러한 특징 을 코드 본 벡터 에 투사 하고, 코드 본 벡터 를 획일 화 하 며, 마지막 으로 계산 해 야 합 니 다.훈련 코드 북 과 의 거 리 는 최근 거리 에 대응 하 는 훈련 이미지 가 테스트 이미지 와 일치 하 다 고 생각 합 니 다.
3. matlab 구현
위 링크 3 의 vlfet 도구 상 자 를 설치 해 야 합 니 다.
clear all
[~,Image_names_train,~] = textread('trainset_txt_img_cat.txt','%s%s%[^
]') ; %
[~,Image_names_test,~] = textread('testset_txt_img_cat.txt','%s%s%[^
]'); %
n_train = size(Image_names_train,1);
n_test = size(Image_names_test,1);
numClusters = 128;
D = [];
train_flag = [];
test_flag = [];
%% ,SIFT
for i=1:n_train
img = Image_names_train{i};
t = strcat(img,'.jpg');
Image = imread(t);
mysize = size(Image);
if numel(mysize)>2
Image = rgb2gray(Image);
end
Image = im2single(Image);
[~,Di] = vl_sift(Image);
D = [D Di];
train_flag(i) = size(Di,2);
end
for i=1:n_test
img = Image_names_test{i};
t = strcat(img,'.jpg');
Image = imread(t);
mysize = size(Image);
if numel(mysize)>2
Image = rgb2gray(Image);
end
Image = im2single(Image);
[~,Di] = vl_sift(Image);
D = [D Di];
test_flag(i) = size(Di,2);
end
%%
D = im2single(D);
[centers] = vl_kmeans(D, numClusters); % + K
flag_sum = 0;
for i = 1:n_train
H = zeros(1,numClusters);
Di = D(:,flag_sum+1: flag_sum + train_flag(i));
flag_sum = flag_sum + train_flag(i);
for j=1:train_flag(i)
[~, k] = min(vl_alldist(Di(:,j), centers)) ; % SIFT k
H(k) = H(k) + 1; % ( +1)
end
my_I_tr(i,:) = 1/train_flag(i) * H; % SIFT , 。
end
for i = 1:n_test
H = zeros(1,numClusters);
Di = D(:,flag_sum+1: flag_sum + test_flag(i));
flag_sum = flag_sum + test_flag(i);
for j=1:test_flag(i)
[~, k] = min(vl_alldist(Di(:,j), centers)) ;
H(k) = H(k) + 1;
end
my_I_te(i,:) = 1/test_flag(i) * H;
end