ML.NET 示例:对象检测

ML.NET 版本API 类型状态应用程序类型数据类型场景机器学习任务算法
v1.4动态API最新控制台应用程序图像文件对象检测深度学习Tiny Yolo2 ONNX 模型

有关如何构建此应用程序的详细说明,请参阅Microsoft Docs网站上附带的教程。

问题

对象检测是计算机视觉中的一个经典问题:识别给定图像中的目标以及它们在图像中的位置。对于这些情况,您可以使用预先训练的模型,也可以训练自己的模型来对特定于自定义域的图像进行分类。

数据集

数据集包含位于assets文件夹中的图像。这些图片来自wikimedia commons网站。转到[wikimediacomon.md](./ObjectDetectionConsoleApp/assets/images/wikimedia.md)查看图像URL及其许可证。

预训练模型

有多个预先训练的模型来识别图像中的多个对象。这里我们使用的是预训练模型,Tiny Yolo2,格式为ONNX。该模型是一个用于对象检测的实时神经网络,可以检测20个不同的类别。它由9个卷积层和6个最大池层组成,是更复杂的full[YOLOv2]的较小版本(https://pjreddie.com/darknet/yolov2/)网络。

开放式神经网络交换即ONNX是一种表示深度学习模型的开放格式。使用ONNX,开发人员可以在最先进的工具之间移动模型,并选择最适合他们的组合。ONNX是由一个合作伙伴社区开发和支持的。

模型从ONNX Model Zoo 下载,这是一个预训练的,最先进的模型在ONNX格式的集合。

Tiny YOLO2模型是在Pascal VOC数据集上训练的(http://host.robots.ox.ac.uk/pascal/VOC/)。以下是模型的先决条件。

模型输入和输出

输入

输入图像的大小 (3x416x416)

输出

输出是一个(1x125x13x13)数组

预处理步骤

将输入图像调整为float32类型的(3x416x416)数组。

后处理步骤

输出是一个(125x13x13)张量,其中13x13是图像被分割成的网格单元数。每个网格单元对应125个通道,由网格单元预测的5个边界框和描述每个边界框的25个数据元素(5x25=125)组成。有关如何导出最终边界框及其相应的置信度分数的更多信息,请参阅文章。

解决方案

控制台应用程序项目ObjectDetection可用于识别基于Tiny Yolo2 ONNX模型的示例图像中的对象。

同样,请注意,此示例仅使用/使用带有ML.NET API的预先训练的ONNX模型。因此,它训练任何ML.NET模型。目前,ML.NET仅支持对现有ONNX训练模型进行评分/检测。

为了执行分类测试,您需要执行以下步骤:

  1. **设置VS默认启动项目:**在Visual Studio中将ObjectDetection设置为启动项目。

  2. **运行training model控制台应用程序:**在Visual Studio中按F5。在执行结束时,输出将类似于此屏幕截图:

代码演练

解决方案中有一个名为ObjectDetection的项目,负责以 Tiny Yolo2 ONNX格式加载模型,然后检测图像中的对象。

ML.NET:模型评分

定义类中的数据架构,并在使用TextLoader加载数据时引用该类型。这里的类是ImageNetData

public class ImageNetData
{[LoadColumn(0)]public string ImagePath;[LoadColumn(1)]public string Label;public static IEnumerable<ImageNetData> ReadFromFile(string imageFolder){return Directory.GetFiles(imageFolder).Where(filePath => Path.GetExtension(filePath) != ".md").Select(filePath => new ImageNetData { ImagePath = filePath, Label = Path.GetFileName(filePath) });}
}

ML.NET:配置模型

第一步是创建一个空的数据视图,因为我们在配置模型时只需要数据模式。

var data = mlContext.Data.LoadFromTextFile<ImageNetData>(imagesLocation, hasHeader: true);

用于加载图像的图像文件有两列:第一列定义为ImagePath,第二列定义为与图像对应的Label

需要强调的是,在使用Tiny Yolo2 Onnx模型进行评分时,ImageNetData类中的Label并没有真正使用。仅在控制台上打印标签时使用。

第二步是定义评估器管道。通常,在处理深度神经网络时,必须使图像适应网络所期望的格式。这就是图像调整大小然后变换的原因(主要是在所有R、G、B通道中对像素值进行归一化)。

var pipeline = mlContext.Transforms.LoadImages(outputColumnName: "image", imageFolder: "", inputColumnName: nameof(ImageNetData.ImagePath)).Append(mlContext.Transforms.ResizeImages(outputColumnName: "image", imageWidth: ImageNetSettings.imageWidth, imageHeight: ImageNetSettings.imageHeight, inputColumnName: "image")).Append(mlContext.Transforms.ExtractPixels(outputColumnName: "image")).Append(mlContext.Transforms.ApplyOnnxModel(modelFile: modelLocation, outputColumnNames: new[] { TinyYoloModelSettings.ModelOutput }, inputColumnNames: new[] { TinyYoloModelSettings.ModelInput }));

您还需要检查神经网络,并检查输入/输出节点的名称。为了检查模型,您可以使用Netron之类的工具,它与Visual Studio Tools for AI一起自动安装。这些名称稍后将在评估管道的定义中使用:在初始网络的情况下,输入张量命名为“image”,输出命名为“grid”。

定义模型的输入输出参数。

public struct TinyYoloModelSettings
{// for checking TIny yolo2 Model input and  output  parameter names,//you can use tools like Netron, // which is installed by Visual Studio AI Tools// input tensor namepublic const string ModelInput = "image";// output tensor namepublic const string ModelOutput = "grid";
}


最后,我们在拟合评估器管道之后返回训练模型。

  var model = pipeline.Fit(data);return model;

检测图像中的对象:

在模型配置完成后,我们需要将图像传递给模型来检测对象。获取预测时,我们在属性PredictedLabels中获得一个浮点数组。该数组是一个浮点数组,大小为21125。如前所述,这是125x13x13的输出。此输出由“YoloOutputParser”类解释,并为每个图像返回多个边界框。再次过滤这些框,以便我们仅检索5个边界框,这些边界框对于图像的每个对象具有更好的可信度(一个框包含obejct的确定程度如何)。

IEnumerable<float[]> probabilities = modelScorer.Score(imageDataView);YoloOutputParser parser = new YoloOutputParser();var boundingBoxes =probabilities.Select(probability => parser.ParseOutputs(probability)).Select(boxes => parser.FilterBoundingBoxes(boxes, 5, .5F));

注意与完整的Yolo2模型相比,Tiny Yolo2模型没有太多的精确度。由于这是一个示例程序,我们使用的是微型版本的Yolo模型,即Tiny_Yolo2

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

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

相关文章

双十一来了,揭秘菜鸟物流背后的那些算法黑科技

又是一年双十一&#xff0c;又一个巨大的挑战摆在了包括菜鸟网络在内的物流面前&#xff0c;但随着人工智能、大数据的应用越来越广泛&#xff0c;无人化仓储、无人化配送越来越多&#xff0c;供应链越来越扁平化&#xff0c;各种算法应用到物流领域的每一个细节。那么&#xf…

开源推荐:Asp.Net Core入门学习手册!

前言推荐一个入门级的.NET Core开源项目&#xff0c;非常适合新手入门学习.NET Core。开源地址:https://github.com/windsting/little-aspnetcore-book。手册在线下载地址&#xff1a;https://nbarbettini.gitbooks.io/little-asp-net-core-book/content/chapters/mvc-basics/c…

如何拿到高薪数据分析师offer?从精准解读一篇招聘信息开始!

大家好&#xff0c;我是大鹏&#xff0c;目前是一名数据分析师&#xff0c;从非本专业成功转行&#xff0c;创立“数据团学社”“城市数据研习社”&#xff0c;运营数十万人社群&#xff0c;联合发起“城市数据团”。最近有很多学弟学妹咨询我入行数据分析师的情况。总体上说&a…

微软翻译api的使用介绍和注意事项

google翻译api已经收费了&#xff0c;而微软翻译api目前是免费的&#xff0c;支持几种不同的方式访问&#xff0c;如果感兴趣可以自己封装下协议处理。官方介绍&#xff1a; http://msdn.microsoft.com/en-us/library/hh454950.aspx。 这里介绍一下java下的使用。Java下使用微软…

linux备份文件到ftp上,Linux服务器下用FTP上传下载备份文件

从linux服务器批量上传/home/test文件夹里面文件到FTP(192.168.1.122)里面wwwroot目录##shell脚本如下&#xff1a;updir/home/testtodirwwwrootip192.168.1.122usertestpasswordtest123123sssfind $updir -type d -printf $todir/’%P\n’| awk ‘{if ($0 “”)next;print “…

为什么不能除以零?

全世界有3.14 % 的人已经关注了数据与算法之美如果你问苹果手机上的Siri&#xff0c;“零除以零等于多少”&#xff0c;它会显示&#xff1a;但是&#xff0c;英文版的Siri还会用语音说这一段话&#xff1a;“假如你有0块饼干&#xff0c;要分给0个朋友&#xff0c;每个人能分到…

设计模式之Builder

2019独角兽企业重金招聘Python工程师标准>>> Builder模式定义&#xff1a; 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. Builder模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类型和内容就可以构建它们…

linux kvm系统,linux kvm虚拟机安装以及主机配置支持有哪些?如何远程控制linux kvm系统?...

服务器安装kvm的时候&#xff0c;如果没有安装桌面(一般不会安装&#xff0c;节省资源)&#xff0c;就需要使用命令去创建虚拟机。要支持 KVM&#xff0c;Intel CPU需要 vmx 或者 AMD CPU 需要svm 扩展。在linux系统上使用kvm虚拟化系统需要对主机开启虚拟化,并做一些基础设置,…

C# 答群友:把窗体应用改成类库输出然后去引用

类库你就新建类库文件直接生成dll去引用好了&#xff0c;但是群友非要骚操作&#xff0c;新建一个windows窗体把他搞成dll去引用&#xff0c;当时我回答了这个问题是可以的&#xff0c;但是实际上我没有这么干过&#xff0c;今天恰好有空&#xff0c;体验了一把&#xff0c;的确…

麻省理工告诉我们男女配对的真相!

全世界有3.14 % 的人已经关注了数据与算法之美该实验出自麻省理工学院著名经济学家Dan Ariely的《The Upside of Irrationality》。其结果很有趣&#xff0c;也在我们的生活中尤为常见。Part 1.实验人员找来100位正值青春年华的大学生。男女各半。然后制作了100张卡片&#xff…

快速排序的性能和名字一样优秀

前言上次分享的冒泡排序虽然比较简单、容易理解&#xff0c;但每一次冒泡的过程都需要依次比较相邻的元素&#xff0c;然后交换&#xff0c;可见性能还是有很大的优化空间&#xff0c;只要能减少比较次数&#xff0c;性能自然就上去啦&#xff1b;快速排序便是一个很不错的选择…

资料分享 | 教程与开发手册资料分享来袭

小编从大学开始&#xff0c;便开启资料收集功能。随着科技时代的不断发展&#xff0c;计算机语言发展进入新的阶段&#xff0c;再加上日常的深入研究&#xff0c;小编收集整理了丰富的计算机语言学习资料&#xff0c;内容涵盖“教程与开发手册”&#xff0c;“js资料”、“PHP编…

备受期待的Python深度学习来了

在这个酣畅淋漓的暑假结束后&#xff0c;深度学习的四大名著之一漂洋过海来见中国的程序员们啦&#xff0c;豆瓣评分9.5分的《Deep Learning with Python》&#xff0c;推出中译版——《Python深度学习》Deep Learning with PythonPython深度学习扫码购买优惠近30元&#xff01…

安装linux6.10 I386系统教程,一看就懂的Centos6.10安装教程

第一步将虚拟机安装完毕后&#xff0c;运行虚拟机进行到这个界面下(虚拟机安装及其配置&#xff0c;详见论坛内的博客分享在这就不在陈述)&#xff0c;&#xff1a;出现的是5条英文由上到下以此分别为&#xff1a;1.安装或升级2.基本的显卡驱动来安装系统(在有些操作系统无法识…

计算机是怎么知道两张图片相似的呢?

全世界有3.14 % 的人已经关注了数据与算法之美很多搜索引擎可以用一张图片&#xff0c;搜索互联网上所有与它相似的图片。你输入网片的网址&#xff0c;或者直接上传图片&#xff0c;Google就会找出与其相似的图片。下面这张图片是美国女演员Alyson Hannigan。上传后&#xff0…

WPF实现下拉框带图文和水印

WPF开发者QQ群&#xff1a; 340500857 有小伙伴需要实现ComboBox下拉框带水印&#xff0c;并且选择Item内容后水印默认从中间到顶部。Item需要展示图文&#xff0c;选择后的数据展示图文。欢迎转发、分享、点赞&#xff0c;谢谢大家~。效果如下&#xff1a;一、Xaml代码如下<…

Google第一女神李飞飞,从洗碗工蜕变成为首席科学家

全世界有3.14 % 的人已经关注了数据与算法之美最近这几天&#xff0c;5岁孩子简历事件刷爆了朋友圈。批阅完朋友圈的文章&#xff0c;超模君心好累。别人家的孩子5岁已经每周3篇英语日记&#xff0c;而5岁我却还在玩泥巴&#xff0c;终于明白什么叫输在起跑线上了。即便输在了起…

通过Dapr实现一个简单的基于.net的微服务电商系统(九)——一步一步教你如何撸Dapr之OAuth2授权...

Oauth2授权&#xff0c;熟悉微信开发的同学对这个东西应该不陌生吧。当我们的应用系统需要集成第三方授权时一般都会做oauth集成&#xff0c;今天就来看看在Dapr的语境下我们如何仅通过配置无需修改应用程序的方式让第三方服务保护我们的API应用。目录&#xff1a;一、通过Dapr…

宝宝学数学的第一套书,秒杀题海战术!上小学前应该这样学数学!

作为一个小学口心算特好、初高中也特别好的学霸。小木一直很关心孩子们的数学问题。我一直都在探索如何引领孩子走进数学的大门&#xff0c;启发他学数学的兴趣&#xff0c;以及把数学思维应用到生活中&#xff0c;而不仅仅是学会背数、四则运算、乘法口诀。孩子大多在3、4岁开…

使用 Azure Container Registry 储存镜像

Azure Container Registry&#xff08;容器注册表&#xff09;是基于 Docker Registry 2.0规范的托管专用 Docker 注册表服务。可以创建和维护 Azure 容器注册表来存储与管理专用的 Docker 容器映像和相关项目。Azure Container Registry 类似与阿里云的容器镜像服务。提供镜像…