《基于非对称循环哈希算法(ACH)的大规模图像检索》阅读笔记

来源:互联网 发布:淘宝卡片祝福语幽默 编辑:程序博客网 时间:2024/05/21 07:11
哈希算法分为两个阶段,一是投影阶段,将高维图像数据映射到低维子空间。将高维的数据通过一个余弦函数,其中余弦函数的参数都是随机设定的,这样得出来的向量就是映射的向量;二是量化阶段,哈希编码本质上就是一串二进制数。在阶段一中得出来的映射空间经过一系列的训练可以训练出旋转矩阵R和k字节的短编码组成的存储图片矩阵B,训练出来的R和B用来构成哈希函数G和F。同一个映射向量经过F和G后会形成相同的哈希编码。把最后形成的哈希编码计算出汉明距离,用来度量相似性程度,距离越大的相似性程度越小,距离越小相似性程度越大。
刚开始接触哈希算法时,阅读的是英文文献。对于一个研一的新手第一次接触英文文献,而且还要把里边的算法复现出来,确实是一个挑战。不过这种带着目的性的去读英文文献可以提高效率,知道那不足就去学啥。在这里总结出一点阅读英文文献的小心得。如果你带着复现算法的想法去阅读英文文献,可以只读摘要,前言,和核心算法部分,其余的部分只是本作者进行本算法研究的相关工作,和别的算法比较自己优越性而已。其实只要 你能实现他的算法一切都好说了。当我们读完之后,对这个算法的作用和主要算法是有了一个大概的框架,这起码也是有了一个感性认识。不过当我们刚开始接触一个新算法的时候,最好用百度搜索一下,毕竟我们还是看中文的材料比较多,这样能让我们更快的接受。通过以上了解我们能有一个感性的认识。这样的感性认识起码能让我们了解本篇文献的创新点在哪里,起码能让我们知道哪些工作是在前人的基础上做的。这样我们就可以上网搜索一些现成的代码,加以理解吸收之后就可以为自己复现代码所用。当然到了作者创新的地方,又加上网上没有现成的代码,这时候就要靠自己的编程实力了。当然,我们面对文献里的数学公式都会有一种恐惧感,更何况面对自己不是很适应的英文文献了。这时候没有别的办法,就是塌下心来仔细读,当然,对于复现代码来说是简单些了,因为你不用管里边的推导过程,只需要用公式编出程序来就OK了。显然,在这个时候你一定要懂得重要公式的物理含义以及每一个符号代表什么。一遍读不懂多读几遍,读书百遍其义自现这可不是瞎说的,多读一遍就会加深一层认识,按照数学的极限原理,你就能逐渐达到复现代码的程度,总之遇到困难就要不断的鼓励自己,相信自己一定能做到,结果一定不会错的。好了,以上就是我阅读英文文献复现代码的一些感想。我知道说啥都没用,上代码才是硬道理,哈哈,下面我就附上我自己编的代码。

clear  all;close all;clc;%%%%%参数设置path='.\pictures\';img_path_list=dir(strcat(path,'*.jpg'));nums=length(img_path_list);In_D=3072;m=2;Out_D=192;k=Out_D/m;W=randn(In_D,Out_D)*sqrt(1);b=(rand(1,Out_D)*2*pi)';Y=zeros(Out_D,nums);B=zeros(k,nums);%%%查询图片映射到n维空间Img=imread('car.jpg');Img1=imresize(Img,[32,32]);x1=double(reshape(Img1,In_D,1));y=sqrt(2)*cos(W'*x1+b)*(1/sqrt(Out_D));%%%图片库映射到n维空间for i=1:nums    img_name=img_path_list(i).name;    I=imread(strcat(path,img_name));    I=imresize(I,[32,32]);%%彩色图像有三通道    x=double(reshape(I,In_D,1));    Y(:,i)=sqrt(2)*cos(W'*x+b)*(1/sqrt(Out_D));endA = normrnd(0, 1, Out_D, Out_D);  [R, Q] = qr(A);%%%%奇异值分解%%%%%%%%%迭代优化R和BFai_sum=zeros(k,nums);for s=1:50Fai=R'*Y;for r=1:k    for x=0:(m-1)    Fai_sum(r,:)=Fai_sum(r,:)+Fai(x*k+r,:);    endendfor i=1:k    for j=1:nums               B(i,j)=sign(Fai_sum(i,j));           endendB_xunhuan=repmat(B,m,1);[U,S,V]=svd(Y*(B_xunhuan)');R=U*V';end%%%%%%存储图片编码G=zeros(k,nums);H=zeros(Out_D,1);H1=zeros(k,m);H2=zeros(k,1);for s=1:numsH(:,1)=R'*Y(:,s);H1=reshape(H,k,m);H2=(sum(transpose(H1)))';G(:,s)=sign(H2);end%%%%查询图片编码F=zeros(Out_D,1);F(:,1)=sign(R'*y);%%%%%%%%%计算汉明距离D=zeros(k,nums);a=zeros(k,1);b=zeros(k,1);F_D=reshape(F,k,m);%%%%%%计算权值for i=1:k    for j=1:m        if(F_D(i,j)==-1)            a(i,1)=a(i,1)+1;        end            if(F_D(i,j)==1)                b(i,1)=b(i,1)+1;            end           endend%%%%%权值加和for i=1:nums    for j=1:k    if(G(j,i)==1)   D(j,i)= a(j,1);    end   if(G(j,i)==-1)       D(j,i)=b(j,1);   end    end    endD_Col=sum(D);%%%%%%%把汉明距离按升序排列[sortedD_Col,pos]=sort(D_Col);% n=zeros(1,2);% for i=1:nums%    if(D_Col(1,i)<MIN)%        MIN=D_Col(1,i);%     KeepPos=i;%    end% endsubplot(131);imshow(Img);title('原图');subplot(132);imshow(strcat(path,img_path_list(pos(1)).name));title('相似的图片');subplot(133);imshow(strcat(path,img_path_list(pos(2)).name));title('相似的图片');



1 0