使用 ML.NET 识别乐高颜色块

每一个乐高迷都拥有很多的颜色块,需要进行排序和按类型分拣,按照《Organizing your LEGO Bricks》或许有所帮助,但这不是一个简单的任务,因为有很多颜色块有非常微妙的差异。如果换作一个典型的程序员可以做什么来解决这个问题呢?你猜对了 - 建立一个程序使用 ML.NET 来识别乐高的颜色块。

首先,我们将创建一个控制台应用并添加所需的包

> dotnet new console
> dotnet add package Microsoft.ML
> dotnet add package Microsoft.ML.Vision
> dotnet add package Microsoft.ML.ImageAnalytics
> dotnet add package SciSharp.TensorFlow.Redist

在项目文件夹的根目录中,我将创建一个名为 pieces 的子文件夹,并在此文件夹中创建一些颜色分类的子文件夹,放置训练集中的每种颜色的图片。

使用时,我们需要定义输入和输出模型(分类器提供分类结果)。

public class ModelInput
{public string Label { get; set; }public string ImageSource { get; set; }
}public class ModelOutput
{public String PredictedLabel { get; set; }
}

为了训练模型,我们首先创建一个由目录中的图像组成的输入数据集,并将其作为标签分配它们位于的目录的名称。在此之后,我们创建训练管道,最后,使用数据进行训练以创建模型。

static void TrainModel()
{// Create the input datasetvar inputs = new List<ModelInput>();foreach (var subDir in Directory.GetDirectories(inputDataDirectoryPath)){foreach (var file in Directory.GetFiles(subDir)){inputs.Add(new ModelInput() { Label = subDir.Split("\\").Last(), ImageSource = file });}}var trainingDataView = mlContext.Data.LoadFromEnumerable<ModelInput>(inputs);// Create training pipelinevar dataProcessPipeline = mlContext.Transforms.Conversion.MapValueToKey("Label", "Label").Append(mlContext.Transforms.LoadRawImageBytes("ImageSource_featurized", null, "ImageSource")).Append(mlContext.Transforms.CopyColumns("Features", "ImageSource_featurized"));var trainer = mlContext.MulticlassClassification.Trainers.ImageClassification(new ImageClassificationTrainer.Options() { LabelColumnName = "Label", FeatureColumnName = "Features" }).Append(mlContext.Transforms.Conversion.MapKeyToValue("PredictedLabel", "PredictedLabel"));IEstimator<ITransformer> trainingPipeline = dataProcessPipeline.Append(trainer);// Create the modelmlModel = trainingPipeline.Fit(trainingDataView);
}

现在,使用这个训练模型,我们可以尝试对一个新图像进行分类。通过为其中一个图像创建模型输入,然后将它传递到使用分类器构建的模型创建的预测引擎。

static ModelOutput Classify(string filePath)
{// Create input to classifyModelInput input = new ModelInput() { ImageSource = filePath };// Load model and predictvar predEngine = mlContext.Model.CreatePredictionEngine<ModelInput, ModelOutput>(mlModel);return predEngine.Predict(input);
}

最后让我们用4种不同的颜色来测试这一点。

static void Main()
{TrainModel();var result = Classify(Environment.CurrentDirectory + Path.DirectorySeparatorChar + "Black.jpg");Console.WriteLine($"Testing with black piece. Prediction: {result.PredictedLabel}.");result = Classify(Environment.CurrentDirectory + Path.DirectorySeparatorChar + "Blue.jpg");Console.WriteLine($"Testing with blue piece. Prediction: {result.PredictedLabel}.");result = Classify(Environment.CurrentDirectory + Path.DirectorySeparatorChar + "Green.jpg");Console.WriteLine($"Testing with green piece. Prediction: {result.PredictedLabel}.");result = Classify(Environment.CurrentDirectory + Path.DirectorySeparatorChar + "Yellow.jpg");Console.WriteLine($"Testing with yellow piece. Prediction: {result.PredictedLabel}.");
}

结果如图所示。

4张图片对了3个!略微有点令人失望。但这是一个很好的开始,因为它给了我们机会去深入,并试图了解如何改进分类,使其更准确。也许它需要更多的训练数据,也许有更好的分类算法我们可以使用!

项目完整示例代码和训练数据在GIthub上:https://github.com/BeanHsiang/Vainosamples/tree/master/CSharp/ML/LegoColorIdentifier

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306000.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ccs加载out文件_类加载流程、类加载机制及自定义类加载器详解

原文&#xff1a;juejin.im/post/5cffa528e51d4556da53d091一、引言当程序使用某个类时&#xff0c;如果该类还未被加载到内存中&#xff0c;则JVM会通过加载、链接、初始化三个步骤对该类进行类加载。二、类的加载、链接、初始化1、加载类加载指的是将类的class文件读入内存&a…

unity中单位是米还是厘米_【一步数学】小学数学单位换算公式大全及专项训练...

重量单位换算1吨1000千克 1吨1000 000克吨&#xff1a;吨是重量单位&#xff0c;公制一吨等于1000公斤&#xff1a;计算船只容积的单位&#xff0c;一吨等于2.83立方米&#xff08;合100立方英尺&#xff09;。1千克1000克 500克1斤千克&#xff1a;克&#xff0c;(符号kg或㎏)…

二分法查找是基于有序_201,查找顺序查找

查找算法中顺序查找算是最简单的了&#xff0c;无论是有序的还是无序的都可以&#xff0c;也不需要排序&#xff0c;只需要一个个对比即可&#xff0c;但其实效率很低。我们来看下代码1public static int search1(int[] a, int key) {2 for (int i 0, length a.length; i …

河南大学计算机组成原理,河南大学计算机组成原理考点

河南大学计算机组成原理考点 (34页)本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01;11.90 积分第&#xff11;章 计算机系统概论1、计算机硬件的五大部件&#xff1f;三大部分&#xff1f;运算器 存储器…

zipsys驱动签名工具_全球首发 300系列主板USB WIN7 64位驱动 SMXDIY

本版为改版驱动&#xff0c;仅供SMXDIY会员学习测试&#xff0c;禁止传播。众所周知&#xff0c;H310/B360/H370/Z390是没USB的WIN7驱动的。网上也找不到相关的资料&#xff0c;大家普遍默认没驱动&#xff0c;但这已经成为历史。我们这发布的是真的驱动&#xff0c;可以整合到…

excel筛选排序从小到大_excel表格怎么按字数的多少来排列!

excel表格怎么按字数的多少来排列为了更好的做好我们的语料编定及翻译工作&#xff0c;尤其是个别语料数量较多&#xff0c;最多可达2000条。我们可以将字数少的&#xff0c;意图明确的&#xff0c;不会有异议的&#xff0c;我们可以根据每句话的字数&#xff0c;用excel来进行…

计算机系统的工作方式,某计算机系统输入/输出采用双缓冲工作方式,其工作过程如下图所示,假设磁盘块与缓冲 - 信管网...

第2题&#xff1a;实时操作系统(RTOS)内核与应用程序之间的接口称为( )。A&#xff0e;I&#xff0f;O接口B&#xff0e;PCIC&#xff0e;APID&#xff0e;GUI答案解析与讨论&#xff1a;www.cnitpm.com/st/2867029381.html第3题&#xff1a;嵌入式处理器是嵌入式系统的核心部…

怎么从转移特性曲线上看dibl_「科普向」这篇让你快速搞懂IGBT的静态特性

IGBT的静态特性其实并非难以理解的东西,即便是对于外行人而言。刚接触那会儿&#xff0c;看到转移特性、输出特性之类的就想溜之大吉&#xff0c;加之网上查询的资料一概笼统简单&#xff0c;只描述特性曲线所表示的关系结果&#xff0c;却并不解释曲线为何这里弯曲、那里平直&…

对CORS OPTIONS预检请求的一些思考

前后端分离模大势所趋&#xff0c;跨域问题更是老生常谈。《程序员应对浏览器同源策略的姿势》一文提到三种跨域请求方案&#xff0c;重点讲述了w3c和浏览器厂商推出的CORS规范。同源策略 所谓同源是指域名、协议、端口相同。不同源的浏览器脚本(javascript、ActionScript、ca…

强烈推荐:SiteServer CMS开源免费的企业级CMS系统!

说到CMS&#xff0c;大家都知道织梦、帝国CMS、HPCMS、动易等知名老牌的&#xff01;这些东西也可以拿来就用&#xff0c;上次看到一个个人开源的cms&#xff1a;MCMS。基于SpringBoot 2架构&#xff0c;前端基于vue、element ui。每月28定期更新版本&#xff0c;为开发者提供…

计算机函数公式中怎么合并合并,Excel用函数和公式瞬间实现把表格全部合并到一个表中去...

将多张工作表汇总到一张工作表&#xff0c;这是什么意思呢&#xff1f;可以理解为把表格全部合并到一个表中去&#xff0c;之前使用VBA代码实现&#xff0c;本文将教会大家一种快速的方法&#xff0c;用函数和公式瞬间实现多表合并。例如&#xff1a;有N多个以月份命名的excel工…

. NET5一出,. NET岗面试普遍喊难,真相是…

.NET高级开发/架构师笔试题TOP101、如何设计一个高并发系统&#xff1f;2、如何实现一个.Net5 IOC框架&#xff1f;3、100W并发4G数据&#xff0c;10W并发400G数据&#xff0c;如何设计Redis存储方式&#xff1f;4、如何实现负载均衡Hash一致性算法&#xff1f;5、DotNetty能够…

数据库年月日时分秒_数据库基本使用系列(二)

书接上回&#xff0c;上回说到数据库的发展历史&#xff0c;存储引擎以及在库层面的一些操作&#xff0c;这次来讲一下数据库中的一些基本的一些数据格式以及对表的一些操作。数据类型数据库提供的数据类型&#xff0c;包括整数类型、浮点数类型、定点数类型、位类型、日期和时…

netcore读取json文件_【NET Core】.NET Core中读取json配置文件

在.NET Framework框架下应用配置内容一般都是写在Web.config或者App.config文件中&#xff0c;读取这两个配置文件只需要引用System.Configuration程序集&#xff0c;分别用System.Configuration.ConfigurationManager.AppSettings["SystemName"];//读取appSettings配…

前端数据层落地实践

源宝导读&#xff1a;天际移动平台经过重构改版&#xff0c;近期正式发布了1.0版本&#xff0c;我们在低代码开发方面做了进一步增强。本文主要围绕前端Model、前端业务逻辑(领域模型)、数据层与视图层解耦(包装器模式)3个方面&#xff0c;给大家分享一下统一数据层方案的设计思…

计算机内存条只认了一个,怎么解决Win10插入2个4G内存条却只显示4G?

为了提高 Win10系统 的运行速度&#xff0c;有用户在自己的电脑中&#xff0c;插入了2根4G内存&#xff0c;可是发现电脑只能显示4G而不是8G&#xff0c;奇怪的是使用卤蛋师却可以检测到8G内存&#xff0c;这是怎么回事呢&#xff1f;我们该如何解决呢&#xff1f;下面&#xf…

scanf 返回值_scanf函数

一、函数scanf()是C语言中的一个输入函数。与printf函数一样&#xff0c;都被声明在头文件stdio.h里&#xff0c;因此在使用scanf函数时要加上#include <stdio.h>。它是格式输入函数&#xff0c;即按用户指定的格式从键盘上把数据输入到指定的变量之中。函数的原型为&…

【Git】Git-常用命令备忘录(三)

git作为一个vcs&#xff08;version control system&#xff09;&#xff0c;是越用越香&#xff0c;那么还有哪些比较香的地方呢&#xff01;&#xff1f;1.远程仓库中拉取指定分支一定遇到这种情况&#xff0c;github看到一个心仪的开源仓库&#xff0c;但是分支太多&#xf…

mysql表类型_MySQL表类型的选择

P131)创建表时的默认引擎是InnoDB&#xff0c;如果要修改默认的存储引擎&#xff0c;可以在参数文件中设置default-table-type。查看当前的默认存储引擎&#xff0c;可以使用一下命令&#xff1a;创建新表的时候可以通过增加ENGINE关键字设置新建表的存储引擎。也可以通过ALTER…

ASP.NET Core Controller与IOC的羁绊

前言看到标题可能大家会有所疑问Controller和IOC能有啥羁绊&#xff0c;但是我还是拒绝当一个标题党的。相信有很大一部分人已经知道了这么一个结论&#xff0c;默认情况下ASP.NET Core的Controller并不会托管到IOC容器中&#xff0c;注意关键字我说的是"默认"&#…