基於yale人臉庫的人臉圖像檢測

一.嵌入式特徵選擇:

將特徵選擇方法和學習訓練過程融爲一體。兩者同在一個優化過程中完成。在學習器訓練時自動進行特徵選擇。

給定訓練集,考慮線性迴歸模型,以平方誤差爲損失函數,則優化目標爲:

 

當樣本特徵較多,樣本數量較少時,很容易過擬合。

若採用L1正則化,則有:

 

 二. 人臉圖片處理

讀入訓練圖片,將每張人臉圖片信息存儲爲一維矩陣(1*10304),方便計算。

 

 



三.稀疏表示

假設我們用一個M*N的矩陣表示數據集X,每一行代表一個樣本,每一列代表樣本的一個屬性,一般而言,該矩陣是稠密的,即大多數元素不爲0

稀疏表示的含義是,尋找一個係數矩陣AK*N)以及一個字典矩陣BM*K),使得B*A儘可能的還原X,且A儘可能的稀疏。A便是X的稀疏表示。

表達爲優化問題的話,字典學習的最簡單形式爲:

 
 


求解上述最優化問題的總體策略是,對字典B以及樣本稀疏表示alphai交替迭代優化。即先初始化字典B1.固定字典Balphai進行優化。2.固定A對字典B進行優化。重複上述兩步,求得最終B以及X的稀疏表示A

 

四.具體迭代求解過程
 參見周志華西瓜書



.代碼實現
import numpy as np
from PIL import Image
def LoadData(t):
    testp=np.array(Image.open("./feret/"+str(t)+"-6.bmp"))
    testp=np.reshape(testp,(10304,1))
    for i in np.arange(3,8):
     for j in np.arange(1,6):
        if i==3 and j==1:
            img = np.array(Image.open('./feret/' + str(i) + '-' + str(j) + ".bmp"))
            img = np.reshape(img, (112 * 92, 1))
            A = img
        else:
            img = np.array(Image.open('./feret/' + str(i) + '-' + str(j) + ".bmp"))
            img = np.reshape(img, (112 * 92, 1))
            A = np.concatenate((A, img), axis=1)
    A = dfc(A)
    data = testp / np.linalg.norm(testp, ord=2)
    return A, data
def dfc(A):
  m=A.shape[1]
  for i in range(m):
   if i==0:
      Cl=A[:,i]/np.linalg.norm(A[:,i],ord=2)
      Cl=np.reshape(Cl,(10304,1))
   else:
      Cf=A[:,i]/np.linalg.norm(A[:,i],ord=2)
      Cf=np.reshape(Cf,(10304,1))
      Cl=np.concatenate((Cl,Cf),axis=1)
  return Cl

def xishu(A,y):

 x0=np.ones((25,1))
 c=np.dot(A, A.T)
# L=np.linalg.norm(2*np.dot(A,A.T))
 L=100000
 k=0
 while True:
# gradient
  g=2*np.dot(np.dot(A.T,A),x0)-2*np.dot(A.T,y)
  z=x0-1.0/L*g
  lamda=1
  w0=np.linalg.norm(np.dot(A,x0)-y,ord=2)**2+lamda*np.linalg.norm(x0,ord=1)
  x=x0
  for i in range(25):
    if z[i,0]>lamda/L:
      x[i,0]=z[i,0]-lamda/L
    elif z[i,0]<-lamda/L:
      x[i,0]=z[i,0]+lamda/L
    else:
      x[i,0]=0
  k+=1
  w=np.linalg.norm(np.dot(A,x)-y,ord=2)**2+lamda*np.linalg.norm(x,ord=1)
  if w0-w<1e-5:
   return x
  x0=x
def NewX(x,i):

 newX=np.zeros((25,1))

 for t in np.arange(5*i,5*i+5):

   newX[t,0]=x[t,0]

 return newX



def judgeClass(A,x,y):
 minValue=float(np.inf)
 minIndex=-1
 for i in range(5):
   dis=np.linalg.norm(y-np.dot(A,NewX(x,i)))
   print("對類", i + 3, "差異度爲: ", dis)
   if dis <= minValue:
    minValue = dis
    minIndex = i
 return minIndex + 3

if __name__=="__main__":
 m=5
 print("Start testing...")
 A,y=LoadData(m)
 cl=xishu(A,y)
 print(m,"最有可能在類",judgeClass(A,cl,y),"中")
 print("end.....")


測試結果:
Start testing...
對類 3 差異度爲:  0.896147086781208
對類 4 差異度爲:  0.9289496025653518
對類 5 差異度爲:  0.8444729557298922
對類 6 差異度爲:  0.9006976395753198
對類 7 差異度爲:  0.8783348199837376
5 最有可能在類 5 中
end.....


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章