1案例背景
1.1人臉識別概述
????????人臉識別作為一個復雜的模式識別問題,近年來受到了廣泛的關注,識別領域的各種方法在這個問題上各顯所長,而且發展出了許多新方法,大大豐富和拓寬了模式識別的方向。人臉識別、檢測,跟蹤、特征定位等技術近年來一直是研究的熱點。人臉識別是人臉應用研究中重要的第一步,目的是從圖像中分割出不包括背景的人臉區域。由于人臉形狀的不規則性以及光線和背景條件多樣性,現有的人臉研究算法都是在試圖解決某些特定實驗環境下的一些具體問題,對人臉位置和狀態都有一定的要求。而在實際應用中,大量圖像和視頻源中人臉的位置、朝向和旋轉角度都不是固定的,這就大大增加了人臉識別的難度。
????????在人臉識別領域的眾多研究方向中,人臉朝向分析一直是一個少有人涉及的領域。在以往的研究成果中,一些研究者談及了人臉朝向問題,但其中絕大多數都是希望在人臉識別過程中去除人臉水平旋轉對識別過程的不良影響。但是,實際問題要復雜得多,人臉朝向是一個無法回避的問題。因此,對于人臉朝向的判斷和識別,將會是一件非常有意義的工作。
1.2問題描述
????????現采集到一組人臉朝向不同角度時的圖像,圖像來自不同的10個人,每人5幅圖像,人臉的朝向分別為:左方、左前方、前方、右前方和右方,如圖27-1所示。試創建一個LVQ神經網絡,對任意給出的人臉圖像進行朝向預測和識別。
2模型建立
2.1 設計思路
2.2設計步驟
?
????????1)人臉特征向量提取
????????如設計思路中所述,當人臉朝向不同時,眼睛在圖像中的位置會有明顯的差別。因此,只需要將描述人眼位置信息的特征向量提取出來即可。方法是將整幅圖像劃分成6行8列,人眼的位置信息可以用第2行的8個子矩陣來描述(注意:針對不同大小的圖像,劃分的網格需稍作修改),邊緣檢測后8個子矩陣中的值為“1”的像素點個數與人臉朝向有直接關系,只要分別統計出第2行的8個子矩陣中的值為“1”的像素點個數即可。
????????2)訓練集/測試集產生
????????為了保證訓練集數據的隨機性,隨機選取圖像庫中的30幅人臉圖像提取出的特征向量作為訓練集數據,剩余的20幅人臉圖像提取出來的特征向量作為測試集數據。
????????3)LVQ 網絡創建
????????LVQ神經網絡的優點是不需要將輸人向量進行歸一化、正交化,利用MATLAB自帶的神經網絡工具箱函數newlvq()可以構建一個LVQ神經網絡,關于該函數的用法及說明在第26章中已作詳細說明,此處不再贅述。
????????4)LVO網絡訓練
????????網絡創建完畢后,便可以將訓練集輸入向量送入到網絡中,利用LVQ1或LVQ2算法對網絡的權值進行調整,直到滿足訓練要求迭代終止。
????????5.人臉識別測試
????????網絡訓練收斂后,便可以對測試集數據進行預測,即對測試集的圖像進行人臉朝向識別。對于任意給出的圖像,只需要將其特征向量提取出來,便可對其進行識別。
3 MATLAB實現
????????利用MATLAB神經網絡工具箱提供的函數可以方便地在 MATLAB環境下實現上述設計步驟,代碼如下:
%% LVQ神經網絡的預測——人臉識別%% 清除環境變量
clear all
clc%% 人臉特征向量提取
% 人數
M = 10;
% 人臉朝向類別數
N = 5;
% 特征向量提取
pixel_value = feature_extraction(M,N);%% 訓練集/測試集產生
% 產生圖像序號的隨機序列
rand_label = randperm(M*N);
% 人臉朝向標號
direction_label = repmat(1:N,1,M);
% 訓練集
train_label = rand_label(1:30);
P_train = pixel_value(train_label,:)';
Tc_train = direction_label(train_label);
T_train = ind2vec(Tc_train);
% 測試集
test_label = rand_label(31:end);
P_test = pixel_value(test_label,:)';
Tc_test = direction_label(test_label);%% 創建LVQ網絡
for i = 1:5rate{i} = length(find(Tc_train == i))/30;
end
net = newlvq(minmax(P_train),20,cell2mat(rate),0.01,'learnlv1');
% 設置訓練參數
net.trainParam.epochs = 100;
net.trainParam.goal = 0.001;
net.trainParam.lr = 0.1;%% 訓練網絡
net = train(net,P_train,T_train);%% 人臉識別測試
T_sim = sim(net,P_test);
Tc_sim = vec2ind(T_sim);
result = [Tc_test;Tc_sim]%% 結果顯示
% 訓練集人臉標號
strain_label = sort(train_label);
htrain_label = ceil(strain_label/N);
% 訓練集人臉朝向標號
dtrain_label = strain_label - floor(strain_label/N)*N;
dtrain_label(dtrain_label == 0) = N;
% 顯示訓練集圖像序號
disp('訓練集圖像為:' );
for i = 1:30 str_train = [num2str(htrain_label(i)) '_'...num2str(dtrain_label(i)) ' '];fprintf('%s',str_train)if mod(i,5) == 0fprintf('\n');end
end
% 測試集人臉標號
stest_label = sort(test_label);
htest_label = ceil(stest_label/N);
% 測試集人臉朝向標號
dtest_label = stest_label - floor(stest_label/N)*N;
dtest_label(dtest_label == 0) = N;
% 顯示測試集圖像序號
disp('測試集圖像為:');
for i = 1:20 str_test = [num2str(htest_label(i)) '_'...num2str(dtest_label(i)) ' '];fprintf('%s',str_test)if mod(i,5) == 0fprintf('\n');end
end
% 顯示識別出錯圖像
error = Tc_sim - Tc_test;
location = {'左方' '左前方' '前方' '右前方' '右方'};
for i = 1:length(error)if error(i) ~= 0% 識別出錯圖像人臉標號herror_label = ceil(test_label(i)/N);% 識別出錯圖像人臉朝向標號derror_label = test_label(i) - floor(test_label(i)/N)*N;derror_label(derror_label == 0) = N;% 圖像原始朝向standard = location{Tc_test(i)};% 圖像識別結果朝向identify = location{Tc_sim(i)};str_err = strcat(['圖像' num2str(herror_label) '_'...num2str(derror_label) '識別出錯.']);disp([str_err '(正確結果:朝向' standard...';識別結果:朝向' identify ')']);end
end
% 顯示識別率
disp(['識別率為:' num2str(length(find(error == 0))/20*100) '%']);
? ? ? ? 上述為主函數代碼,完整代碼和數據集下載方式:
【免費】基于LVQ神經網絡的人臉朝向識別matlab代碼
運行結果:
result =
? ? ?2 ? ? 5 ? ? 1 ? ? 3 ? ? 4 ? ? 4 ? ? 5 ? ? 1 ? ? 1 ? ? 3 ? ? 2 ? ? 4 ? ? 3 ? ? 4 ? ? 4 ? ? 3 ? ? 4 ? ? 5 ? ? 5 ? ? 2
? ? ?2 ? ? 5 ? ? 1 ? ? 3 ? ? 4 ? ? 4 ? ? 5 ? ? 1 ? ? 1 ? ? 3 ? ? 2 ? ? 4 ? ? 3 ? ? 4 ? ? 4 ? ? 3 ? ? 4 ? ? 5 ? ? 5 ? ? 2
訓練集圖像為:
1_3 ?1_5 ?2_1 ?2_2 ?2_3 ?
3_1 ?3_4 ?4_1 ?4_2 ?5_1 ?
5_2 ?5_5 ?6_3 ?6_4 ?6_5 ?
7_1 ?7_2 ?7_3 ?7_4 ?7_5 ?
8_2 ?8_3 ?8_5 ?9_1 ?9_2 ?
9_5 ?10_1 ?10_2 ?10_3 ?10_4 ?
測試集圖像為:
1_1 ?1_2 ?1_4 ?2_4 ?2_5 ?
3_2 ?3_3 ?3_5 ?4_3 ?4_4 ?
4_5 ?5_3 ?5_4 ?6_1 ?6_2 ?
8_1 ?8_4 ?9_3 ?9_4 ?10_5 ?
識別率為:100%
????????從以上結果可以看出,當訓練目標 net, trainPararm. goal 設置為0.0001時,識別準確率可以達到100%。因此,利用LVQ神經網絡對人臉作識別是可行且有效的。要注意的一點是,當訓練集較少時,比如說只取1~2個人臉的圖像特征向量參與訓練,識別率會相對較低些。因此,在防止出現過擬合的同時,應盡量增加訓練集的樣本數目。
4案例擴展
????????由于無需對數據進行預處理、可以處理復雜模型且對噪聲干擾有一定的抑制,LVQ神經網絡的應用也越來越廣泛。近年來,許多專家學者將LVQ神經網絡與其他方法相結合,成功地解決了很多現實問題。例如,由于傳統LVQ神經網絡存在神經元未被充分利用以及算法對初值敏感的問題,利用遺傳算法優化網絡的初始值可以迅速得到最佳的神經網絡初始權值向量,從而使得分析速度和精度都有較大的提高。
?