Emgucv 无法使用 EigenFaceRecognizer 训练超过 210 张图像,它会停止写入新的细节或数据

Posted

技术标签:

【中文标题】Emgucv 无法使用 EigenFaceRecognizer 训练超过 210 张图像,它会停止写入新的细节或数据【英文标题】:Emgucv cannot train more than 210 images using EigenFaceRecognizer it stop writing new details or data 【发布时间】:2019-11-18 16:43:18 【问题描述】:

大家好,我对 OpenCV 比较陌生,使用 .net 包装器 Emgucv 我的程序是简单的面部检测和识别,首先我训练用户面部,每个用户至少 20 个 100x100 像素的图像,然后将数据写入(EigenFaceRecognizer)到 yml 文件,然后在运行实时识别或比较之前加载此文件(用户图像和 yml 中的数据),它在 9 个用户(9x20 = 180 个图像)下工作得非常好。但是,当我尝试注册或训练另一个用户时,我注意到 (EigenFaceRecognizer) 停止在 yml 中写入数据。我们如何解决这个问题?下面是我的数据格式,带有 yml 扩展名

 opencv_eigenfaces:
   threshold: .Inf
   num_components: 10
   mean: !!opencv-matrix
   rows: 1
   cols: 4096
   dt: d
   data: []    

trainingData.yml https://www.dropbox.com/s/itm58o24lka9wa3/trainingData.yml?dl=0

【问题讨论】:

我对opencv的工作不多,但看看输出层有多大。可能是输出层只包含 210 个节点(参见docs.opencv.org/3.4/dc/dd6/ml_intro.html 底部附近输入和输出层的图表) @EricJ。您好 Eric 谢谢您的回复 我将文件上传到 drop box 是的 它只包含 210 我们如何增加它? dropbox.com/s/itm58o24lka9wa3/trainingData.yml?dl=0 【参考方案1】:

我发现问题在于写入数据的时间不够,所以我需要增加延迟。

 private async Task LoadData()
    
        outputBox.Clear();
        var i = 0;
        var itemData = Directory.EnumerateFiles("trainingset/", "*.bmp");
        var enumerable = itemData as IList<string> ?? itemData.ToList();
        var total = enumerable.Count();
        _arrayNumber = new int[total];
        var listMat = new List<Mat>();

        foreach (var file in enumerable)
        
            var inputImg = Image.FromFile(file);
            _inputEmGuImage = new Image<Bgr, byte>(new Bitmap(inputImg));
            var imgGray = _inputEmGuImage.Convert<Gray, byte>();
            listMat.Add(imgGray.Mat);
            var number = file.Split('/')[1].ToString().Split('_')[0];
            if (number != "")
            
                _arrayNumber[i] = int.Parse(number);
            
            i++;
            processImg.Image = _inputEmGuImage.ToBitmap();
            outputBox.AppendText($"Person Id: number Environment.NewLine");
            if (total == i)
            
                fisherFaceRecognizer.Train(listMat.ToArray(), _arrayNumber);
                fisherFaceRecognizer.Write(YlmPath);
               // FaceRecognition.Train(listMat.ToArray(), _arrayNumber);
               // FaceRecognition.Write(YlmPath);
                MessageBox.Show(@"Total of " + _arrayNumber.Length + @" successfully loaded");
            
            await Task.Delay(10);
        
    

【讨论】:

你好杰克,我也在使用 YML 来保存数据。但每次我训练一张脸时,yml 文件都会被覆盖。所以只有一个面部细节将在该过程结束时出现。如何将数据附加到 yml?

以上是关于Emgucv 无法使用 EigenFaceRecognizer 训练超过 210 张图像,它会停止写入新的细节或数据的主要内容,如果未能解决你的问题,请参考以下文章

带有 Tesseract OCR 的 EmguCV 甚至无法识别二进制黑白单字符图像

EmguCV 中的等价物

EmguCV - 找不到 nvcuda.dll

EmguCV学习 与opencv的区别和联系

EmguCV:使用光流在运动物体上绘制轮廓?

EmguCV C++ 转换 C# EmguCV