1. 程式人生 > >基於極限學習機ELM的人臉識別程式

基於極限學習機ELM的人臉識別程式

前言

有關極限學習機基礎知識請參考
極限學習機詳解

目標

基於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()