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应用程序,它将检测图像中的硬币.硬币检测是硬币完整 ...
随机推荐
- 如何在苹果电脑下载器Folx中管理下载列表
Folx是一款Mas OS专用的下载器,提供了便捷的下载管理.灵活的设置.今天小编准备跟大家聊一聊关于Folx中常见的几种下载管理方式. 一.管理任务状态栏 在Folx下载面板上,可以通过类别查看任务 ...
- FL studio系列教程(四):如何利用FL Studio进行音乐合并
FL Studio20是Fruity Loops Studio的简称,也叫做水果音乐制作软件.它是一款功能十分强大的音乐制作软件,将作曲.编曲.混音.录音.大碟等功能集合一体,外接MIDI即可成为一个 ...
- 精尽MyBatis源码分析 - SQL执行过程(三)之 ResultSetHandler
该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...
- SQL server分页的四种方法(算很全面了)
这篇博客讲的是SQL server的分页方法,用的SQL server 2012版本.下面都用pageIndex表示页数,pageSize表示一页包含的记录.并且下面涉及到具体例子的,设定查询第2 ...
- 早安打工人! 来把你的.NET程序模块化吧
嗨朋友们,大家好! 还记得我是谁吗? 对了! 我就是 .NET 打工人 玩双截棍的熊猫 今天呐,我特别要向 写框架 的朋友们,想要写框架 ** 的朋友们,已经有框架** 的朋友问声好! 为什么呢?因为 ...
- Linux安装禅道教程
环境: centos7 64位 禅道11.2 Linux一键安装包64位 下载: 禅道下载地址: http://dl.cnezsoft.com/zentao/11.2/ZenTaoPMS.11.2.s ...
- CSP-SJX2019 解题报告
T1 日期 日高于 \(31\) 或等于 \(00\) 的要修改 \(1\) 次. 月高于 \(12\) 或等于 \(00\) 的要修改 \(1\) 次. 月等于 \(02\) 且日大于 \(28\) ...
- 19_B门长时曝光APP
知识很基础-- 前几天买了个单反,特别想拍B门长时间曝光的效果.后来想想不如自己写个APP,实现屏幕背景的随机颜色以及全屏显示文字. 先上图: 这两张图片的左侧都很亮,这是因为APP里面忘记把&quo ...
- Beta冲刺随笔——Day_Six
这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 Beta 冲刺 这个作业的目标 团队进行Beta冲刺 作业正文 正文 其他参考文献 无 今日事今日毕 林涛: ...
- Django 的缓存机制
一 缓存介绍: 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户访问量很大的时候,每一次的的后台操作,都会 ...