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训练模型进行评分/检测。
为了执行分类测试,您需要执行以下步骤:
**设置VS默认启动项目:**在Visual Studio中将
ObjectDetection
设置为启动项目。**运行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
ML.NET 示例:对象检测相关推荐
- 使用YOLO Core ML模型构建对象检测iOS应用(七)
目录 在我们的应用程序中添加模型 在捕获的视频帧上运行目标检测 绘制边界框 实际应用 下一步? 总目录 将ONNX对象检测模型转换为iOS Core ML(一) 解码Core ML YOLO对象检测器 ...
- ML.NET 示例:对象检测-ASP.NET Core Web和WPF桌面示例
ML.NET 版本 API 类型 状态 应用程序类型 数据类型 场景 机器学习任务 算法 v1.5.0 动态API 最新 端到端应用 图像文件 对象检测 深度学习 ONNX: Tiny YOLOv2 ...
- 使用数组操作解码YOLO Core ML对象检测(三)
目录 介绍 解码YOLO输出的正确方式 下一步 总目录 将ONNX对象检测模型转换为iOS Core ML(一) 解码Core ML YOLO对象检测器(二) 使用数组操作解码YOLO Core ML ...
- 将ONNX对象检测模型转换为iOS Core ML(一)
目录 介绍 使用YOLO进行物体检测 寻找正确的模型 将ONNX转换为Core ML 下一步 总目录 将ONNX对象检测模型转换为iOS Core ML(一) 解码Core ML YOLO对象检测器( ...
- 使用实时摄像头预览的iOS对象检测(六)
目录 介绍 应用布局 捕获相机反馈 相机反馈预览 完成相机预览配置 结论 总目录 将ONNX对象检测模型转换为iOS Core ML(一) 解码Core ML YOLO对象检测器(二) 使用数组操作解 ...
- 在Pixel 4 XL上尝试具有对象检测功能的Android NNAPI ML加速器
As the requirements for more private and fast, low-latency machine learning increases, so does the n ...
- monk js_对象检测-使用Monk AI进行文档布局分析
monk js 计算机视觉 (Computer Vision) 介绍 (Introduction) This is an article on how Object Detection can hel ...
- 检测和语义分割_分割和对象检测-第1部分
检测和语义分割 有关深层学习的FAU讲义 (FAU LECTURE NOTES ON DEEP LEARNING) These are the lecture notes for FAU's YouT ...
- 检测和语义分割_分割和对象检测-第5部分
检测和语义分割 有关深层学习的FAU讲义 (FAU LECTURE NOTES ON DEEP LEARNING) These are the lecture notes for FAU's YouT ...
最新文章
- Spring工厂注入例子
- 【数据结构与算法】之深入解析“将有序数组转换为二叉搜索树”的求解思路与算法示例
- 部署项目的问题(二)—— 阿里云服务器 ECS升级node版本
- 【拨云见日】全面云化时代,如何选择适合自己的“云”?
- 面试前可以在这里刷刷题,很巴适!(Java版)
- sh 脚本 访问 路径 权限不够_IC设计之脚本语言介绍
- 20200714:动态规划复习day05
- PG及IBM:开放式创新,就在你身边
- 【回文串3】LeetCode 125. Valid Palindrome
- 公司法人没社保零申报,原来可以这样?
- PS完美抠取头发丝----更换证件照背景完美去白边/蓝边/红边-----超实用方法
- TCP紧急模式理解心得
- mybatis insert返回自增主键的id值
- 全面理解ERP和APS:用饭局的例子说明,MRP 还是APS
- python-Matplotlib数据可视化
- 软件测试怎么样才能提高自己的效率?
- 罗杨美慧 20190919-4 单元测试,结对
- 网友反映学校计算机科学与工程学院教师,华南理工大学一院长被指篡改考生成绩 校方:四名涉事人员停职调查...
- Kubernetes网络插件flannel和calico
- IOS安卓友盟消息推送详细配置以及证书更新
热门文章
- java中想要保留2位小数_java使double保留两位小数的多方法 java保留两位小数
- HDFS文件目录操作代码
- python拓展7(Celery消息队列配置定时任务)
- jenkins2 groovy语法
- BZOJ3924 : [Zjoi2015]幻想乡战略游戏
- [tools]notepad++当前文件路径不是工作路径
- iOS ShareSDK 使用
- C#类与结构体究竟谁快——各种函数调用模式速度评测
- Oracle B-Tree Index 原理
- scss2css vscode设置_VSCode下让CSS文件完美支持SCSS或SASS语法方法