2013-11-14 50 views
4

我目前正在使用PCA和ICA算法進行實驗。我現在非常自在地使用PCA來創建一組特徵臉,選擇最佳特徵臉並重建圖像,並且我還能夠使用PCA執行臉部幻覺。我希望對ICA也這樣做,但我不確定如何做到這一點。使用ICA和PCA的圖像重建

到目前爲止,我採取的步驟是,執行PCA,找到表示特徵臉的正交特徵向量。目前實驗上耶魯ORL和PIE數據庫

然後我對這些特徵向量進行的FastICA像這樣

%Perform ICA on eigenvectors transposed 
%icasig = source matrix 
%A denotes unknown mixing matrix 
%W denotes unmixing matrix - inverse of A 
%Variable R are the orthogonal eigenvectors 
[icasig A W] = fastica(R'); 

然後我實現了ICA結構1,找到ICA係數。可以在這裏找到

http://www.sciencedirect.com/science/article/pii/S1077314203000778

算法ICA建築1只是向下滾動到第2.3.1節

%centeredMatrix is the image matrix of my training set minus the mean so here 
%I take out one of the mean centered images 
x = centeredMatrix(:,1); 

%Calculate Independent basis images 

U = W * R'; 

%Calculate PCA Coefficients 
C = x' * R; 

%Calculate ICA Coefficients 
B = C * inv(W); 

% plot first 16 PCA faces 
figure; hold on; 
for i=1:16 
    subplot(4,4,i); 
    comp = reshape(R(:,i), width, height); 
    imagesc(comp),colormap('gray') 
    title(sprintf('PCAFace #%i', i)); 
end 

% plot first 16 ICAFaces 
figure; hold on; 
for i=1:16 
    subplot(4,4,i); 
    comp = reshape(U(i,:), width, height); 
    imshow(comp); 
    title(sprintf('ICAFace #%i', i)); 
end 

我知道我能做到從PCA重建這個

%-----------------PCA Reconstruction---------- 

%Eigenvectors * pcaCoefficients + mean image 
pcaRecon = (R * C') + mu; 
pcaRecon = uint8(pcaRecon); 
pcaRecon = reshape(pcaRecon,width,height); 
figure, imshow(pcaRecon), title('PCA Recon'); 

但我不確定我將如何去做ICA重建。通過實施ICA結構1,我已經能夠進行重建,這樣做

%-----------------ICA Reconstruction---------- 

icaRecon = (icasig' * B') + mu; 
icaRecon = uint8(icaRecon); 
icaRecon = reshape(icaRecon,width,height); 
figure, imshow(icaRecon), title('ICA Recon'); 

,但我不能確定這是否是重建一個很好的方法,它似乎並不相比,PCA是非常有效的。以上代碼在耶魯數據庫上進行了測試,該數據庫有165張圖片使用PCA我可以使用大約80個特徵臉,並且仍然可以獲得非常高質量的圖像 ,而在此處使用ICA方法時,我必須使用105-110左右才能獲得相似質量的圖像。同樣的,其中包含400個圖像,可以執行PCA,創特徵臉,然後用大約120個特徵臉重建並獲得非常高品質的圖像,而與ICA ORL數據庫,需要的組件大約380獲得了類似的提質改造

我還是ICA新手,所以還有很多需要學習的東西,但是如果可能的話,我想回答幾個問題:

1:這是我用ICA方法重建一個好方法嗎?還是有更好的方法,你會建議。我有

2:爲什麼我需要使用這麼多的組件與ICA做重建,我猜測這是我的方法有問題?

如果有人能指出我正確的方向或向我解釋一個更好的重建方法,我將非常感激。

預先感謝

編輯:從數據庫ORL

實施例的結果,比較用原有的PCA和ICA重建。使用200個本徵面完成PCA重建,使用200個IC完成ICA重建。正如你所看到的ICA重建是相當差的比較

enter image description here

回答

1

爲什麼我需要用那麼多的組件與ICA做重建, 我猜這是我的方法有問題?

我沒有檢查您的詳細代碼,但一個可能的答案,這是PCA組件問世排序(即解釋了輸入數據集的方差量最大的一個出來第一),而通常ICA組件以任意順序出現。因此,如果您僅從n個組件的子集進行重構,則在PCA中很容易:選擇第一個n。在ICA中,您需要一些其他標準來選擇哪些 n個組件因爲缺少一個更好的單詞而是最「最」的組件。

+0

是的,這是真的。我想也許在這種情況下,PCA會更好,因爲訓練集的面孔都是對齊的,背景也是一樣的。我認爲ICA的表現會更好,如果我有一個訓練集,其中姿勢和背景圖像的變化更大 – AdamM

+0

我認爲選擇PCA還是ICA無關緊要:兩種情況下的關鍵特徵都是您在原始像素值上線性運行。將人臉與彼此對齊將對使用該方法的*任何*產生巨大影響。對於任何更復雜(不同姿勢等)的東西,都需要不同的特徵基礎。 Blanz和Vetter使用「流場」方法在PCA之前將臉部表示標準化,並使各種魔法成爲可能。 http://www.mpi-inf.mpg.de/~blanz – jez

0

我也是ICA的新手,我已經和你做過幾乎相同的實驗。 Interstingly我發現這個ICA重建方法本質上是一種PCA重建!如果你擴展你的重建代碼:「icasig'* B'」,你會發現你得到R *(x'* R)。事實上,上面提到的架構1也是一樣的。 至於你的問題,用n張圖片進行ICA重建必須等於使用相同n張圖片進行PCA重建。 您的重建代碼非常好,我沒有看到任何錯誤。不知道爲什麼結果不好,也許你的[icasig A W] = fastica(R');實現不太好?您可以通過檢查W * R'是否等於icasig來判斷。他們應該是平等的。

+0

他們是平等的我已經完成了所有的檢查。 arch1說你應該在轉置的特徵向量上運行fastica。 – AdamM