基于极限学习机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()

备注

很多人表示程序运行有问题,这里针对常见问题进行统一答复。

  1. hpelm模块从哪里下载?cv2模块从哪里下载?
    pip install opencv-python
    pip install hpelm
  2. AssertionError: X has wrong dimensionality: expected 10000, found 1
    遇到这种情况请仔细检查路径是否正确!!!
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值