YOLOv7 在 ML.NET 中使用 ONNX 检测对象

本文介绍如何在 ML.NET 中使用 YOLOv7 的 ONNX 模型来检测图像中的对象。

什么是 YOLO

YOLO(You Only Look Once)是一种先进的实时目标检测系统。它是一个在COCO数据集上预训练的物体检测架构和模型系列,其版本也是在不断优化更新。2022年7月,YOLOv7 来临。官方版的YOLOv7相同体量下比YOLOv5 精度更高,速度更快。

论文地址:https://arxiv.org/abs/2207.02696

ce70fa660ecaef3a76e0e51455959311.png

Yolov7

ONNX 模型

开放神经网络交换 (ONNX) 是 AI 模型的开放源代码格式。ONNX 支持框架之间的互操作性,常见的机器学习框架都支持该模型的使用。

YOLOv7 的模型我们可以从一作 Chien-Yao Wang 的仓库获取:https://github.com/WongKinYiu/yolov7。在 Releases v0.1 中提供的 onnx 不能直接使用,我们需要下载预训练的 yolov7.pt 然后克隆项目,使用导出工具自行导出 onnx 模型。

python export.py --weights=yolov7.pt --grid --simplify

导出完成我们就可以得到 yolov7.onnx ,你也可以直接前往 CSDN 下载我分享的文件[1]

执行预测

1.首先创建控制台应用程序,选择 .NET 6 作为要使用的框架。2.安装 Microsoft.ML.OnnxTransformer NuGet 包3.YOLOv7 整体结构与 YOLOv5 极其相似,我们可以直接使用 Yolov5Net NuGet 包里的分析器来处理模型输出。

剩下的工作,我们只需要编写执行预测的代码即可:

static readonly string assetsPath = GetAbsolutePath(@"../../../assets");
static readonly string modelFilePath = Path.Combine(assetsPath, "Model", "yolov7.onnx");
static readonly string imagesFolder = Path.Combine(assetsPath, "images");
static readonly string outputFolder = Path.Combine(assetsPath, "images", "output");private static void Main(string[] args)
{if (!Directory.Exists(outputFolder)){Directory.CreateDirectory(outputFolder);}var imgs = Directory.GetFiles(imagesFolder).Where(filePath => Path.GetExtension(filePath) == ".jpg");using var scorer = new YoloScorer<YoloCocoP5Model>(modelFilePath);foreach (var imgsFile in imgs){using var image = Image.FromFile(imgsFile);List<YoloPrediction> predictions = scorer.Predict(image);using var graphics = Graphics.FromImage(image);foreach (var prediction in predictions){double score = Math.Round(prediction.Score, 2);graphics.DrawRectangles(new Pen(prediction.Label.Color, 3),new[] { prediction.Rectangle });var (x, y) = (prediction.Rectangle.X - 3, prediction.Rectangle.Y - 23);graphics.DrawString($"{prediction.Label.Name} ({score})",new Font("Consolas", 16, GraphicsUnit.Pixel), new SolidBrush(prediction.Label.Color),new PointF(x, y));}image.Save(Path.Combine(outputFolder, $"result{DateTime.Now.Ticks}.jpg"));}
}/// <summary>
/// 获取程序启动目录
/// </summary>
/// <param name="relativePath">之下的某个路径</param>
/// <returns></returns>
private static string GetAbsolutePath(string relativePath)
{FileInfo _dataRoot = new FileInfo(typeof(Program).Assembly.Location);string assemblyFolderPath = _dataRoot.Directory!.FullName;string fullPath = Path.Combine(assemblyFolderPath, relativePath);return fullPath;
}

完整的代码样例见:https://github.com/sangyuxiaowu/ml_yolov7

编写完成执行,然后我们就可以在 assets/images/output 目录看到样例图片的预测结果:

8d3495abfa654a853053f21215a3a4b2.png

预测结果

示例和参考

微软官方提供了 在 ML.NET 中使用 ONNX 检测对象[2] 的更详细的教程,包含训练和预测,感兴趣的同学可前往查阅。

References

[1] CSDN 下载我分享的文件: https://download.csdn.net/download/marin1993/86912472
[2] 在 ML.NET 中使用 ONNX 检测对象: https://learn.microsoft.com/zh-cn/dotnet/machine-learning/tutorials/object-detection-onnx

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

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

相关文章

Vue中render: h = h(App)的含义

原文地址&#xff1a;Explanation for render: h > h(App) please 翻译如下&#xff1a; render: h > h(App) 是下面内容的缩写&#xff1a; render: function (createElement) {return createElement(App); }进一步缩写为(ES6 语法)&#xff1a; render (createElem…

NppFTP小插件的使用

大家在Linux系统中配置运行环境时&#xff0c;一定会遇到相关配置文件的修改&#xff0c;虽说在Linux系统中可以使用vi,vim的命令进行文本编辑&#xff0c;但是操作起来还是没有在Windows系统中用的爽&#xff0c;特别是操作大文本量的文件时。Notepad里提供了一个小插件&#…

『实战』使用Excel催化剂二维码功能批量生成带不同图案二维码。

熟悉Excel催化剂的老读者都知道&#xff0c;每逢图书大促&#xff0c;笔者都会向出版社申请优惠码优惠券来惠及广大粉丝。当然公众号上帮出版社推荐图书&#xff0c;会有佣金回报&#xff0c;这也是笔者唯一能接受的推广方式。公众号自创立以来&#xff0c;没有接过软文&#x…

springboot ElasticSearch 简单的全文检索高亮

前阵子和张三丰聊天提到了es。这次正好有机会学习并使用 首先引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> 配置文件 spring.data.…

JavaScriptSerializer类 对象序列化为JSON,JSON反序列化为对象

JavaScriptSerializer 类由异步通信层内部使用&#xff0c;用于序列化和反序列化在浏览器和 Web 服务器之间传递的数据。说白了就是能够直接将一个C#对象传送到前台页面成为javascript对象。要添加System.Web.Extensions.dll的引用。该类位于System.Web.Script.Serialization命…

nodejs 实践:express 最佳实践(六) express 自省获得所有的路由

nodejs 实践&#xff1a;express 最佳实践(六) express 自省获得所有的路由 某些情况下&#xff0c;你需要知道你的应用有多少路由&#xff0c;这在 express 中没有方法可以。因此我这边曲线了一下&#xff0c;做成了一个函数进行处理。遍历所有的方法进行处理。 代码 const _ …

使用vue组件搭建网页应用

使用vue组件搭建网页应用搭建开发环境开发组件搭建开发环境 搭建一个 vue 项目最快的方式就是使用 vue cli 脚手架进行初始化&#xff0c;包含了所有完整的依赖及开发配置。 首先全局安装 vue cli&#xff0c;打开 cmd 命令提示符 或者 power shell&#xff0c;输入以下命令&…

重新整理 .net core 实践篇 —linux上排查问题实用工具 [外篇]

前言介绍下面几个工具:Lldbcreatedumpdotnet-dumpdotnet-gcdumpdotnet-symbolProcdump该文的前置篇为:https://www.cnblogs.com/aoximin/p/16839812.html献给初学者&#xff0c;这篇就只介绍下看下日志和lldb&#xff0c;毕竟东西太多了。正文我以官网的例子作为演示&#xff1…

Office 365离线安装

Office 365除了可以在线安装外&#xff0c;还可以进行离线安装&#xff0c;但激活还是需要连接互联网的哟首先下载Office部署工具https://www.microsoft.com/en-us/download/details.aspx?id49117 下载文件后&#xff0c;运行自解压缩可执行文件&#xff0c;其中包含 Office 部…

reduceByKey和groupByKey区别与用法

2019独角兽企业重金招聘Python工程师标准>>> 在Spar看中&#xff0c;我们知道一切的操作都是基于RDD的。在使用中&#xff0c;RDD有一种非常特殊也是非常实用的format——pair RDD&#xff0c;即RDD的每一行是&#xff08;key, value&#xff09;的格式。这种格式很…

python自动化测试-D6-学习笔记之一(常用模块补充datetime模块)

# datetime 模块import datetimeprint(datetime.datetime.today()) #当前日期&#xff0c;到秒 打印结果&#xff1a;2018-01-21 10:23:46.034410print(datetime.datetime.now()) # 当前日期&#xff0c;到秒 打印结果&#xff1a;2018-01-21 10:23:46.034410print(datetime.d…

Vue如何在data中正确引入图片路径

方法一&#xff1a;将图片资源放入项目 /static 目录下&#xff0c;使用绝对或相对路径引用即可 // 文件结构 |-- src | |-- components | | |-- banner.vue |-- static | |-- images | | |-- pic.jpg<template><div id"banner"><img :s…

软件工程的第一性原理丨SmartIDE

作者&#xff1a;徐磊原文地址&#xff1a;https://smartide.cn/zh/blog/2022-1022-software-engineering/徐磊英捷创软科技&#xff08;北京&#xff09;有限公司创始⼈/⾸席架构师 / CEO / SmartIDE开源项⽬创始⼈。微软最有价值专家MVP&#xff0c;微软区域技术总监&#xf…

排序算法之快速排序详解

一、算法介绍 快速排序&#xff1a;快速排序的基本思想是通过一次排序将等待的记录分成两个独立的部分&#xff0c;其中一部分记录的关键字小于另一部分的关键字。C部分的快速排序一直持续到整个序列被排序。 任取一个元素 (如第一个) 为中心提出所有小于它的元素&#xff0c;并…

openstack 中国联盟公开课參会总结

主流趋势 1. openstack defcore 互操作性认证。打通不同的openstack 厂商之间的连接2. 首批OpenStack管理员认证(COA)将于2016年进行3. 混合云应用广泛 Cloud Broker,cascading openstack 云连接器4. DevOps5. 虚拟桌面6. Storage 方面&#xff0c;Ceph和Glusterfs 7. Network…

bzoj1088[SCOI2005]扫雷Mine

1088: [SCOI2005]扫雷Mine Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4284 Solved: 2552[Submit][Status][Discuss]Description 相信大家都玩过扫雷的游戏。那是在一个n*m的矩阵里面有一些雷&#xff0c;要你根据一些信息找出雷来。万圣节到了&#xff0c;“余”人国流…

Re:从零开始的Vue项目搭建

Re&#xff1a;从零开始的Vue项目搭建初始的终结与结束的开始Nodejs项目的简单测试从零开始webpack开发模式webpack编译打包后记初始的终结与结束的开始 最开始接触vue项目搭建是从vue-cli开始&#xff0c;模板式操作&#xff0c;一键搞定&#xff0c;几乎可以无缝进入代码开发…

在数据库插入带小数点数据的问题

想在mysql插入以下数据设计表的时候没有注意,之前都用的int,这次换成了double,但是插入第一条3.50的时候数据库显示为:查了之后知道是设计表的时候没有注意小数点的设置转载于:https://juejin.im/post/5c0f61bb6fb9a049ea38cbe9

oracle 11g 创建 job 20

15-10-19 23:48:04分类&#xff1a; Oracle--创建一次执行的匿名块任务&#xff0c;成功调用一次后job消失BEGIN DBMS_SCHEDULER.CREATE_JOB ( job_name > my_new_job2, job_type > PLSQL_BLOCK, job_action &g…

Jzoj5317 Func

f(1)1 f(2x)f(x) f(2x1)f(x)f(x1) 给出n<10^6&#xff0c;求:所有的i满足f(i)n 第一道类欧算法 我们考虑一个性质 f(2x1)f(x)f(x1)f(2x)f(2x2) 所以&#xff0c;显然有f(2x1)>f(2x) f(2x1)>f(2x2) 那么现在我们知道了f(2x1),自然考虑枚举一个f(2x) 可以按照以下形式…