前言
有关极限学习机基础知识请参考
极限学习机详解
目标
基于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()
备注
很多人表示程序运行有问题,这里针对常见问题进行统一答复。
- hpelm模块从哪里下载?cv2模块从哪里下载?
pip install opencv-python
pip install hpelm - AssertionError: X has wrong dimensionality: expected 10000, found 1
遇到这种情况请仔细检查路径是否正确!!!