使用sklearn中的Adaboost分类器来实现ORL人脸分类

前言:博主上网浏览使用Adaboost实现人脸分类时,发现并没有分类,大部分全都是关于人脸识别检测的,并没有实现对某个人的精准分类(例如,这个人叫什么名字),有关ORL识别的,大多是用PCA降维或者SVM实现的,也没有用Adaboost的,故因此写了个随笔。

算法原理

算法过程:

假设我们有个二分类训练数据集T={(x1,y1),...,(xN,yN)},yi∈{−1,+1}.

  • 1)在刚开始,我们让每个变量xi都有相同的权重,也就是说,刚开始每个样本在基分类器中的作用相同。

    ​ Dj = (wj1,wj2,…. wji,…. wjN) wjN = 1/N

    Dj表示权重分布的向量,其中j表示当前是第一轮因为后面还要进行很多轮学习,每次都会改变这个分布。wji表示第j轮对应的第xi变量

  • 2)对 m = 1 , 2 , . . . , M ,共计M个基分类器 进行以下步骤:

    ①:学习得到基本分类器Gm(x)

    ​ 使用具有权值分布Dm的训练数据集进行学习,得到基本分类器Gm(x),Gm(x)可以根据输入给出 +1 或 -1 的输出

    ②:计算单个基分类器的分类误差率em

    ​ em = \(\sum_{i=1}^N\) wmi I(Gm(xi) \(\neq\)yi)

    这个公式什么意思呢:对于第m轮的误差 em,有对应xi对应的权重wmi,I 是指示函数,当后面括号里的式子成立就取1,不成立就取0, i = 1 ,2,…N 所有的xi 所以 em 就是把所有分类错误的样本权重加起来,如果初始权重相等,那么5个样本分错2个,错误率就是0.4,如果权重是[0.5,0.1,0.1,0.1,0.1,0.1],而权重为0.5的样本分错了,最后错误率就是0.5。因此这个设计使得,将权重高的样本分类正确能显著降低分类误差率。

    ③:计算 Gm(x) 的分类器投票权重αm(即在最终结果所占的重要性)

    假设em = 0.3,即分类误差较小,错误率较小,则,α较大。

    对于二分类问题,错误率超过0.5的话,只要进行简单的完全反转就可以使其降到0.5以下。举例来说,若 分类结果为 [1,1,1,-1] 错误率0.75,那么只要改成 [-1,-1,-1,1] 错误率就只有0.25了。(另一种想法是随机分类的错误率是0.5,弱学习器虽然弱,正确率也是要略高于随机分类的。

    ④:更新训练集的权重分布

    对于第m+1轮:

    wm+1,i = \(w_{mi}e^{-α_my_iG_m(x_i)}/Z_m\)

    其中,$Z_m = \sum_{i=1}Ne $

  • 得到最终分类器

代码实现

实验平台:kaggle 在线notebook kaggle具有不用配环境,有大量在线公共数据集,省去了很多麻烦

ORL数据集

我们采用公共数据库,进行算法实现。

选取ORL人脸数据库作为实验样本,总共40个人,每人10幅图像,图像大小为 112*92 像素。图像本身已经经过处理,不需要进行归一化和校准等工作。实验样本分为训 练样本和测试样本。首先设置训练样本集,选择40个人前6张图片作为训练样本,进行训练。然后设置测试样本集,将40个人后4张图片作为测试样本,进行选取识别。

该数据集来源:https://www.kaggle.com/datasets/jagadeeshkasaraneni/orlfaces

具体代码:

import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv) import os
for dirname, _, filenames in os.walk('/kaggle/input'):
for filename in filenames:
print(os.path.join(dirname, filename))

输出:/kaggle/input/orlfaces/ORL_faces.npz

orlfaces = np.load("/kaggle/input/orlfaces/ORL_faces.npz")
orlfaces.files

输出:['testY', 'testX', 'trainX', 'trainY']

该数据集中的训练集和测试集已经给我们划分好了 训练集60% 测试集40%

print(orlfaces['trainX'].shape)
print(orlfaces['testX'].shape)

输出:(240, 10304)

(160, 10304)

240是指总共有24个人的图片,每个人有10张,所以是240

测试集共有16个人,因此第一维的值为160

112 * 92 = 10304,即我们要的图片是112 * 92的,他放在同一维度了,所以是10304

X_train = np.reshape(orlfaces['trainX'], (240, 112, 92))
Y_train = orlfaces['trainY']
X_test = np.reshape(orlfaces['testX'], (160, 112, 92))
Y_test = orlfaces['testY']
print(Y_train.shape)
Y_train

输出:

(240,)

array([ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,

1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,

2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4,

4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5,

5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7,

7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8,

8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,

9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11,

11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12,

12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14,

14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15,

15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,

17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18,

18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,

19, 19], dtype=uint8)

我们只展示其中3张图片:

## import matplotlib.pyplot as plt
%matplotlib inline def show_images(images) -> None:
n: int = len(images)
for i in range(10): # 图片太多了,展示10张图片算了吧 否则这里填 range(n)
plt.figure()
plt.imshow(images[i]) show_images(X_train)

输出:

多余图片省略...

from sklearn.ensemble import AdaBoostClassifier
from sklearn.metrics import accuracy_score # 假设X_train和y_train是训练样本和标签,X_test和y_test是测试样本和标签
# 这里需要根据实际的图像数据来加载和预处理 # 初始化Adaboost分类器
ada_clf = AdaBoostClassifier(n_estimators=200,learning_rate = 0.1, random_state=42) # 训练模型
ada_clf.fit(X_train.reshape(-1,112*92),Y_train) # Adaboost分类器要求X_train维度 <= 2 # 预测测试样本
Y_pred = ada_clf.predict(X_test.reshape(-1,112*92)) # 计算准确率
accuracy = accuracy_score(Y_test, Y_pred)
print(f"识别准确率: {accuracy:.2f}")

输出:

识别准确率: 0.76

print(Y_test,Y_pred)

我们可以将预测Y和真实Y打印出来,进行比较,准确率为0.76

我们可以调整n_estimators,learning_rate , random_stat取值,来提升准确率:

  • n_estimators:这个参数指定了要使用的弱分类器的数量。n_estimators的值越大,意味着更多的弱分类器会被用来构建强分类器。这可能会导致更好的性能,但也会增加模型的复杂度和训练时间。
  • learning_rate:这个参数是每个弱分类器对最终预测的贡献率。在AdaBoost算法中,每个弱分类器的权重与其准确性成比例。learning_rate参数控制这个比例的大小。较小的learning_rate`意味着每个弱分类器对最终结果的影响较小,可能需要更多的弱分类器来达到相同的效果。
  • random_state:这个参数用于控制随机数生成器的种子,以确保结果的可重复性。设置random_state`可以确保每次运行代码时,只要输入数据不变,得到的结果都是相同的。这对于调试和实验是非常重要的,因为它允许研究人员比较不同模型或参数设置的效果。

参考

https://blog.csdn.net/codelady_g/article/details/122571189

https://www.kaggle.com/code/jagadeeshkasaraneni/orlfacerecognition/notebook

使用sklearn中的Adaboost分类器来实现ORL人脸分类的更多相关文章

  1. 『Kaggle』Sklearn中几种分类器的调用&词袋建立

    几种分类器的基本调用方法 本节的目的是基本的使用这些工具,达到熟悉sklearn的流程而已,既不会设计超参数的选择原理(后面会进行介绍),也不会介绍数学原理(应该不会涉及了,打公式超麻烦,而且近期也没 ...

  2. 使用OpenCV训练Haar like+Adaboost分类器的常见问题

    <FAQ:OpenCV Haartraining>——使用OpenCV训练Haar like+Adaboost分类器的常见问题 最近使用OpenCV训练Haar like+Adaboost ...

  3. 入门系列之Scikit-learn在Python中构建机器学习分类器

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由信姜缘 发表于云+社区专栏 介绍 机器学习是计算机科学.人工智能和统计学的研究领域.机器学习的重点是训练算法以学习模式并根据数据进行预 ...

  4. sklearn中的损失函数

    python风控评分卡建模和风控常识(博客主亲自录制视频教程) https://study.163.com/course/introduction.htm?courseId=1005214003&am ...

  5. Sklearn中的回归和分类算法

    一.sklearn中自带的回归算法 1. 算法 来自:https://my.oschina.net/kilosnow/blog/1619605 另外,skilearn中自带保存模型的方法,可以把训练完 ...

  6. sklearn中的模型评估-构建评估函数

    1.介绍 有三种不同的方法来评估一个模型的预测质量: estimator的score方法:sklearn中的estimator都具有一个score方法,它提供了一个缺省的评估法则来解决问题. Scor ...

  7. OpenCV学习记录(二):自己训练haar特征的adaboost分类器进行人脸识别 标签: 脸部识别opencv 2017-07-03 21:38 26人阅读

    上一篇文章中介绍了如何使用OpenCV自带的haar分类器进行人脸识别(点我打开). 这次我试着自己去训练一个haar分类器,前后花了两天,最后总算是训练完了.不过效果并不是特别理想,由于我是在自己的 ...

  8. 决策树在sklearn中的实现

    1 概述 1.1 决策树是如何工作的 1.2 构建决策树 1.2.1 ID3算法构建决策树 1.2.2 简单实例 1.2.3 ID3的局限性 1.3 C4.5算法 & CART算法 1.3.1 ...

  9. Sklearn 中的 CrossValidation 交叉验证

    1. 交叉验证概述 进行模型验证的一个重要目的是要选出一个最合适的模型,对于监督学习而言,我们希望模型对于未知数据的泛化能力强,所以就需要模型验证这一过程来体现不同的模型对于未知数据的表现效果. 最先 ...

  10. 机器学习:集成学习(集成学习思想、scikit-learn 中的集成分类器)

    一.集成学习的思想 集成学习的思路:一个问题(如分类问题),让多种算法参与预测(如下图中的算法都可以解决分类问题),在多个预测结果中,选择出现最多的预测类别做为该样本的最终预测类别: 生活中的集成思维 ...

随机推荐

  1. this 之谜揭底:从浅入深理解 JavaScript 中的 this 关键字(二)

    前言 系列首发于公众号『前端进阶圈』 ,若不想错过更多精彩内容,请"星标"一下,敬请关注公众号最新消息. this 之谜揭底:从浅入深理解 JavaScript 中的 this 关 ...

  2. 彻底解决ROS1安装问题,一键解决远离rosdep init 和rosdep update出错

    彻底解决ROS1安装问题 相信很多小伙伴在刚入门ROS的时候就遇到ROS安装这个拦路虎. 普遍出错的环节在rosdep init 和rosdep update,由于要访问国外的站点就导致国内访问很容易 ...

  3. JavaScript设计模式样例十四 —— 观察者模式

    观察者模式(Observer Pattern) 定义:当一个对象被修改时,则会自动通知它的依赖对象.目的:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被 ...

  4. 老母鸡安装mqtt

    大佬写好了, 按部就班操作一下就行了,在hass中添加mqtt可进行测试 玩客云搭建MQTT服务器 - 崔安兵 - 博客园 (cnblogs.com)

  5. Honor X20 忽然不能与Android Studio 连接

    背景:前一天还正常使用,可以连接Android Studio,第二天就连不上了 已知:数据线没问题,驱动没问题,设备开了开发者模式,连接上电脑时会提示已连接USB调试, 测试过程:(点击撤销USB调试 ...

  6. win10自动更新导致的任务栏假死,右键单击任务栏延迟菜单延迟出现

    系统是win10企业版,前天晚上回家之前,电脑还是好好的,然后前天早上跑过来以后,发现电脑自动重启了,我还以为是办公室停电了之类的(现在想了一下愚蠢,停电不会自动开机),没想到是自动更新 然后我发现, ...

  7. 合合信息通过ISO/IEC国际标准双认证,为全球用户提供高合规标准AI服务

    互联网.AI等技术的全球普及为人们提供便捷服务的同时,也带来了信息安全领域的诸多挑战.保护用户隐私及数据安全,是科技企业规范.健康发展的重心.近期,上海合合信息科技股份有限公司(简称"合合信 ...

  8. JavaScript – XMLHttpRequest

    前言 XMLHttpRequest 是 JavaScript built-in 的一个 class,用于发送 HTTP 请求,俗称 AJAX. 这几年 XMLHttpRequest 已经逐渐被 Fet ...

  9. ASP.NET Core Library – HtmlSanitizer

    介绍 要输出 Raw HTML 最好是先消毒一下. 使用 Library 就可以了. 参考 Github – mganss / HtmlSanitizer 安装 nuget dotnet add pa ...

  10. 5G网元功能与接口

    5G网元功能与接口 5G移动通信整体网络架构 5G网络功能之间的信息交互可以基于两种方式表示:其一为基于服务表示:其二为基于点对点表示.实时部署时,也可以采用两种方式相结合的表示方式. 并不是所有的接 ...