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

  • 下载源1.5 MB
  • 清理数据——通过平均周围数据的值或使用其他策略来填补丢失或损坏的数据留下的漏洞。
  • 标准化数据——将值缩放到标准范围内,通常为0到1。具有广泛范围值的数据可能会导致不规则性,因此我们将所有内容都置于一个公共范围内。
  • 一个热编码标签——将数据集中的对象的标签或类编码为二进制N维向量,其中N是类的总数。除了与对象类对应的元素设置为1之外,所有数组元素都设置为0。这意味着在每个数组中只有一个元素的值为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(含)。

我们还在代码中使用了一个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 datafor (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#中的深度学习:预处理硬币检测数据集相关推荐

  1. 深度学习:文本检测数据集整理

    ICDAR2011 paper:ICDAR 2011 Robust Reading Competition Challenge 2 Reading Text in Scene Images ICDAR ...

  2. 在浏览器中进行深度学习:TensorFlow.js (十二)异常检测算法

    2019独角兽企业重金招聘Python工程师标准>>> 异常检测是机器学习领域常见的应用场景,例如金融领域里的信用卡欺诈,企业安全领域里的非法入侵,IT运维里预测设备的维护时间点等. ...

  3. 深度学习图像处理目标检测图像分割计算机视觉 01--图像预处理

    深度学习图像处理目标检测图像分割计算机视觉 01-图像预处理 摘要 一.开发环境搭建 1.1 anaconda安装 1.2 安装TensorFlow 1.3 安装OpenCV 二.中值滤波 三.高斯滤 ...

  4. 深度学习在人脸检测中的应用 | CSDN 博文精选

    作者 | 梁志成.刘鹏.陈方杰 责编 | 唐小引 转载自CSDN(ID:csdnnews) 在目标检测领域,可以划分为人脸检测与通用目标检测,往往人脸这方面会有专门的算法(包括人脸检测.人脸识别.人脸 ...

  5. 深度学习在目标视觉检测中的应用进展与展望

    作者:张慧,王坤峰,王飞跃 来源:王飞跃科学网博客 摘要:目标视觉检测是计算机视觉领域的一个重要问题,在视频监控.自主驾驶.人机交互等方面具有重要的研究意义和应用价值.近年来,深度学习在图像分类研究中 ...

  6. 人机交互系统(4.1)——深度学习在人脸检测中的应用

    1 人脸检测 在目标检测领域可以划分为了人脸检测与通用目标检测,往往人脸这方面会有专门的算法(包括人脸检测.人脸识别.人脸其他属性的识别等等),并且和通用目标检测(识别)会有一定的差别,着主要来源于人 ...

  7. 深度学习在目标检测中的应用及其tensorflowAPI实践(三)

    这系列文章的内容目录如下: 目标检测的任务 深度学习在目标检测中的应用 RCNN fast RCNN faster RCNN RFCN yolo yolo V2 SSD tensorflow目标检测A ...

  8. 基于AI深度学习的安全帽检测算法,如何应用在实际场景中?

    安全帽是建筑业.制造业等企业生产中非常重要的劳保工具,因未佩戴安全帽而导致的安全事故也引发大量关注.所以,实时检测工作人员的安全帽佩戴状况,成为企业安全生产监管中不容忽视的环节. 基于AI深度学习的目 ...

  9. 图像识别中的深度学习【香港中文大学王晓刚】

    深度学习发展历史 深度学习是近十年来人工智能领域取得的重要突破.它在语音识别.自然语言处理.计算机视觉.图像与视频分析.多媒体等诸多领域的应用取得了巨大成功.现有的深度学习模型属于神经网络.神经网络的 ...

最新文章

  1. 2016 linux发行版排行_Linux发行版排行榜榜首:MX 19.1操作系统自有它不凡的魅力...
  2. AtCoder AGC005E Sugigma: The Showdown (博弈论)
  3. 决策树可视化保姆级教程
  4. c++ h cpp文件如何关联_C++核心准则SF.5: .cpp文件必须包含定义它接口的.h文件
  5. hibernate oracle clob 注解,Hibernate3.X实现基于CLOB字段类型的注解方式:
  6. CSS3 Flexbox布局那些事
  7. 如何编写自己的python包,并进行安装和发布
  8. android 播放gif方案集合
  9. 关于Android的方向传感器
  10. 照片太大怎么压缩200k?图片怎么缩小到200k以下?
  11. lol8月21号服务器维护,8月21日lol维护公告最新 8.21lol维护到几点
  12. 短租APP开发定制快速搭建
  13. Matlab显示图像三维信息
  14. ios11修改微信步数_iOS逆向之“修改微信运动步数”
  15. 合资品牌车联网或率先尝到车联网技术的甜头?
  16. Linux账号管理和ACL
  17. OPenMV识别颜色识别物块及检测二维码的进阶应用
  18. pythonmatplotlib怎么画阴影_python – 在matplotlib的极地阴影阴影细胞
  19. 分享几个学习翻译的方法
  20. verilog 串口收发数据 UART

热门文章

  1. 乐山市计算机学校谭娟,乐山市计算机学校重视新闻写作培训
  2. java uuid 第三方_JAVA生成短8位UUID
  3. python类中引用数据是通过_重载python类中的[]运算符以引用数字阵列数据内存
  4. mac r 导出csv文件_R在Max OS进行导入和导出xlsx文件
  5. 收获不止oracle在线,重温《收获不止Oracle》
  6. 在计算机网络应用发展过程中 被称为,计算机网络技术与应用第三章考试题
  7. 电商产品页多种出彩表现设计手法!
  8. 设计灵感|拼贴风格海报设计,优秀案例让你它好看在哪里?
  9. python序列化模块struct_Python-序列化模块-json-62
  10. CUDA的线程层次结构