C#中的深度学习(二):预处理识别硬币的数据集
在文章中,我们将对输入到机器学习模型中的数据集进行预处理。
这里我们将对一个硬币数据集进行预处理,以便以后在监督学习模型中进行训练。在机器学习中预处理数据集通常涉及以下任务:
- 清理数据——通过对周围数据的平均值或使用其他策略来填补数据缺失或损坏造成的漏洞。
- 规范数据——将数据缩放值标准化到一个标准范围,通常是0到1。具有广泛值范围的数据可能会导致不规范,因此我们将所有数据都放在一个公共范围内。
- 一种热编码标签——将数据集中对象的标签或类编码为N维二进制向量,其中N是类的总数。数组元素都被设置为0,除了与对象的类相对应的元素,它被设置为1。这意味着在每个数组中都有一个值为1的元素。
- 将输入数据集分为训练集和验证集——训练集被用于训练模型,验证集是用于检查我们的训练结果。
这个例子我们将使用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,表示我们将要用来训练机器学习模型的数据集。这里我们有以下字段:
- _pathToFolder—包含图像的文件夹的路径。
- _extList—要考虑的文件扩展名列表。
- _labels—_pathToFolder中图像的标签或类。
- _objs -图像本身,表示为Numpy.NDarray。
- _validationSplit—用于将总图像数划分为验证集和训练集的百分比,在本例中,百分比将定义验证集与总图像数之间的大小。
- NumberClasses-数据集中唯一类的总数。
- TrainX -训练数据,表示为Numpy.NDarray。
- TrainY -训练标签,表示为Numpy.NDarray。
- ValidationX—验证数据,表示为Numpy.NDarray。
- 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);
- }
- }
下面是每个方法的说明:
- LoadDataSet()——类的主方法,我们调用它来加载_pathToFolder中的数据集。它调用下面列出的其他方法来完成此操作。
- IsRequiredExtFile(filename) - 检查给定文件是否包含至少一个应该为该数据集处理的扩展名(在_extList中列出)。
- MapToClassRange() -获取数据集中唯一标签的列表。
- ProcessFile(path) -使用Utils.Normalize方法对图像进行规格化,并调用ProcessLabel方法。
- ProcessLabel(filename)——将ExtractClassFromFileName方法的结果添加为标签。
- ExtractClassFromFileName(filename) -从图像的文件名中提取类。
- 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经验的读者准备的。
欢迎关注我的公众号,如果你有喜欢的外文技术文章,可以通过公众号留言推荐给我。
C#中的深度学习(二):预处理识别硬币的数据集的更多相关文章
- 基于深度学习的人脸识别系统(Caffe+OpenCV+Dlib)【二】人脸预处理
前言 基于深度学习的人脸识别系统,一共用到了5个开源库:OpenCV(计算机视觉库).Caffe(深度学习库).Dlib(机器学习库).libfacedetection(人脸检测库).cudnn(gp ...
- CNCC2017中的深度学习与跨媒体智能
CNCC2017中的深度学习与跨媒体智能 转载请注明作者:梦里茶 目录 机器学习与跨媒体智能 传统方法与深度学习 图像分割 小数据集下的深度学习 语音前沿技术 生成模型 基于贝叶斯的视觉信息编解码 珠 ...
- 【OCR技术系列之四】基于深度学习的文字识别(3755个汉字)
上一篇提到文字数据集的合成,现在我们手头上已经得到了3755个汉字(一级字库)的印刷体图像数据集,我们可以利用它们进行接下来的3755个汉字的识别系统的搭建.用深度学习做文字识别,用的网络当然是CNN ...
- 基于深度学习的人脸识别系统(Caffe+OpenCV+Dlib)【一】如何配置caffe属性表
前言 基于深度学习的人脸识别系统,一共用到了5个开源库:OpenCV(计算机视觉库).Caffe(深度学习库).Dlib(机器学习库).libfacedetection(人脸检测库).cudnn(gp ...
- 基于深度学习的人脸识别系统(Caffe+OpenCV+Dlib)【三】VGG网络进行特征提取
前言 基于深度学习的人脸识别系统,一共用到了5个开源库:OpenCV(计算机视觉库).Caffe(深度学习库).Dlib(机器学习库).libfacedetection(人脸检测库).cudnn(gp ...
- 基于深度学习的人脸识别系统系列(Caffe+OpenCV+Dlib)——【四】使用CUBLAS加速计算人脸向量的余弦距离
前言 基于深度学习的人脸识别系统,一共用到了5个开源库:OpenCV(计算机视觉库).Caffe(深度学习库).Dlib(机器学习库).libfacedetection(人脸检测库).cudnn(gp ...
- 【OCR技术系列之四】基于深度学习的文字识别
上一篇提到文字数据集的合成,现在我们手头上已经得到了3755个汉字(一级字库)的印刷体图像数据集,我们可以利用它们进行接下来的3755个汉字的识别系统的搭建.用深度学习做文字识别,用的网络当然是CNN ...
- Deep learning for visual understanding: A review 视觉理解中的深度学习:回顾 之一
Deep learning for visual understanding: A review 视觉理解中的深度学习:回顾 ABSTRACT: Deep learning algorithms ar ...
- C#中的深度学习(一):使用OpenCV识别硬币
在本系列文章中,我们将使用深度神经网络(DNN)来执行硬币识别.具体来说,我们将训练一个DNN识别图像中的硬币. 在本文中,我们将描述一个OpenCV应用程序,它将检测图像中的硬币.硬币检测是硬币完整 ...
随机推荐
- 「CSP-S 2020」儒略日
description luogu loj(暂无数据) solution 这道题作为T1,对选手们仔细看清题目的好习惯,以及不为2h调试.5k代码而心态爆炸的重要能力进行了较好的锻炼, 特别准备的只有 ...
- 利用perspective 和 transform 里面的几个参数来实现旋转照片墙
旋转照片墙 首先,来看下,是什么效果吧,上效果图 ↓ 其实这个东西,很容易制作,先说下思路, 把照片都给叠在一起,然后 rotateY 旋转,给每张图片 旋转不一样的角度能构成一圈, 然后transl ...
- css3系列之transform 详解scale
scale() scaleX() scaleY() scaleZ() scale3d() 改变的不是元素的宽高,而是 X 和 Y 轴的刻度 本章有个很冷门的知识点 → scale 和 rotate 一 ...
- MyBatis的一二级缓存
一级缓存 一级缓存默认是开启的,生命周期和SqlSession相同.一个会话中每次执行一个查询操作时,会先查询二级缓存,如果二级缓存没查到或者二级缓存未开启就会从一级缓存中查询,如果一级缓存也未查到就 ...
- Java基础知识面试题(最详细版)
刚刚经历过秋招,看了大量的面经,顺便将常见的Java常考知识点总结了一下,并根据被问到的频率大致做了一个标注.一颗星表示知识点需要了解,被问到的频率不高,面试时起码能说个差不多.两颗星表示被问到的频率 ...
- 网络拓扑实例之交换机基于接口地址池作为DHCP服务器(六)
组网图形 DHCP服务器简介 通常用户希望网络中的每台终端能够动态获取IP地址.DNS服务器的IP地址.路由信息.网关信息等网络参数,不需要手动配置终端的IP地址等网络参数:另外,针对一些移动终端(手 ...
- Java基础教程——Object类
Object类 Object类是Java所有类类型的父类(或者说祖先类更合适) <Thinking in Java(Java编程思想)>的第一章名字就叫"everything i ...
- 集群--lvs
快一个月没有更新博客了,最近一段时间在忙世界技能大赛网络系统系管理这个项目,没有太多的时间,我百忙之中更新一下.最近赛题中有说到集群这个,lvs这个东西(我也该学学这个了,一直停留在基础部分,是时候学 ...
- synchronized底层揭秘
前言 上篇文章我们从硬件级别探索,对可见性和有序性的认识上升了一个高度,却迟迟没有介绍原子性的解决方案. 今天我们就来聊一聊原子性的解决方案,锁. 引入锁机制,除了可以保证原子性,同时也可以保证可见性 ...
- java导出excel并且压缩成zip上传到oss,并下载,使用字节流去存储,不用文件流保存文件到本地
最近项目上要求实现导出excel并根据条数做分割,然后将分割后的多个excel打包成压缩包上传到oss服务器上,然后提供下载方法,具体代码如下:这里只展示部分代码,获取数据的代码就不展示了 ByteA ...