1. 設計介紹
(Preliminary Paper)
不管是指紋、視網膜、聲波等等…不外乎是要確定所使用的人是否我們所需要的。而現今的社會此類的科技卻大量廣泛應用於各種保護隱私及個人的資料的使用,如ASUS、SONY相繼推出含有指紋辨識的高階商用型的筆記型電腦,就是為了防範公司商業機密的流失。此類的科技應用著重於安全資訊的防護,而被大量使用的就是所使用者與密碼之間的關連,一個使用者搭配一組密碼具有唯一性且個人化的隱密性。但在現今網路流行的世界,駭客囂張不顧法律的行動,將使上述的方法失去該有的防護能力,導致個資的外洩無疑是對個人生命安全權與隱私權一大打擊。所以我們希望能藉由提升密碼的防護能力能增加抵禦駭客的功能,每個人的五官、人臉無一相同,是與生俱來也是最特殊的密碼,藉由利用人臉辨識系統正確辨識使用者,增加所使用者的權限,在輸入個人化的密碼。在無形中就增加了一道所使用者與密碼的關卡,更增加洩漏資訊的難度。
(Revision: 3 / 2010-07-01 00:00:54)
2. 功能描述
(Final Project Paper)
我們使用ALTERA所開發的DE2平台,實現人臉辨識。首先,將要辨識的人對準DE2平台的鏡頭,然後我們在擷取眼睛、鼻子、嘴巴的部分,分別對這些部分做柱狀圖等化並取出灰階值。接著透過主要分量分析(Principal Component Analysis,PCA)技術,將我們取到資料做降維的動作,以減少處理時間,然後再透過線性識別分析(Linear Discriminate Analysis,LDA)技術,將PCA處理後的資料做適當的分散,以提高分類效率。最後透過最近鄰居分類法(k-nearest-neighbor rule,KNNR)技術,將取出的特徵和資料庫中最接近的K個資料點做比對,判斷是否屬於這個類別,如果所比對的特徵都有符合資料庫中的資料,就能判定這個人臉的身分。
(Revision: 5 / 2010-07-01 00:01:55)
3. 效能參數
(Final Project Paper)
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int main(void)
{
FILE* fp; //讀入資料庫裡的內容
FILE* fp2; //讀入原始照片資料
FILE* fp3; //讀入pca降維資料
fp = fopen("anbase30.txt","r");
fp2 = fopen("W5.2c.txt","r");
fp3 = fopen("anei30.txt","r");
double a[56][30]; //所有資料庫樣本的陣列
double b[67800]; //原始照片資料
double c[30]; //降維過後資料
double **d/*[67800][30]*/; //ei30特徵向量
double A1,A2,A3;
double r;
int g;
int x1, x2, y;
int base1, base2, ofp, efp, ei1, ei2;
char word[4];
d=(double**)malloc(67800*sizeof(double*));
for(int i=0 ; i<67800; i++)
d[i]=(double*)malloc(30*sizeof(double));
for( base1=0;base1<56;base1++)
{
for( base2=0;base2<30;base2++)
{
a[base1][base2]=0;
}
}
for( ofp=0;ofp<67800;ofp++)
{
b[ofp]=0;
}
for( efp=0;efp<30;efp++)
{
c[efp]=0;
}
for(int ei1=0;ei1<67800;ei1++)
{
for(int ei2=0;ei2<30;ei2++)
{
d[ei1][ei2]=0;
}
}
for( base1=0;base1<56;base1++) //BASE矩陣讀入
{
for( base2=0;base2<30;base2++)
{
fscanf(fp, "%lf", &a[base1][base2]);
}
}
for( ofp=0;ofp<67800;ofp++)
{
fscanf(fp2, "%lf", &b[ofp]);
}
for( ei1=0;ei1<67800;ei1++) //特徵向量ei讀入
{
for( ei2=0;ei2<30;ei2++)
{
fscanf(fp3, "%lf", &d[ei1][ei2]);
}
}
for(int y=0;y<30;y++)
{
for(int z=0;z<67800;z++)
c[y]+=b[z]*d[z][y];
}
//K-nn主程式
x1=0;
A3=0;
for(x2=0; x2<56; x2++)
{
A1=0;
for(y=0,x1=0; y<30; y++)
{
double s;
s=(a[x2][y]-c[x1])*(a[x2][y]-c[x1]);
x1++;
A1=s+A1;
}
A2=sqrt(A1);
if(A3==0||A3>A2)
{
A3=A2;
r =A3;
g =x2+1;
}
}
if(g<=7)
printf("Miss 李");
if(g>7 && g<15)
printf("Mr 茂");
if(g>14 && g<22)
printf("Mr 范");
if(g>21 && g<29)
printf("Mr 郭");
if(g>28 && g<36)
printf("Miss 陳");
if(g>35 && g<43)
printf("Mr 游");
if(g>42 && g<50)
printf("Miss 黃");
if(g>49 && g<56)
printf("Mr 吳");
for(int i=0 ; i<67800; i++)
free(d[i]);
free(d);
system("pause");
return 0;
}
(Draft / 2010-09-23 17:04:58)
4. 設計架構
(Preliminary Paper)
智慧型機器人人臉偵測 主要流程架構
圖片轉灰階==>PCA降維==>KNN比對==>判別!
下列為pca的運作程式:
lear j
dataNum = 1000;
data = randn(1,dataNum)+j*randn(1,dataNum)/3;
data = data*exp(j*pi/6); % 旋轉30度
data = data-mean(data); % 平均值等於零
plot(real(data), imag(data), '.'); axis image;
DS.input=[real(data); imag(data)];
[DS2, v, eigValue] = pca(DS);
v1 = v(:, 1);
v2 = v(:, 2);
arrow = [-1 0 nan -0.1 0 -0.1]+1+j*[0 0 nan 0.1 0 -0.1];
arrow1 = 2*arrow*(v1(1)+j*v1(2))*eigValue(1)/dataNum;
arrow2 = 2*a
降維後需要使用knn計算測試資料與資料庫的距離,來判定類別
以下為knn的運作程式:
neighborIds = zeros(size(queryMatrix,1),k);
neighborDistances = neighborIds;
numDataVectors = size(dataMatrix,1);
numQueryVectors = size(queryMatrix,1);
for i=1:numQueryVectors,
dist = sum((repmat(queryMatrix(i,:),numDataVectors,1)-dataMatrix).^2,2);
[sortval sortpos] = sort(dist,'ascend');
neighborIds(i,:) = sortpos(1:k);
neighborDistances(i,:) = sqrt(sortval(1:k));
end
Altera DE2-70這塊多媒體開發平台配備數萬個Altera Cyclone® II 2C70邏輯單元,以FGPA的設計理念下處理。與CPLD的功能相同,所以FGPA/CPLD的EGA設計流程相同(圖1)。但兩者架構不同,所以相較於CPLD能更快速的處理複雜的邏輯問題。

DE2-70架構圖

Multi-Port SDRAM Controller(Sdram_Control_4Port.v)
負責讀寫SDRAM。SDRAM為CMOS與VGA(LCM/LTM)之間的frame buffer,它一共有4個port:2 read port與2 write port,每個port為16 bit
DE2的機體圖解

紫色部分是DE2_CCD架構(DE2 + 130萬像素CMOS + 640 * 480 VGA),其他如DE2_LCM_CCD (DE2 + 130萬像素CMOS + 320 * 240 3.6" LCM)與DE2_70_D5M_LTM (DE2-70 + 500萬像素CMOS + 800 * 480 4.3" LTM) 基本上用的仍是延續紫色部分的架構。我們是以DE2_70_D5M_LTM為此次實作的多媒體開發平台。
而根據紫色部分的框架,分為5大部分,大略說明如下:
I2C Sensor Configuration(I2C_CCD_Config.v)
負責設定CMOS的register。
CMOS Sensor Data Capture(CCD_Capture.v)
負責接收CMOS所傳來的Bayer Pattern格式資料。
Bayer Color Pattern Data to 30-Bit RGB (RAW2RGB.v)
負責將Bayer Pattern格式轉成RGB格式。
(Revision: 4 / 2010-09-17 23:51:50)
5. 設計方法
(Final Project Paper)
先在LTM上即時顯示兩固定位置之標記(例如x或+)外,並將人臉五官(雙眼、鼻、嘴)之相對區域以固定大小之圓或矩形即時顯示於LTM上。然後由user來自行將人臉的五官對準我們事先在LTM上顯示的固定位置的標記,然後拍照。接著在擷取出框框內裡的圖片,並轉成灰階值,接下來使用PCA來將我們的資料降維方便處理,PCA之後的資料使用LDA的方法將資料做適當的分佈,最後才由KNNR法來找出拍下來照片的資料類別是否與我們內建的資料庫類別相同來辨識人臉
我們總共收集10個人,每個人共拍10張照片,取8個人做資料庫的範本,又這八人中取7張照片當作訓練,3張當測試範本
。另外兩人當做資料庫外的測試。
在DE2所取的框框(雙眼、鼻、嘴),我們將其中每一點轉成灰階值並記錄,其數值高達近七萬個。
由於數量過於龐大,我們無法直接使用。所以我們透過MATLAB裡面的PCA來降維!
在使用PCA中必須選取特徵值,因為我們的樣本數才56(8人7張)所以取其1/3~2/3之間,20~45之間,每五一區間。
取其中特徵值30來說,原本資料庫的樣本數向量矩陣是高達70000多X56,一但選取特徵值30,會使此矩陣變成70000多X30變成是一個專屬我們選取特徵值30的特徵向量,等於創造了一個新的向量空間!
而每一張照片原始矩陣70000多X1經過轉置變成1X70000多,再投影到我們所創造的新的向量空間(就是相乘)。
[1][70000多]X[70000多][30] = [1][30] ==>達到完美的降維成果!
利用以上的方法,資料庫的訓練範本的矩陣為[56][30],而測試範本為[24][30]。(數字56來自8人七張樣本數,數字24來自8人3張訓練數)
利用以上的矩陣使用KNN來求取最高的辨識率。
KNN利用兩個向量求進去距離,可以預設K值數值,K代表鄰近數值,如果K=2,代表求距離最接近我們測試向量的兩個向量。
以下是KNN的程式碼介紹
neighborIds = zeros(size(queryMatrix,1),k);
neighborDistances = neighborIds;
numDataVectors = size(dataMatrix,1);
numQueryVectors = size(queryMatrix,1);
for i=1:numQueryVectors,
dist = sum((repmat(queryMatrix(i,:),numDataVectors,1)-dataMatrix).^2,2);
[sortval sortpos] = sort(dist,'ascend');
neighborIds(i,:) = sortpos(1:k);
neighborDistances(i,:) = sqrt(sortval(1:k));
end
下圖是經過KNN所得到最高辨識率
.JPG)
我們成功率可以達到93%
(Revision: 5 / 2010-09-18 00:38:25)
6. 設計特點
(Preliminary Paper)
一旦我們從MATLAB上取出最佳的PCA特徵向量與樣本空間向量,將之轉移到ALTERA上。就可以利用簡單的圖片轉
換數值,寫入矩陣,與PCA特徵向量相成達到降維,在與樣本空間向量做KNN的比較,就可以快速達到辨別人臉的功效。
無須複雜的轉換與程式碼相互干擾。
(Draft / 2010-09-17 23:23:03)
7. 總結
(Final Project Paper)
通常在做影像處理都是以個人電腦為主要的核心架構來實現,這次我們的專題是以DE2平台為核心,來實現人臉辨識系統。由於影像處理透過個人電腦來處理,會受到個人電腦的速度限制,因此處理一張影像的時間會比較久。但是透過Altera所開發的DE2平台為核心,可以提升影像處理的運算速度,達到更高的效率。
我們的預期成果是希望能辨識出人臉的身分,是否是與資料庫裡的資料相同,這樣一來就可以確定使用者的身分,達到更高的防護效果,以確保資料的安全性。
因為DE2所提供的CMOS並不太精確,所以在拍照的過程中,我們發現場地的光線很重要,如果在太暗的低方拍攝,所拍攝出來的影像可能會影響辨識的結果,降低精確度。所以,我們在執行拍照的過程,必須要在光線充足的地方執行,這樣才能達到更好的效果。
(Revision: 2 / 2010-07-01 00:07:49)
|