使用ML.NET进行对象检测

1、前言

        ML.NET 是面向 .NET 开发人员的开源跨平台机器学习框架,支持将自定义机器学习模型集成到 .NET 应用程序中。 它包含一个 API,其中包含不同的 NuGet 包、名为 模型生成器的 Visual Studio 扩展,以及作为 .NET 工具安装的 命令行接口。

链接:ML.NET 概述 - ML.NET | Microsoft Learn

2、效果展示

3、实现

1)、环境依赖

        借用Halcon做图像显示控件。

        WPF应用程序。

2)、前台代码
 <Grid>
     <Grid.ColumnDefinitions>
         <ColumnDefinition />
         <ColumnDefinition />
     </Grid.ColumnDefinitions>
     <Grid.RowDefinitions>
         <RowDefinition Height="50" />
         <RowDefinition />
     </Grid.RowDefinitions>
     <StackPanel Grid.ColumnSpan="2" Orientation="Horizontal">
         <Button
             Click="Button_Click"
             Content="选择图像"
             Tag="1" />
         <TextBox
             x:Name="tbFiltScore"
             Width="50"
             Margin="15"
             VerticalAlignment="Center"
             BorderBrush="NavajoWhite"
             BorderThickness="0,0,0,1"
             Text="0.5"
             TextAlignment="Center" />
         <Button
             Click="Button_Click"
             Content="执行推理"
             Tag="2" />
     </StackPanel>
     <halconDot:HSmartWindowControlWPF x:Name="ImgControl" Grid.Row="1" />
     <ListView
         Grid.Row="1"
         Grid.RowSpan="2"
         Grid.Column="1"
         Background="DarkCyan"
         ItemsSource="{Binding DataInfos}">
         <ListView.ItemTemplate>
             <DataTemplate DataType="local:ResultInfo">
                 <StackPanel Orientation="Horizontal">
                     <TextBlock Width="Auto" Text="{Binding Index}" />
                     <TextBlock Width="100" Text="{Binding BoxLabel}" />
                     <TextBlock Width="100" Text="{Binding Score, StringFormat={}{0:F6}}" />
                     <TextBlock Width="100" Text="{Binding Box.XTop, StringFormat={}{0:F6}}" />
                     <TextBlock Width="100" Text="{Binding Box.YTop, StringFormat={}{0:F6}}" />
                     <TextBlock Width="100" Text="{Binding Box.XBottom, StringFormat={}{0:F6}}" />
                     <TextBlock Width="100" Text="{Binding Box.YBottom, StringFormat={}{0:F6}}" />
                 </StackPanel>
             </DataTemplate>
         </ListView.ItemTemplate>
     </ListView>
 </Grid>
3)、后台代码
1.推理处理
 public class DeepHelp
 {
     public List<ResultInfo> Test(string filename)

     {
         // Create single instance of sample data from first line of dataset for model input.
         //var image = MLImage.CreateFromFile(@"D:\3项目文件\门锁项目\智能门锁图像\Image_20241119105244991.bmp");
         var image = MLImage.CreateFromFile(filename);
         SentimenModel.ModelInput sampleData = new SentimenModel.ModelInput()
         {
             Image = image,
         };
         // Make a single prediction on the sample data and print results.
         var predictionResult = SentimenModel.Predict(sampleData);
         Console.WriteLine("\n\nPredicted Boxes:\n");
         if (predictionResult.PredictedBoundingBoxes == null)
         {
             Console.WriteLine("No Predicted Bounding Boxes");
             return null;
         }
         List<ResultInfo> boxes =
             predictionResult.PredictedBoundingBoxes.Chunk(4)
                 .Select(x => new BoxInfo { XTop = x[0], YTop = x[1], XBottom = x[2], YBottom = x[3] })
                 .Zip(predictionResult.Score, (a, b) => new ResultInfo { Box = a, Score = b }).ToList();

         for (int i = 0; i < boxes.Count; i++)
         {
             boxes[i].BoxLabel = predictionResult.PredictedLabel[i];
             boxes[i].Index = i + 1;
         }
         return boxes;
         //foreach (var item in boxes)
         //{
         //    Console.WriteLine($"XTop: {item.Box.XTop},YTop: {item.Box.YTop},XBottom: {item.Box.XBottom},YBottom: {item.Box.YBottom}, Score: {item.Score}");
         //}
     }
 }

 public class ResultInfo
 {
     public int Index { get; set; }
     public float Score { get; set; }
     public BoxInfo Box { get; set; }

     public string BoxLabel { get; set; }
 }

 public class BoxInfo
 {
     public float XTop { get; set; }
     public float YTop { get; set; }
     public float XBottom { get; set; }
     public float YBottom { get; set; }
 }
 2.调用
   private async Task<List<ResultInfo>> ProcessAnayleData(string fileName)
   {
       List<ResultInfo> boxes = await Task.Run(() => { return new DeepHelp().Test(fileName); });
       return boxes;
   }
3.显示
 private void DispResultInfo(List<ResultInfo> res)
 {
     ImgControl.HalconWindow.SetDraw("margin");
     int i = 0;
     double minScore = Convert.ToDouble(tbFiltScore.Text.Trim());
     foreach (ResultInfo info in res)
     {
         if (info.Score < minScore)
         {
             continue;
         }
         HRegion hRegion = new HRegion();
         hRegion.GenRectangle1(info.Box.YTop, info.Box.XTop * 1.0, info.Box.YBottom, info.Box.XBottom);

         if (i >= colors.Length)
         {
             i = 0;
         }
         string colorStr = colors[i++];

         ImgControl.HalconWindow.SetColor(colorStr);

         ImgControl.HalconWindow.DispRegion(hRegion);
         ImgControl.HalconWindow.DispText(info.Score.ToString("F3") + info.BoxLabel, "image", info.Box.YTop, info.Box.XTop * 1.0, colorStr, new HTuple(), new HTuple());
         //   break;
     }

     //DrawBoundingBox("/output", FileName,res);
 }

4、模型准备

        使用扩展创建深度学习模型训练,按照图示走。

1)、选择方案

        我这里是选择为对象检测。

2)、选择环境

        最好是使用本地GPU来处理,CPU肯定是很慢的。如果有条件也可以使用他们的服务器。

3)、添加数据

        这里就是要费点时间了 ,需要下载工具进行批注。

        点击蓝字即可跳转链接下载工具,我使用Vott。

4)、数据批注

        这个工作只能慢慢弄了,花点时间

5)、训练

6)、评估  

        这里是需要上传png、jpg图像,如果原图不是这种格式,需要借用工具处理下图像格式。

7)、将模型复制

        将生成的模型复制出来,放在我们的工程里面就可以了。

当然,如果感兴趣还可以对训练进行封装了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

年会抽奖Html

在这里插入图片描述 <!-- <video id"backgroundMusic" src"file:///D:/background.mp3" loop autoplay></video> --> <divstyle"width: 290px; height: 580px; margin-left: 20px; margin-top: 20px; background: url(D:/nianhu…

vue -关于浏览器localstorge数据定期清除的实现

1.实现背景 用户登录时的信息存在了localstorge中&#xff0c;但它会一直存在。一般来说&#xff0c;我们希望这个数据能够定期被清除掉&#xff0c;以下一个定时清除的实现。 2.实现原理 在用户登录时&#xff0c;将用户信息存入localstorge的同时&#xff0c;将当前时间作…

LabVIEW水轮发电机组振动摆度故障诊断

本文介绍了基于LabVIEW的水轮发电机组振动摆度故障诊断系统的设计与实施过程。系统在通过高效的故障诊断功能&#xff0c;实现水轮发电机组的振动、温度等关键指标的实时监控与智能分析&#xff0c;从而提高电力设备的可靠性和安全性。 ​ 项目背景 随着电力行业对设备稳定性…

Collaborate with AI -- Write a modern C++ singleton factory

translate my blog <<与AI合作 -- 写一个modern c单例工厂>> to English. NOTE: It was written at 2024.01, maybe the AI is not smart as now. Preface In this article, readers can learn about a hybrid of the modern C singleton pattern and factory pat…

【轻松学C:编程小白的大冒险】--- C语言简介 02

在编程的艺术世界里&#xff0c;代码和灵感需要寻找到最佳的交融点&#xff0c;才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里&#xff0c;我们将共同追寻这种完美结合&#xff0c;为未来的世界留下属于我们的独特印记。 【轻松学C&#xff1a;编程小白的大冒险】…

下载b站高清视频

需要使用的edge上的一个扩展插件&#xff0c;所以选择使用edge浏览器。 1、在edge浏览器上下载 强力视频下载合并 扩展插件 2、在edge上打开b站&#xff0c;登录自己账号&#xff08;登录后才能下载到高清&#xff01;&#xff01;&#xff09;。打开一个视频&#xff0c;选择自…

oxml中创建CT_Document类

概述 本文基于python-docx源码&#xff0c;详细记录CT_Document类创建的过程&#xff0c;以此来加深对Python中元类、以及CT_Document元素类的认识。 元类简介 元类&#xff08;MetaClass&#xff09;是Python中的高级特性。元类是什么呢&#xff1f;Python是面向对象编程…

Tableau数据可视化与仪表盘搭建-基础图表制作

目录 对比分析&#xff1a;比大小 柱状图 条形图 数据钻取 筛选器 热力图 气泡图 变化分析&#xff1a;看趋势 折线图 预测 面积图 关系分布&#xff1a;看位置 散点图 直方图 地图 构成分析&#xff1a;看占比 饼图 树地图 堆积图 对比分析&#xff1a;比大…

QML学习(八) Quick中的基础组件:Item,Rectangle,MouseArea说明及使用场景和使用方法

上一篇中我们从设计器里可以看到Qt Quick-Base中有几大基础组件&#xff0c;如下图&#xff0c;这篇文章先介绍下Item&#xff0c;Rectangle&#xff0c;MouseArea这三个的说明及使用场景和使用方法 Item Item 是 QML 中所有可视元素的基类&#xff0c;是一个非常基础和通用的…

万界星空科技质量管理QMS系统具体功能介绍

一、什么是QMS系统&#xff0c;有什么价值&#xff1f; 1、QMS 系统即质量管理系统&#xff08;Quality Management System&#xff09;。 它是一套用于管理和控制企业产品或服务质量的集成化体系。 2、QMS 系统的价值主要体现在以下几个方面&#xff1a; 确保产品质量一致性…

字符串哈希stl解决

题目如下 STL的unordered-set STL的map 谢谢观看&#xff01;&#xff01;&#xff01;

JAVA I/O流练习1

往D盘中的JAVA复习文件夹中写数据&#xff1a; 数据改了一下哈&#xff1a; import java.io.*; import java.util.Scanner; public class Test {public static void main(String[] args) throws IOException {String fileName"D:JAVA复习\\grade.txt";FileWriter w…

英伟达Project Digits赋能医疗大模型:创新应用与未来展望

英伟达Project Digits赋能医疗大模型&#xff1a;创新应用与未来展望 一、引言 1.1 研究背景与意义 在当今数字化时代&#xff0c;医疗行业作为关乎国计民生的关键领域&#xff0c;正面临着前所未有的挑战与机遇。一方面&#xff0c;传统医疗模式在应对海量医疗数据的处理、复…

OpenAI 故障复盘 - 阿里云容器服务与可观测产品如何保障大规模 K8s 集群稳定性

本文作者&#xff1a; 容器服务团队&#xff1a;刘佳旭、冯诗淳 可观测团队&#xff1a;竺夏栋、麻嘉豪、隋吉智 一、前言 Kubernetes(K8s)架构已经是当今 IT 架构的主流与事实标准&#xff08;CNCF Survey[1]&#xff09;。随着承接的业务规模越来越大&#xff0c;用户也在使…

移动电商的崛起与革新:以开源AI智能名片2+1链动模式S2B2C商城小程序为例的深度剖析

摘要&#xff1a;本文旨在探讨移动电商的崛起背景、特点及其对传统电商模式的革新影响&#xff0c;并以开源AI智能名片21链动模式S2B2C商城小程序为具体案例&#xff0c;深入分析其在移动电商领域的创新实践。随着移动互联网技术的飞速发展&#xff0c;移动电商已成为电商行业的…

el-table 合并单元格

参考文章&#xff1a;vue3.0 el-table 动态合并单元格 - flyComeOn - 博客园 <el-table :data"tableData" border empty-text"暂无数据" :header-cell-style"{ background: #f5f7fa }" class"parent-table" :span-method"obj…

C/C++进阶-函数

C/C入门-函数起始 函数引用与指针函数参数 指针写法 和 数组写法数组的引用右值引用概念&#xff1a;**反汇编&#xff1a;**总结用结构体的示例再理解一遍 函数的本质栈分析栈溢出攻击 函数重载函数重载 进阶 思考函数重载补充 函数模板&#xff08;1&#xff09;&#xff08;…

通俗易懂之线性回归时序预测PyTorch实践

线性回归&#xff08;Linear Regression&#xff09;是机器学习中最基本且广泛应用的算法之一。它不仅作为入门学习的经典案例&#xff0c;也是许多复杂模型的基础。本文将全面介绍线性回归的原理、应用&#xff0c;并通过一段PyTorch代码进行实践演示&#xff0c;帮助读者深入…

分布式主键ID生成方式-snowflake雪花算法

这里写自定义目录标题 一、业务场景二、技术选型1、UUID方案2、Leaf方案-美团&#xff08;基于数据库自增id&#xff09;3、Snowflake雪花算法方案 总结 一、业务场景 大量的业务数据需要保存到数据库中&#xff0c;原来的单库单表的方式扛不住大数据量、高并发&#xff0c;需…

在 C# 中显示动画 GIF 并在运行时更改它们

您可以通过将按钮、图片框、标签或其他控件的Image属性设置为 GIF 文件 来显示动画 GIF 。&#xff08;如果您在窗体的BackgroundImage属性中显示一个&#xff0c;则不会获得动画。&#xff09; 有几种方法可以在运行时更改 GIF。 首先&#xff0c;您可以将 GIF 添加为资源。…