如何使用线性判别分析来识别训练文件夹中的图像与测试文件夹中的相似图像?

How to use Linear Discriminant Analysis to identify an image in the training folder with a similar image in the testing folder?

我有一个 windows 表单项目,我有一个名为 ATTDataSet 的数据集,该文件夹有两个文件夹,trainingtesting 文件夹,每个文件夹包含相同顺序的相似图像。我有一个带有两个带有标签 original imagerecognized image 的图片框的表单。我需要帮助处理训练文件夹中的图像以训练此程序保存该图像的名称并使用此算法识别测试文件夹中的相似图像 Linear Discriminant Analysis。我想先训练程序学习一张脸,然后我将实现一个按钮处理程序来识别第二个文件夹中的所有图像,其模式与学习过程中识别的模式相同。我使用的代码如下

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace LDA_FaceR
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //read the first image in the ATT data set folder
          
            string path = "C://Users//TimothyFarCry5//Documents//visual studio 2015//Projects//LDA-FaceR//LDA-FaceR//ATTDataSet//Training//S1_1.jpg";
            Bitmap mymap = new Bitmap(Image.FromFile(path));
            pictureBox1.Image = mymap;
            //program so that the program intitiates an LDA sequence to learn the image
            

        }
     //this method tries to identify images from the second testing folder with the LDA
     //pattern stored in the learn process, please help
       private void button2_Click(object sender, EventArgs e)
        {

        }
    }
}

更新

在网上稍作研究后,我了解到我需要使用 类 来执行此操作,我需要将数据库中的图像表示为一维向量,然后计算均值,然后从所有图像中减去均值,然后得到特征脸。如何以如下所示的格式表达图像?图像已经以矢量形式表示,如何做到这一点是问题,稍后我可以尝试计算平均值。 这个项目真的很重要,感谢所有愿意帮助的人。

您至少需要一些线性代数库,它可以计算向量矩阵乘法和矩阵的逆。在这种情况下,您计算所有数据的协方差,取它的倒数,然后判别向量是两个 类 的均值(中心)乘以倒数的向量。

有实现 LDA 的库。例如,Egmu CV(在 C# 中类似于 OpenCV)有 FisherFaceRecognizer,它应该实现 Fischer 判别分析,它几乎完全是 LDA(差异并不重要)。 https://www.emgu.com/wiki/files/4.5.1/document/html/80c70818-c4e1-e5a7-6c74-1ce3d6bd1be4.htm

无论如何,用于人脸识别的 LDA 不是一个好主意,而且它不会起作用(几乎根本不会)。合理的方法是采用专门训练的 CNN 来提取面部嵌入,并使用简单的距离函数(例如 L2)比较这些嵌入以获得图像的面部识别距离。可以从 C# 使用许多“深度学习”框架,您可以下载预训练的人脸识别网络。