re-id

2019-07-14 12:29发布

行人重识别是这几年比较火的话题,主要研究不同摄像头之间人物的匹配。
如上图
比如就是上图,摄像头AA和摄像头BB之间人物匹配。其中有很多影响信息,比如次要人物人物姿势光线强弱等等,所以我们现在采用HOG3DHOG3D技术,能够比较好的兼顾这几个关键信息。

数据处理

数据展示
其中AABB摄像头的数据都是1782905178*2905的矩阵,代表178178个人,每个人29052905个参数。
其中20952095的参数量太大了,我们需要进行pca主成分分析,这里采取matlabmatlab自带pcapca函数就好了。 eigenVectors = pca(X'); transMatrix = eigenVectors(:,1:pars.dem_pca); X = transMatrix' * X; 我们现在的任务是:
首先每个人的数据不一定是只有一个,那么我们需要将每个人的数据都单独弄成一个cellcell,代码如下: 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 其次,我们的工作就是将数据分为TrainDataTrainDataGalleryDataGalleryDataTargetDataTargetData
我们假设现在数据为A[178177],B[178177]A[178*177],B[178*177],其中cv_split_prid.matcv\_split\_prid.mat还包含着对数据的划分,其中的内容也就是randperm(178)randperm(178),名字为ls_setls\_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),:)]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,:))]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,:))]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):D_M(vec{x_i},vec{x_j}):

我们为了有效的测量两组数据之间的距离,我们采用下面这种马氏距离测量距离:DM(xi,xj)=(xixj)TM(xixj)D_M(vec{x_i},vec{x_j})=(vec{x_i}-vec{x_j})^T*M*(vec{x_i}-vec{x_j})
其中这里的MM就是我们需要学习的参数。

损失函数J(M):J(M):

我们现在的目标是:一、 尽量的缩小匹配数据之间的disdis二、 尽量使不匹配数据和匹配数据之间间隔一个marginmargin
所以我们定义我们的损失函数为: