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…

socket编程资料-网络收集

1、什么是Socket&#xff1f; Socket又称之为“套接字”&#xff0c;是系统提供的用于网络通信的方法。它的实质并不是一种协议&#xff0c;没有规定计算机应当怎么样传递消息&#xff0c;只是给程序员提供了一个发送消息的接口&#xff0c;程序员使用这个接口提供的方法&#…

linux监听端口丢失,linux – 如果没有监听端口,则为Systemd重启服务

我建议你采用不同的方法,并使用专用的监控工具来实现这一目标.我最喜欢的监控工具,允许重新启动服务,以防它们崩溃,或者不再在其配置的端口上监听,这是monit&#xff1a;https://packages.debian.org/jessie/monit配置文件中有很多示例,在此站点和其他地方有关设置的示例.我将列…

开源推荐: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 “…

简单概述 .NET Framework 各版本区别

目前已发行的版本有1.0、1.1、2.0、3.0、3.5、4.0、4.5&#xff08;及4.5.1、4.5.2&#xff09;、4.6&#xff08;及4.6.1&#xff09;。1.0版本&#xff1a;最初的.net framework版本&#xff0c;作为一个独立的工具包存在。1.1版本&#xff1a;是1.1的升级版本&#xff0c;加…

为什么不能除以零?

全世界有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…

查看linux的计划任务日志,查看计划任务日志(共5篇).docx

查看计划任务日志(共5篇)沈阳工程学院  学生实验报告  实验室名称&#xff1a;信息学院网络安全实验室  实验课程名称&#xff1a;网络安全技术  实验项目名称&#xff1a;实验六日志查看与清除实验  班级&#xff1a;姓名&#xff1a;学号&#xff1a;  实验日期&…

ios启动画面

iOS设备现在有三种不同的分辨率&#xff1a;iPhone 320x480、iPhone 4 640x960、iPad 768x1024。以前程序的启动画面(图片)只要准备一个 Default.png 就可以了&#xff0c;但是现在变得复杂多了。下面就是 CocoaChina 会员做得总结 如果一个程序&#xff0c;既支持iPhone又支持…

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

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

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

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

Linux下ms软件,在linux下有没有什么软件可以连接windows上的MSSQL SERVER

在linux下有没有什么软件可以连接windows上的MSSQL SERVERGUI的http://dbeaver.jkiss.org/http://bbs.csdn.net/topics/391014331https://github.com/serge-rider/dbeaverhttps://github.com/serge-rider?tabrepositories在Linux(UNIX)下连接MS SQLserver的方法http://blog.cs…

你可能会用到的 Mock 小技巧

你可能会用到的 Mock 小技巧Intro最近看到阿迪分享了两篇 Mock 相关的文章&#xff0c;于是想把自己遇到的一些可能对你有帮助的一些小技巧分享一下&#xff0c;大概总结了一下&#xff0c;且看下文AsyncEnumerable在 C# 8 中引入了异步流&#xff0c;AsyncEnumerable&#xff…

Mangos源码分析(2):服务器结构探讨之登录服的负载均衡

回想一下我们在玩wow时的操作流程&#xff1a;运行wow.exe进入游戏后&#xff0c;首先就会要求我们输入用户名和密码进行验证&#xff0c;验证成功后才会出来游戏世界列表&#xff0c;之后是排队进入游戏世界&#xff0c;开始游戏...  可以看到跟前面的描述有个很明显的不同&…