C#中的深度学习(一):使用OpenCV识别硬币
在本系列文章中,我们将使用深度神经网络(DNN)来执行硬币识别。具体来说,我们将训练一个DNN识别图像中的硬币。
在本文中,我们将描述一个OpenCV应用程序,它将检测图像中的硬币。硬币检测是硬币完整识别之前的一个常见阶段。它包括从给定图像中检测和提取硬币。

本系列附带的代码将使用Keras在C#中实现。在本系列的最后一篇文章中,我们将简要地使用ML.NET。在众多选择中,为什么要使用Keras.NET呢?Keras.NET 非常容易学习,因为它基本上是从Python编写的经典TensorFlow到C#的直接映射。对于不熟悉机器学习的读者来说,这比用其他方法创建示例要容易得多。
硬币检测过程分为三个阶段:
- 转换图像到灰度。颜色增加了检测任务的复杂性,而且在很多情况下,它们不能传递任何可以从图像亮度中获取的相关信息。
- 应用高斯模糊。因为硬币通常包含一个内圆,我们应用这个变换来模糊图像。这确保了任何内圆被下一步中的操作忽略,所以我们的算法不会意外地认为它们是一个单独的硬币。
- 应用霍夫变换。这是为了检测圆形。
首先,让我们在Visual Studio Community 2019中创建一个.net Framework 4.7.2控制台应用程序。我们将把我们的解决方案和项目命名为“CoinRecognitionExample”,并在其中创建一个Detection文件夹,创建一个CoinDetector类。

我们将使用OpenCVSharp,所以我们可以继续在Visual Studio中从Nuget包管理器安装依赖项。要做到这一点,请点击Tools > Nuget Package Manager.
我们可以看到需要安装OpenCVSharp的依赖项。

具体的实现发生在CoinDetector类中:
1 public class CoinDetector
2 {
3 private Mat _image;
4 private Mat _originalImage;
5 private string _pathToFile;
6
7 public CoinDetector(string pathToFile)
8 {
9 _pathToFile = pathToFile;
10 }
11
12 public void ImagePreprocessing()
13 {
14 _image = new Mat(_pathToFile, ImreadModes.Color);
15 _originalImage = _image.Clone();
16 TransformGrayScale();
17 TransformGaussianBlur();
18 HoughSegmentation();
19 }
20
21 private void TransformGrayScale()
22 {
23 _image = _originalImage.CvtColor(ColorConversionCodes.BGR2GRAY);
24 new Window("Grayed Coins", WindowMode.Normal, _image);
25 Cv2.WaitKey();
26 }
27
28 private void TransformGaussianBlur()
29 {
30 Cv2.GaussianBlur(_image, _image, new Size(0, 0), 1);
31 new Window("Blurred Coins", WindowMode.Normal, _image);
32 //Cv2.WaitKey();
33 }
34
35 private void HoughSegmentation()
36 {
37 Mat result = _image.Clone();
38
39 var circleSegments = Cv2.HoughCircles(_image, HoughMethods.Gradient, 1.02, 40);
40 for (int i = 0; i < circleSegments.Length; i++)
41 {
42 Cv2.Circle(result, (Point) circleSegments[i].Center, (int)circleSegments[i].Radius, new Scalar(255, 255, 0), 2);
43 }
44
45 using (new Window("Circles", result))
46 {
47 Cv2.WaitKey();
48 }
49 }
50 }
在类的构造函数中,我们接收到硬币图像的路径。这个方法和ImagePreprocessing方法是CoinDetector类中仅有的两个公共实体。所有其他方法都是私有的,与上面列出的三个阶段相关。在ImageProcessing 方法中,我们保存一个原始的Mat(像素矩阵)对象的图像,并生成即将发生的转换副本。Mat类和所有对Cv2类的调用都来自OpenCVSharp。在每次转换之后,我们调用new Window以可视化地显示转换。Cv2.HoughCircles的参数取决于你所面临的问题,也就是正在处理的图像。
代码中显示的参数符合我们的示例。
要完成硬币检测示例,我们可以在控制台应用程序项目的主方法中添加以下代码行并执行。
1 string filePath = @"C:/Users/arnal/Documents/coins.jpg";
2 var coinDetector = new CoinDetector(filePath);
3 coinDetector.ImagePreprocessing();
这是我们将用于测试的图像。其中包括塞尔维亚第纳尔硬币:

最终的结果将是我们之前看到的图像:

正如我们所看到的,在中间使用对应霍夫变换的白色圆圈标识,并被识别出来。
本系列的第一篇文章到此结束。在下一篇文章中,我们将对输入到机器学习模型中的数据集进行预处理。
C#中的深度学习(一):使用OpenCV识别硬币的更多相关文章
- CNCC2017中的深度学习与跨媒体智能
CNCC2017中的深度学习与跨媒体智能 转载请注明作者:梦里茶 目录 机器学习与跨媒体智能 传统方法与深度学习 图像分割 小数据集下的深度学习 语音前沿技术 生成模型 基于贝叶斯的视觉信息编解码 珠 ...
- Deep learning for visual understanding: A review 视觉理解中的深度学习:回顾 之一
Deep learning for visual understanding: A review 视觉理解中的深度学习:回顾 ABSTRACT: Deep learning algorithms ar ...
- 基于深度学习的人脸性别识别系统(含UI界面,Python代码)
摘要:人脸性别识别是人脸识别领域的一个热门方向,本文详细介绍基于深度学习的人脸性别识别系统,在介绍算法原理的同时,给出Python的实现代码以及PyQt的UI界面.在界面中可以选择人脸图片.视频进行检 ...
- NLP入门(五)用深度学习实现命名实体识别(NER)
前言 在文章:NLP入门(四)命名实体识别(NER)中,笔者介绍了两个实现命名实体识别的工具--NLTK和Stanford NLP.在本文中,我们将会学习到如何使用深度学习工具来自己一步步地实现N ...
- 用深度学习做命名实体识别(二):文本标注工具brat
本篇文章,将带你一步步的安装文本标注工具brat. brat是一个文本标注工具,可以标注实体,事件.关系.属性等,只支持在linux下安装,其使用需要webserver,官方给出的教程使用的是Apac ...
- 行人重识别(ReID) ——基于深度学习的行人重识别研究综述
转自:https://zhuanlan.zhihu.com/p/31921944 前言:行人重识别(Person Re-identification)也称行人再识别,本文简称为ReID,是利用计算机视 ...
- ui2code中的深度学习+传统算法应用
背景 在之前的文章中,我们已经提到过团队在UI自动化这方面的尝试,我们的目标是实现基于 单一图片到代码 的转换,在这个过程不可避免会遇到一个问题,就是为了从单一图片中提取出足够的有意义的结构信息,我们 ...
- [Deep-Learning-with-Python]计算机视觉中的深度学习
包括: 理解卷积神经网络 使用数据增强缓解过拟合 使用预训练卷积网络做特征提取 微调预训练网络模型 可视化卷积网络学习结果以及分类决策过程 介绍卷积神经网络,convnets,深度学习在计算机视觉方面 ...
- 在浏览器中进行深度学习:TensorFlow.js (八)生成对抗网络 (GAN
Generative Adversarial Network 是深度学习中非常有趣的一种方法.GAN最早源自Ian Goodfellow的这篇论文.LeCun对GAN给出了极高的评价: “There ...
- PyTorch中使用深度学习(CNN和LSTM)的自动图像标题
介绍 深度学习现在是一个非常猖獗的领域 - 有如此多的应用程序日复一日地出现.深入了解深度学习的最佳方法是亲自动手.尽可能多地参与项目,并尝试自己完成.这将帮助您更深入地掌握主题,并帮助您成为更好的深 ...
随机推荐
- 用大白话讲大数据HBase,老刘真的很用心(1)
老刘今天复习HBase知识发现很多资料都没有把概念说清楚,有很多专业名词一笔带过没有解释.比如这个框架高性能.高可用,那什么是高性能高可用?怎么实现的高性能高可用?没说! 如果面试官听了你说的,会有什 ...
- 最全总结 | 聊聊 Python 办公自动化之 Word(下)
1. 前言 关于 Word 文档的读写,前面两篇文章分别进行了一次全面的总结 最全总结 | 聊聊 Python 办公自动化之 Word(上) 最全总结 | 聊聊 Python 办公自动化之 Word( ...
- tcp连接的三次握手
为什么tcp连接需要三次握手才能建立连接 主要是为了初始化sequence number的初始值,通信的双方要互相通知双方的sequence number,这个要作为以后数据通信的序号,保证以后不会因 ...
- js 手机号验证
1 js 通过正则表达式对手机号进行验证 2 3 var reg = /^1[3|4|5|8][0-9]\d{4,8}$/; 4 var sMobile = document.mobileform.m ...
- Yali 19 - 8 - 6 test T2 猪国(pig) 题解
T2 猪国 题⽬描述 猪国是⼀个由 \(n\) 个城市组成的国家. 国王意识到了"要致富,先修路"这句话的重要性,它决定⼤规模修路.不巧的是,猪国的 猪们不太会⼯程,于是只能请隔壁 ...
- 《Spring Boot 实战纪实》之如何攥写需求文档
目录 前言 (思维篇)人人都是产品经理 1.需求文档 1.1 需求管理 1.2 如何攥写需求文档 1.3 需求关键点文档 2 原型设计 2.1 缺失的逻辑 2.2 让想法跃然纸上 3 开发设计文档 3 ...
- kafka入门之broker-集群管理
依赖于zookeeper,broker向zk中注册的信息以json格式保存,其中包括: 1.listener_security_protocol_map:此值指定了该broker与外界通信所用的安全协 ...
- C#(三)基础篇—方法,递归,条件分支,循环,三元操作符
C# 本随笔为个人复习巩固知识用,多从书上总结与理解得来,如有错误麻烦指正 2020-12-03 1.方法 static void Main(string[] args) { float Sum(fl ...
- 日志聚合工具之 Loki
本文使用的 Loki 和 Promtail 版本为 1.6.1,Grafana 版本为 7.2.0:部署在 Linux 服务器 Loki 负责日志的存储和查询:Promtail 负责日志的采集并推送给 ...
- Linux之centos包管理【rpm】、【yum】、【tar】
rpm包是二进制格式,无需编译安装便可使用,tar包是源码格式,需要编译安装才可使用 rpm包管理: rpm:redhat package manager,红帽的包管理器,其主要的操作参数有如下: - ...