行人重识别是这几年比较火的话题,主要研究不同摄像头之间人物的匹配。
比如就是上图,摄像头
A和摄像头
B之间人物匹配。其中有很多影响信息,比如
次要人物,
人物姿势,
光线强弱等等,所以我们现在采用
HOG3D技术,能够比较好的兼顾这几个关键信息。
数据处理
其中
A和
B摄像头的数据都是
178∗2905的矩阵,代表
178个人,每个人
2905个参数。
其中
2095的参数量太大了,我们需要进行
pca主成分分析,这里采取
matlab自带
pca函数就好了。
eigenVectors = pca(X');
transMatrix = eigenVectors(:,1:pars.dem_pca);
X = transMatrix' * X;
我们现在的任务是:
首先每个人的数据不一定是只有一个,那么我们需要将每个人的数据都单独弄成一个
cell,代码如下:
function Cell = matTcell(Mat, count, pars)
if nargin == 2
pars.num = length(count);
elseif nargin == 1
pars.num = size(Mat,2);
count = ones(1,pars.num);
end
Cell = cell(1, pars.num);
S = 1;
for i = 1:pars.num
E = S + count(i) - 1;
Cell{i} = Mat(:, S:E);
S = E + 1;
end
end
其次,我们的工作就是将数据分为
TrainData和
GalleryData和
TargetData。
我们假设现在数据为
A[178∗177],B[178∗177],其中
cv_split_prid.mat还包含着对数据的划分,其中的内容也就是
randperm(178),名字为
ls_set。
TrainData=[A(ls_set(1),:),B(ls_set(1),:),A(ls_set(2),:),B(ls_set(2),:)...A(ls_set(78),:),B(ls_set(78),:)]GalleryData=[A(ls_set(79),:),A(ls_set(80),:)...A(ls_set(178,:))]TargetData=[B(ls_set(79),:),B(ls_set(80),:)...B(ls_set(178,:))]
当时这个划分只是针对这个数据,具体划分还请下面参考代码。
function [xtr, ctr, xg, cg, xt, ct]= spilt_dataset(cam1_feat, cam2_feat, target, pars)
Train_num = fix(pars.num/2);
Gallery_num = pars.num - Train_num;
Traintarget = target(1:Train_num);
xtr=[]; ctr=zeros(1, Train_num);
xg=[]; cg=ones(1, Gallery_num);
xt=[]; ct= zeros(1, Gallery_num);
for i = 1:Train_num
now = [cam1_feat{Traintarget(i)},cam2_feat{Traintarget(i)}];
num = size(now, 2);
if num>pars.threshold
target_temp = randperm(num);
xtr =[xtr now(:,target_temp(1:threshold))];
ctr(i) = threshold;
else
xtr =[xtr now];
ctr(i) = num;
end
end
rest1 = cam1_feat; rest1(:, Traintarget) = [];
rest2 = cam2_feat; rest2(:, Traintarget) = [];
for i = 1:Gallery_num
now1 = rest1{i}; num1 = size(now1, 2);
now2 = rest2{i}; num2 = size(now2, 2);
if pars.shot_flag
temp1 = randperm(num1);
xg= [xg now1(:, temp1(1))];
elseif num1 > pars.threshold
temp1 = randperm(num1);
xg = [xg now1(:,temp1(1:threshold))];
cg(i) = threshold;
else
xg = [xg now1];
cg(i) = num1;
end
if num2 > pars.threshold
temp2 = randperm(num2);
xt = [xt now2(:, temp2(1:threshold))];
ct(i) = threshold;
else
xt = [xt now2];
ct(i) = num2;
end
end
end
距离函数DM(xi,xj):
我们为了有效的测量两组数据之间的距离,我们采用下面这种
马氏距离测量距离:
DM(xi,xj)=(xi−xj)T∗M∗(xi−xj)
其中这里的
M就是我们需要学习的参数。
损失函数J(M):
我们现在的目标是:
一、 尽量的缩小匹配数据之间的
dis,
二、 尽量使不匹配数据和匹配数据之间间隔一个
margin。
所以我们定义我们的损失函数为: