服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - c# 预处理识别硬币的数据集

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

2022-10-25 13:04码农译站 C#

这篇文章主要介绍了c# 预处理识别硬币的数据集的方法,帮助大家更好的利用c#进行深度学习,感兴趣的朋友可以了解下

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

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

  1. 清理数据——通过对周围数据的平均值或使用其他策略来填补数据缺失或损坏造成的漏洞。
  2. 规范数据——将数据缩放值标准化到一个标准范围,通常是0到1。具有广泛值范围的数据可能会导致不规范,因此我们将所有数据都放在一个公共范围内。
  3. 一种热编码标签——将数据集中对象的标签或类编码为N维二进制向量,其中N是类的总数。数组元素都被设置为0,除了与对象的类相对应的元素,它被设置为1。这意味着在每个数组中都有一个值为1的元素。
  4. 将输入数据集分为训练集和验证集——训练集被用于训练模型,验证集是用于检查我们的训练结果。

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

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

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

?
1
2
3
4
5
6
7
8
9
10
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类:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
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/上的硬币图像数据集。

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

?
1
2
3
4
5
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经验的读者准备的。

以上就是c# 预处理识别硬币的数据集的详细内容,更多关于c# 识别数据集的资料请关注服务器之家其它相关文章!

原文链接:https://www.cnblogs.com/hhhnicvscs/p/14172455.html

延伸 · 阅读

精彩推荐
  • C#c# 应用NPOI获取Excel中的图片,保存至本地的算法

    c# 应用NPOI获取Excel中的图片,保存至本地的算法

    本文主要介绍了c# 应用NPOI获取Excel中的图片,保存至本地的算法。具有很好的参考价值,下面跟着小编一起来看下吧...

    SweetMemory10612021-12-23
  • C#C#微信开发之微信公众号标签管理功能

    C#微信开发之微信公众号标签管理功能

    这篇文章主要介绍了C#微信开发之微信公众号标签管理功能 的相关资料,需要的朋友可以参考下...

    伍华聪6202021-11-21
  • C#C# WPF使用AForge类库操作USB摄像头拍照并保存

    C# WPF使用AForge类库操作USB摄像头拍照并保存

    这篇文章主要为大家详细介绍了C# WPF使用AForge类库操作USB摄像头拍照并保存,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    晓风-杨柳3622022-03-01
  • C#C#数据绑定(DataBinding)简单实现方法

    C#数据绑定(DataBinding)简单实现方法

    这篇文章主要介绍了C#数据绑定(DataBinding)简单实现方法,以简单实例形式简单分析了C#实现数据绑定与读取的方法,具有一定参考借鉴价值,需要的朋友可以参...

    我心依旧11792021-10-20
  • C#C#获取所有进程的方法

    C#获取所有进程的方法

    在本篇文章里小编给大家分享了关于C#获取所有进程的方法和步骤,有需要的朋友们跟着学习参考下。...

    C#教程网11572022-03-07
  • C#C#使用Socket实现心跳的方法示例

    C#使用Socket实现心跳的方法示例

    这篇文章主要介绍了C#使用Socket实现心跳的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们...

    风之_诉12042022-08-27
  • C#C#如何添加PPT背景

    C#如何添加PPT背景

    这篇文章主要为大家详细介绍了C#如何添加PPT背景,添加纯色背景、渐变色背景、图片背景等,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    E-iceblue12092022-02-27
  • C#C#设置Word文档背景的三种方法(纯色/渐变/图片背景)

    C#设置Word文档背景的三种方法(纯色/渐变/图片背景)

    本文给大家分享三种添加Word文档背景的方法,非常不错,代码简单易懂,具有参考借鉴价值,需要的朋友参考下吧...

    E-iceblue10862022-02-21