• Python实现LDA和KNN人脸识别模型(LinearDiscriminantAnalysis和KNeighborsClassifier算法)项目实战


    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取。

    1.项目背景

    人脸识别,是基于人的脸部特征信息进行身份识别的一种生物识别技术。用摄像机或摄像头采集含有人脸的图像或视频流,并自动在图像中检测和跟踪人脸,进而对检测到的人脸进行脸部识别的一系列相关技术,通常也叫做人像识别、面部识别。

    人脸识别产品已广泛应用于金融、司法、军队、公安、边检、政府、航天、电力、工厂、教育、医疗及众多企事业单位等领域。随着技术的进一步成熟和社会认同度的提高,人脸识别技术将应用在更多的领域。

    本项目先对人脸数据进行读取和处理,再通过LDA进行数据降维,最后用K近邻算法搭建模型进行人脸识别。

    2.数据获取

    本次建模数据来源于网络(本项目撰写人整理而成),,数据项统计如下:

    数据详情如下(部分展示):

    3.数据预处理

    3.1 用Pandas工具查看数据

    使用Pandas工具的head()方法查看前五行数据:

     关键代码:

    4.探索性数据分析

    4.1 显示第一张图片

    用Matplotlib工具的imshow()方法进行图片的显示:

     

    4.2 y变量分组统计柱状图

    用Matplotlib工具的plot()方法绘制柱状图:

     从上图可以看出,从上图可以看出标签共7中类别,其中第3类的数量最多。

    5.特征工程

    5.1 建立特征数据和标签数据

    关键代码如下:

    5.2 数据集拆分

    数据集集拆分,分为训练集和测试集,75%训练集和25%测试集。关键代码如下:

    5.3 LDA数据降维

    使用LDA算法进行数据的降维,输出如下:

    从上图可以看到,降维后的特征个数为6,训练集样本数为966。

    关键代码如下:

    6.构建人脸识别模型

    主要使用KNeighborsClassifier算法,用于目标分类。

    6.1 模型构建(不使用LDA降维)

    6.2 模型构建(使用LDA降维)

     

    从上表可以看出,使用LDA进行数据降维后,F1分值提升较多。

    6.3 应用网格搜索寻找最优参数值

    针对模型中的参数n_neighbors,通过网格搜索算法寻找最优的参数值,如下图所示:

     6.4 最优参数模型构建(使用LDA降维)

    通过上表可以看出,最优参数构建的模型 F1分值有一点的提升。

    7.模型评估

    7.1评估指标及结果

    评估指标主要包括准确率、查准率、召回率、F1分值等等。

     

    从上表可以看出,人脸识别模型效果良好。

    关键代码如下:

    7.2 查看是否过拟合

    查看训练集和测试集的分数:

    关键代码:

    7.3 分类报告

    人脸识别模型分类报告:

    从上图可以看出,分类为1的F1分值为0.52;分类为2的F1分值为0.73,其它类型的以此类推。

    8.结论与展望

    综上所述,本项目采用了LDA数据降维和KNN分类模型,并通过网格搜索优化算法寻找最优的参数值构建模型,最终证明了我们提出的模型效果良好。 

    1. # 本次机器学习项目实战所需的资料,项目资源如下:
    2. # 项目说明:
    3. # 链接:https://pan.baidu.com/s/1rXdQoJ2CLQe1DvVYDLwrgQ
    4. # 提取码:ee5i
    5. # 用Pandas工具查看数据
    6. print(df.head())
    7. # 展示图片
    8. data_image = df.drop(columns=['y']).values # 获取图片数据
    9. plt.imshow(data_image[0].reshape((50, 37)), cmap=plt.cm.gray) # 展示第一张图片
    10. plt.title(df['y'][0]) # 设置标题
    11. plt.xticks(()) # x轴刻度设为空
    12. plt.yticks(()) # y轴刻度设为空
    13. plt.show() # 展示图片
    14. # y变量分组统计柱状图
    15. plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
    16. plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
    17. # kind='bar' 绘制柱状图
    18. df['y'].value_counts().plot(kind='bar')
    19. plt.xlabel("y") # 设置x名称
  • 相关阅读:
    react中的useEffect
    项目背景以及游戏平台简介
    Day 00 python基础认识与软件安装
    运行pytorch时出现version `CXXABI_1.3.9‘ not found
    N9917A|是德科技keysight N9917A微波分析仪
    下班路上捡了一部手机,我用8年开发知识主动找到了失主
    JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
    阿里云 Serverless 异步任务处理系统在数据分析领域的应用
    【剑指Offer】41.数据流中的中位数
    基于Qt的目录统计QDirStat
  • 原文地址:https://blog.csdn.net/weixin_42163563/article/details/127957504