基於極限學習機ELM的人臉識別程式
阿新 • • 發佈:2019-02-19
前言
有關極限學習機基礎知識請參考
極限學習機詳解
目標
基於YALE人臉庫,15組人臉(每組照片代表一個人),進行人臉分類識別。(下載地址:YALE人臉庫)
將每類人臉前10張照片用於學習,第11張照片用於測試。測試第11張照片屬於哪個組(人)。
思路
可以直接將ELM看做一個黑盒演算法,將人臉圖片轉化為NUMPY陣列加入到ELM中即可。
效果
程式碼
import hpelm
import numpy as np
import cv2
import os,re
imglist=[] #訓練資料列表
step=10 #每種照片樣本數
type_num=15 #種類數
file_dir='D:\IOFile\YALE' #照片路徑
#讀取照片
for tp_num in range(1,type_num+1):
for st_num in range(1,step+1):
add_pre=lambda x:'0'+str(x) if len(str(x))==1 else str(x) #加字首
file_path = os.path.join(file_dir, 'subject{}_{}.bmp'.format(add_pre(tp_num),st_num))
if os.path.isfile(file_path):
manimg = cv2.resize(cv2.imread(file_path, cv2.IMREAD_GRAYSCALE), (100 , 100),
interpolation=cv2.INTER_CUBIC)
manarray=np.array(bytearray(manimg))
imglist.append(manarray)
#生成ELM
elm=hpelm.ELM(10000,type_num)
#生成訓練資料
input_data=[i for i in imglist]
output_data=[]
pos=0
for index in range(0,len(imglist)):
img_num=int(index/step) #照片種類編號
output=[]
for i in range(type_num):
if img_num==i:
output.append(1)
else:
output.append(0)
output_data.append(output)
#新增神經元
elm.add_neurons(30,'lin')
elm.add_neurons(15,'rbf_linf')
#訓練
elm.train(np.array(input_data),np.array(output_data))
#測試圖片
def predict_photo(photo_num):
# 準備測試資料
testim = cv2.resize(cv2.imread(os.path.join(file_dir, 'subject{}_11.bmp'.format(add_pre(photo_num))), cv2.IMREAD_GRAYSCALE), (100, 100),
interpolation=cv2.INTER_CUBIC)
testarray = np.array(bytearray(testim))
test_data = np.array([testarray.tolist()])
# 預測
predict = elm.predict(test_data)
prbobility = 0 # 照片為某一種類的可能性
max_photo = 0 # 最可能的照片種類
for i in range(0, len(predict[0])):
if prbobility < predict[0][i]:
prbobility = predict[0][i]
max_photo = i
print('該照片最可能屬於種類{},概率為{}'.format(max_photo + 1, prbobility))
#測試效能
def test_perfomance():
true=0
for num in range(1,16):
# 讀取圖片並格式化處理
im = cv2.resize(cv2.imread(os.path.join(file_dir, 'subject{}_11.bmp'.format(add_pre(num))), cv2.IMREAD_GRAYSCALE), (100, 100),
interpolation=cv2.INTER_CUBIC)
array = np.array(bytearray(im))
predict=elm.predict(np.array([array.tolist()]))
prbobility=0
for i in range(0, len(predict[0])):
if prbobility < predict[0][i]:
prbobility = predict[0][i]
max_photo = i
if max_photo+1==num:
true+=1
print('完成效能測試,正確率為{}'.format(true/15))
if __name__ == '__main__':
predict_photo(7)
test_perfomance()