使用Gabor滤波器进行特征提取

问题描述 投票:0回答:1

我目前正致力于在Matlab中使用Gabor滤波器的特征提取系统。对于Gabor滤镜和图像卷积,我使用的是https://www.mathworks.com/matlabcentral/fileexchange/44630-gabor-feature-extraction中的代码,只是稍微调整了一下,供我自己使用。这个系统的面孔是从AT&T人脸数据库http://www.cl.cam.ac.uk/research/dtg/attarchive/facedatabase.html获得的,我使用了数据库中的9个主题。每个受试者有10个属于他/她的图像。使用Viola Jones我裁剪人脸图像并将其调整为128x128px。

此功能创建Gabor滤波器组。其中u = 5,v = 8,m,n = 39.因此得到的gaborArray由40个不同的Gabor滤波器组成,包括5个刻度和8个方向。我认为这两个功能正在按预期工作,因为它们来自经过批准的外部源。

function gaborArray = gaborFilterBank(u,v,m,n)
gaborArray = cell(u,v);
fmax = 0.25;
gama = sqrt(2);
eta = sqrt(2);

for i = 1:u    
    fu = fmax/((sqrt(2))^(i-1));
    alpha = fu/gama;
    beta = fu/eta;    
    for j = 1:v
        tetav = ((j-1)/v)*pi;
        gFilter = zeros(m,n);

        for x = 1:m
            for y = 1:n
                xprime = (x-((m+1)/2))*cos(tetav)+(y-((n+1)/2))*sin(tetav);
                yprime = -(x-((m+1)/2))*sin(tetav)+(y-((n+1)/2))*cos(tetav);
                gFilter(x,y) = (fu^2/(pi*gama*eta))*exp(-((alpha^2)*(xprime^2)+(beta^2)*(yprime^2)))*exp(1i*2*pi*fu*xprime);
            end
        end
        gaborArray{i,j} = gFilter;        
    end
end    

这是第二部分,我加载我的数据库并使用存储在gaborArray中的Gabor Bank对每个图像进行卷积,这是从上一个函数获得的。由于我与9个科目合作x 10个图像result的细胞大小为90 x gaborAbs + 1为类(1-9)

function [result]  = feature(gaborArray)
faceDatabase = imageSet(database,'recursive');    %database = folder
numberOfFoldersOverall = size(faceDatabase,2);
numberOfPhotosPF = 10;
cellSize = numberOfFoldersOverall * numberOfPhotosPF;
allFeatures = cell(cellSize,1);

[u,v] = size(gaborArray);
gaborResult = cell(u,v);
d1 = 4;
d2 = 4;
count = 1;

for m=1:numberOfFoldersOverall
    for n=1:numberOfPhotosPF
        I= (read(faceDatabase(m), n));
        I = double(I);
        featureVector = [];

        for i = 1:u
            for j = 1:v
                gaborResult{i,j} = imfilter(I, gaborArray{i,j});
            end
        end
        for i = 1:u
            for j = 1:v
                gaborAbs = abs(gaborResult{i,j});
                gaborAbs = downsample(gaborAbs,d1); 
                gaborAbs = downsample(gaborAbs.',d2);
                gaborAbs = gaborAbs(:);

                gaborAbs = (gaborAbs-mean(gaborAbs))/std(gaborAbs,1);
                featureVector =  [featureVector; gaborAbs];                                
             end
         end
         featureVector = [featureVector; m];
         allFeatures{count} = featureVector;
         count = count + 1;
    end
end
result = allFeatures;     

这是我可能在实现中犯了错误的部分。在Gabor feature extraction的帮助下,我对以前的函数进行了一些改动来计算Local Energy

gaborAbs = gaborResult{i,j};     %no longer abs(gaborResult{i,j})
gaborAbs = downsample(gaborAbs,d1); 
gaborAbs = downsample(gaborAbs.',d2);
gaborAbs = gaborAbs(:);
gaborAbs = sum(gaborAbs).^2;    %sum of squared gaborAbs

并计算平均幅度

gaborAbs = abs(gaborResult{i,j});                         
gaborAbs = downsample(gaborAbs,d1);                       
gaborAbs = downsample(gaborAbs.',d2);
gaborAbs = gaborAbs(:);
gaborAbs = sum(gaborAbs);       % sum of abs gaborAbs

局部能量和平均振幅的两个运动员的长度都是41,其中最后一个指数是主题类别。然而,当在我的面部识别中使用任何一种基于Knn的系统时,在某些情况下我的识别率最终为10%。

我尝试在matlab中使用andrewsplot绘制局部能量特征vektor,结果就是这样。每行代表1个主题,因此共有90行,其中具有相同颜色的行属于同一类(图像上的同一个人)。我们可以看到它们堆叠在一起,几乎没有区别zoomed out andrewsplot zoomed in andrewsplot

最后,我很抱歉,我要求你这么长的描述。

  1. 在计算局部能量或平均振幅时我犯了错误吗?
  2. Andrewsplot可以很好地代表这些数据吗?
  3. 如果是的话,我将它解释得很好,因为所有的功能都很基本相同,因为图形几乎没有区别?(我假设属于同一个人的图像应该堆叠但不同于其他图像。这里所有的东西都堆叠!)
  4. 或者这些功能是否有可能不适合人脸识别?提前感谢您提供任何提示或示例。最好的问候Yondaru。
matlab feature-extraction feature-selection gabor-filter
1个回答
1
投票

这是我的第一个想法。这不是一个完整的答案,但也许你可以在这里形成。

Gabor滤波器结果的幅度给出了相当平滑的结果:它是当地邻域中存在的给定空间频率的量。但是如果你分别看实部和虚部,你会看到一个高频信号(等于滤波器本身的频率)。我鼓励您将这些结果中的一些显示为图像以获得感觉。

下采样平滑幅度是可以的。它很顺利,你会得到邻居的代表性结果。但是对实部和虚部进行下采样是危险的:你可能会看到混叠,或者至多是无意义的数量。当然,这两个组件在一起仍然有一个有意义的大小,但阶段是没有意义的。

无论如何,由于能量是常态的平方,你实际上并不需要帽子下采样阶段。只是平方并对幅度图像求和。

最后,如果你要总结,为什么要下调?我没有看到任何优势。

在编码方面:为什么要在gaborResult中保存所有过滤结果?您也可以循环遍历所有u,v一次,应用过滤器,并直接计算该过滤器的总和大小。

© www.soinside.com 2019 - 2024. All rights reserved.