c# 预处理识别硬币的数据集

作者:码农译站 时间:2022-05-21 17:26:09 

在文章中,我们将对输入到机器学习模型中的数据集进行预处理。

这里我们将对一个硬币数据集进行预处理,以便以后在监督学习模型中进行训练。在机器学习中预处理数据集通常涉及以下任务:

  1. 清理数据——通过对周围数据的平均值或使用其他策略来填补数据缺失或损坏造成的漏洞。

  2. 规范数据——将数据缩放值标准化到一个标准范围,通常是0到1。具有广泛值范围的数据可能会导致不规范,因此我们将所有数据都放在一个公共范围内。

  3. 一种热编码标签——将数据集中对象的标签或类编码为N维二进制向量,其中N是类的总数。数组元素都被设置为0,除了与对象的类相对应的元素,它被设置为1。这意味着在每个数组中都有一个值为1的元素。

  4. 将输入数据集分为训练集和验证集——训练集被用于训练模型,验证集是用于检查我们的训练结果。

这个例子我们将使用Numpy.NET,它基本上是Python中流行的Numpy库的.NET版本。

Numpy是一个专注于处理矩阵的库。

为了实现我们的数据集处理器,我们在PreProcessing文件夹中创建Utils类和DataSet类。Utils类合并了一个静态Normalize 方法,如下所示:


public class Utils
 {
   public static NDarray Normalize(string path)
   {
     var colorMode = Settings.Channels == 3 ? "rgb" : "grayscale";
     var img = ImageUtil.LoadImg(path, color_mode: colorMode, target_size: (Settings.ImgWidth, Settings.ImgHeight));
     return ImageUtil.ImageToArray(img) / 255;
   }

}

在这种方法中,我们用给定的颜色模式(RGB或灰度)加载图像,并将其调整为给定的宽度和高度。然后我们返回包含图像的矩阵,每个元素除以255。每个元素除以255是使它们标准化,因为图像中任何像素的值都在0到255之间,所以通过将它们除以255,我们确保了新的范围是0到1,包括255。

我们还在代码中使用了一个Settings类。该类包含用于跨应用程序使用的许多常量。另一个类DataSet,表示我们将要用来训练机器学习模型的数据集。这里我们有以下字段:

  1. _pathToFolder—包含图像的文件夹的路径。

  2. _extList—要考虑的文件扩展名列表。

  3. _labels—_pathToFolder中图像的标签或类。

  4. _objs -图像本身,表示为Numpy.NDarray。

  5. _validationSplit—用于将总图像数划分为验证集和训练集的百分比,在本例中,百分比将定义验证集与总图像数之间的大小。

  6. NumberClasses-数据集中唯一类的总数。

  7. TrainX -训练数据,表示为Numpy.NDarray。

  8. TrainY -训练标签,表示为Numpy.NDarray。

  9. ValidationX—验证数据,表示为Numpy.NDarray。

  10. ValidationY-验证标签,表示为Numpy.NDarray。

这是DataSet类:


public class DataSet
 {
   private string _pathToFolder;
   private string[] _extList;
   private List<int> _labels;
   private List<NDarray> _objs;
   private double _validationSplit;
   public int NumberClasses { get; set; }
   public NDarray TrainX { get; set; }
   public NDarray ValidationX { get; set; }
   public NDarray TrainY { get; set; }
   public NDarray ValidationY { get; set; }

public DataSet(string pathToFolder, string[] extList, int numberClasses, double validationSplit)
   {
     _pathToFolder = pathToFolder;
     _extList = extList;
     NumberClasses = numberClasses;
     _labels = new List<int>();
     _objs = new List<NDarray>();
     _validationSplit = validationSplit;
   }

public void LoadDataSet()
   {
     // Process the list of files found in the directory.
     string[] fileEntries = Directory.GetFiles(_pathToFolder);
     foreach (string fileName in fileEntries)
       if (IsRequiredExtFile(fileName))
         ProcessFile(fileName);

MapToClassRange();
     GetTrainValidationData();
   }

private bool IsRequiredExtFile(string fileName)
   {
     foreach (var ext in _extList)
     {
       if (fileName.Contains("." + ext))
       {
         return true;
       }
     }

return false;
   }

private void MapToClassRange()
   {
     HashSet<int> uniqueLabels = _labels.ToHashSet();
     var uniqueLabelList = uniqueLabels.ToList();
     uniqueLabelList.Sort();

_labels = _labels.Select(x => uniqueLabelList.IndexOf(x)).ToList();
   }

private NDarray OneHotEncoding(List<int> labels)
   {
     var npLabels = np.array(labels.ToArray()).reshape(-1);
     return Util.ToCategorical(npLabels, num_classes: NumberClasses);
   }

private void ProcessFile(string path)
   {
     _objs.Add(Utils.Normalize(path));
     ProcessLabel(Path.GetFileName(path));
   }

private void ProcessLabel(string filename)
   {
     _labels.Add(int.Parse(ExtractClassFromFileName(filename)));
   }

private string ExtractClassFromFileName(string filename)
   {
     return filename.Split('_')[0].Replace("class", "");
   }

private void GetTrainValidationData()
   {
     var listIndices = Enumerable.Range(0, _labels.Count).ToList();
     var toValidate = _objs.Count * _validationSplit;
     var random = new Random();
     var xValResult = new List<NDarray>();
     var yValResult = new List<int>();
     var xTrainResult = new List<NDarray>();
     var yTrainResult = new List<int>();

// Split validation data
     for (var i = 0; i < toValidate; i++)
     {
       var randomIndex = random.Next(0, listIndices.Count);
       var indexVal = listIndices[randomIndex];
       xValResult.Add(_objs[indexVal]);
       yValResult.Add(_labels[indexVal]);
       listIndices.RemoveAt(randomIndex);
     }

// Split rest (training data)
     listIndices.ForEach(indexVal =>
     {
       xTrainResult.Add(_objs[indexVal]);
       yTrainResult.Add(_labels[indexVal]);
     });

TrainY = OneHotEncoding(yTrainResult);
     ValidationY = OneHotEncoding(yValResult);
     TrainX = np.array(xTrainResult);
     ValidationX = np.array(xValResult);
   }
}

下面是每个方法的说明:

  1. LoadDataSet()——类的主方法,我们调用它来加载_pathToFolder中的数据集。它调用下面列出的其他方法来完成此操作。

  2. IsRequiredExtFile(filename) - 检查给定文件是否包含至少一个应该为该数据集处理的扩展名(在_extList中列出)。

  3. MapToClassRange() -获取数据集中唯一标签的列表。

  4. ProcessFile(path) -使用Utils.Normalize方法对图像进行规格化,并调用ProcessLabel方法。

  5. ProcessLabel(filename)——将ExtractClassFromFileName方法的结果添加为标签。

  6. ExtractClassFromFileName(filename) -从图像的文件名中提取类。

  7. GetTrainValidationData()——将数据集划分为训练子数据集和验证子数据集。

在本系列中,我们将使用https://cvl.tuwien.ac.at/research/cvl-databases/coin-image-dataset/上的硬币图像数据集。

要加载数据集,我们可以在控制台应用程序的主类中包含以下内容:


var numberClasses = 60;
var fileExt = new string[] { ".png" };
var dataSetFilePath = @"C:/Users/arnal/Downloads/coin_dataset";
var dataSet = new PreProcessing.DataSet(dataSetFilePath, fileExt, numberClasses, 0.2);
dataSet.LoadDataSet();

我们的数据现在可以输入到机器学习模型中。下一篇文章将介绍监督机器学习的基础知识,以及训练和验证阶段包括哪些内容。它是为没有AI经验的读者准备的。

来源:https://www.cnblogs.com/hhhnicvscs/p/14172455.html

标签:c#,识别,数据集
0
投稿

猜你喜欢

  • C#实现文件筛选读取并翻译的自动化工具

    2021-11-07 18:49:46
  • C#模拟http 发送post或get请求的简单实例

    2023-11-05 13:32:18
  • 关于Mybatis-Plus Update更新策略问题

    2022-04-14 19:29:24
  • Android开发之资源文件用法实例总结

    2023-05-13 06:02:39
  • Java裁剪压缩PNG图片,透明背景色变黑的解决方案

    2023-11-25 13:21:27
  • 详解SpringBoot中的统一功能处理的实现

    2022-07-06 12:14:49
  • Android开发之全屏与非全屏的切换设置方法小结

    2021-07-05 04:10:13
  • Flutter 日历组件简单实现

    2023-10-21 11:04:35
  • Kafka常用命令之kafka-console-consumer.sh解读

    2022-06-11 00:20:32
  • Android微信右滑退出功能的实现代码

    2021-12-26 07:15:48
  • java面试题——详解HashMap和Hashtable 的区别

    2023-08-06 16:38:25
  • Java Swing实现窗体添加背景图片的2种方法详解

    2021-10-26 19:01:18
  • C# NAudio 库的各种常见使用方式之播放 录制 转码 音频可视化

    2023-06-20 04:14:16
  • c# Parallel类的使用

    2022-09-09 12:30:21
  • Spring配置中transactionAttributes的使用方法介绍

    2021-06-16 10:59:05
  • Ajax 验证用户输入的验证码是否与随机生成的一致

    2022-06-29 00:43:32
  • Java内存模型中的虚拟机栈原理分析

    2022-02-08 04:41:33
  • java基础--自己动手实现一个LRU

    2023-06-25 18:21:04
  • Android ViewPager实现图片轮播效果

    2023-03-20 17:00:58
  • mybatis框架xml下trim中的prefix与suffix等标签的用法

    2023-09-20 18:55:24
  • asp之家 软件编程 m.aspxhome.com