C# + .Net6 实现TensorFlow图片分类
微软官网上发现一篇很有意思的文档:
教程:用于对图像进行分类的 ML.NET 分类模型 - ML.NET | Microsoft Learn
这篇教程写的很学院派,但有点碎,属于上课不能打一秒钟瞌睡的那种。好在还是给出了完整的代码:samples/Program.cs at main · dotnet/samples · GitHub
当然自己尝试前必要的先决条件还是要满足的。
1、用于训练的图片和两个tsv,以及最重要的模型文件要准备好。示例:samples/image-classifier-assets.zip at main · dotnet/samples · GitHub
2、模型文件也可以从这里下载:https://storage.googleapis.com/download.tensorflow.org/models/inception5h.zip
3、VS2022中,项目 -> 管理NuGet程序包 -> 浏览,添加如下四个包:
Microsoft.ML
Microsoft.ML.ImageAnalytics
Microsoft.ML.TensorFlow
SciSharp.TensorFlow.Redist
严格按照教程顺利跑通。本着能偷懒就偷懒的原则,开始对代码进行简化:
1、训练图集和tsv就暂先都直接硬编码了。实践证明如果所有文件在同一个目录下是没问题的:
static readonly string _imagesFolder = @"D:\temp\ForTraining";
static readonly string _trainTagsTsv = @"D:\temp\ForTraining\tags.tsv";
static readonly string _testTagsTsv = @"D:\temp\ForTraining\test-tags.tsv";
static readonly string _inceptionTensorFlowModel = @"D:\temp\ForTraining\tensorflow_inception_graph.pb";
否则按照文档的说法还要修改这些文件的复制属性。直接给出绝对路径可规避这个问题。
在“解决方案资源管理器”中,右键单击资产目录和子目录中的每个文件,再选择“属性”。
在“高级”下,将“复制到输出目录”的值更改为“如果较新则复制” 。
2、 Demo里并未给出保存训练好的模型的代码。这意味着每次执行都要重新训练一次,效率比较低。所以稍微优化了一下代码:
public static ITransformer GenerateModel(MLContext mlContext)
{// 略// ......// 保存训练好的模型mlContext.Model.Save(model, trainingData.Schema, "model.zip");return model;
}
3、图片识别的代码另起了一个项目(原项目中屏蔽掉ClassifySingleImage相关代码),同样要导入那堆NuGet:
static void Main(string[] args){if (args.Length == 0){Console.WriteLine("请输入预测的图片路径。");return;}string fn = args[0].Trim();if (!File.Exists(fn)){Console.WriteLine("文件不存在。");return;}// Create MLContext to be shared across the model creation workflow objectsMLContext mlContext = new();// 识别模式// 训练好的模型文件可复制到指定位置DataViewSchema modelSchema;// Load trained modelITransformer model = mlContext.Model.Load(@"D:\temp\ForTraining\model.zip", out modelSchema);// <SnippetCallClassifySingleImage>ClassifySingleImage(mlContext, model, fn);// </SnippetCallClassifySingleImage>}public static void ClassifySingleImage(MLContext mlContext, ITransformer model,string _predictSingleImage){// 无需修改,略// ......}/// 略
所以,接下来开发一个工具,用来生成tags.tsv和test-tags.tsv。嗯,思路已经有了。
相关文章:
C# + .Net6 实现TensorFlow图片分类
微软官网上发现一篇很有意思的文档:教程:用于对图像进行分类的 ML.NET 分类模型 - ML.NET | Microsoft Learn 这篇教程写的很学院派,但有点碎,属于上课不能打一秒钟瞌睡的那种。好在还是给出了完整的代码:samples/Pro…...
Ngnix负载均衡和高可用集群及搭建与相关理论
Ngnix负载均衡和高可用集群及搭建与相关理论 全文目录 Ngnix负载均衡和高可用集群及搭建与相关理论高可能保持原理配置 keepalived:配置keepalived的IP将外部域名解析到Keepalived的虚拟IP上如何验证配置的正确性Nginx专用调试工具ngx_conf_t如何对前后端多台服务器…...
2022年宜昌市网络搭建与应用竞赛样题(三)
网络搭建与应用竞赛样题(三) 技能要求 (总分1000分) 竞赛说明 一、竞赛内容分布 “网络搭建与应用”竞赛共分三个部分,其中: 第一部分:网络搭建及安全部署项目(500分࿰…...
为什么PCB设计完成后需要放置mark点
PCB设计中的Mark点是指一些标记点,通常用于促进PCB制造和组装过程中的准确性和一致性。这些标记点在制造过程中可以帮助操作员进行自动化定位,从而确保所有部件都被正确组装到其正确位置,这对于确保产品的质量和可靠性至关重要。 下面&#…...
代理IP:IP代理技术与Socks5协议
代理IP是一种用于隐藏真实IP地址的技术,它可以将请求发送至代理服务器,再由代理服务器转发请求至目标网站。代理服务器会在请求过程中替换真实IP地址,从而保护用户的隐私和安全。在网络爬虫、反爬虫、匿名访问等场景中,代理IP技术…...
如何让java程序员生涯更顺利?我聊聊提升技术水平的五个方面
今天我想和大家聊聊程序员职业发展的问题。相信大家都知道,IT公司因为各种原因裁员,对程序员的前途发展都是不利的。特别是等到你30多岁,上有老下有小,仍然要加班,与年轻人竞争体力和智力,这是很艰难的。如…...
快速排序、希尔排序、归并排序、堆排序、插入排序、冒泡排序、选择排序(递归、非递归)C语言详解
1.排序的概念及其运用 1.1排序的概念 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录&a…...
ChatGPT一键私有部署,全网可用,让访问、问答不再受限,且安全稳定!
前言 ChatGPT由于在访问上有一些限制,使用并不便利。目前国内可以直接访问的大部分是调用API返回结果,我们去使用时总会有次数限制,而且它们可能随便崩掉。 其实,目前我们访问过的大部分国内的网页包括UI,其实是套用了…...
自学黑客(网络安全),一般人我劝你还是算了吧
一、自学网络安全学习的误区和陷阱 1.不要试图先成为一名程序员(以编程为基础的学习)再开始学习 我在之前的回答中,我都一再强调不要以编程为基础再开始学习网络安全,一般来说,学习编程不但学习周期长,而…...
盘“底座”,盘出新生意经
本文转自首席信息官 作者 徐蕊 导读 卖“底座”,这是一门新的生意,也是用友与友商差异化的商业竞争优势所在。 大型企业都在建“数智化底座” 有这样两类企业,他们截然不同,但在数智化的建设上殊途同归。 随着中国经济的发展&a…...
《花雕学AI》Poe:一个让你和 AI 成为朋友的平台,带你探索 ChatGPT4 和其他 八种AI 模型的奥秘
你是否曾经梦想过,能够在一个平台上,和多种不同的 AI 模型进行有趣、有用、有深度的对话,甚至还能轻松地把你的对话分享给其他人?如果你有这样的梦想,那么 Poe 一站式 AI 工具箱就是你的不二之选! Poe 是国…...
单片机GD32F303RCT6 (Macos环境)开发 (十五)—— i2c1采用DMA方式的读写函数
i2c1采用DMA方式的读写函数 1、关于i2c1的DMA的映射如图 2、关于代码的宏定义配置 Application目录的Makefile中 ENABLE_I2C_TEST yes才会编译I2C1的相关代码。 同时修改i2c.h文件,定义I2C1_MODE为I2C1_MODE_DMA,这样i2c1的配置为dma模式。 #define …...
通知短信 API 技术细节以及发送流程机制原理解析
引言 短信是一种简单、直接、高效的通信方式,被广泛应用于各个领域。在移动互联网时代,短信成为了客户服务、政府通知、公共服务等方面的重要工具。为了更好地利用短信这种通信方式,通知短信 API应运而生。短信API可以帮助企业、政府和应用程…...
Protobuf: 高效数据传输的秘密武器
当涉及到网络通信和数据存储时,数据序列化一直都是一个重要的话题;特别是现在很多公司都在推行微服务,数据序列化更是重中之重,通常会选择使用 JSON 作为数据交换格式,且 JSON 已经成为业界的主流。但是 Google 这么大…...
第五十四章 Unity 移动平台输入(下)
本章节我们介绍一个模拟器插件。这种插件比较多,比如EasyTouch,Lean Touch,Joystick Pack等等。EasyTouch是一个使用非常广泛的插件,支持点击,拖拽,遥感等很多常用功能。不过遗憾的是,该插件已经…...
KD305Y带吸收比极化指数兆欧表
一、概述 KD305Y绝缘电阻测试仪对众多的电力设备如:电缆、电机、发电机、变压器、互感器、高压开关、避雷器等要求做一系列的绝缘性能试验,首先是要做绝缘电阻测试。近年来随着电力事业的飞速发展,大容量设备的使用不断增加,用普通的兆欧表无…...
磁盘空间不足怎么办?释放磁盘空间的4种方法
虽然现在硬盘的空间越来越大,但是在这个数据爆炸的时代中,总是会觉得存储空间不够用,一不注意磁盘就满了,那么除了清空回收站、卸载某些程序外,还能怎么释放磁盘空间呢? 方案一:禁用休眠 休眠是…...
ChatGPT调教指北,技巧就是效率!
技巧就是效率 很多人都知道ChatGPT很火很强,几乎无所不能,但跨越了重重门槛之才有机会使用的时候却有些迷茫,一时间不知道如何使用它。如果你就是把他当作一个普通的智能助手来看待,那与小爱同学有什么区别?甚至还差劲…...
Android启动流程(五)——init进程对子进程的监控
init进程会读取rc文件,然后孵化很多其他系统服务进程,为防止子进程死亡后称为僵尸进程,init需要监测子进程是否死亡,如果死亡,则清除子进程资源,并重新拉起进程。 system/core/init/init.cpp InstallSigna…...
Python每日一练:蚂蚁家族(详解集合法)
文章目录 前言一、题目二、代码分析总结 前言 这题挺有意思,感觉评简单难度有点低了,如果正经用无向图来做,代码还是有点长的。首先得建立节点,估计除第一个和最后一个每个节点都是一条线连进,一条线连出的。就可以这…...
OpenClaw+百川2-13B:技术面试题库自动更新与练习
OpenClaw百川2-13B:技术面试题库自动更新与练习 1. 为什么需要自动化面试题库 去年准备跳槽时,我发现自己收藏的面试题文档已经两年没更新了。技术栈迭代太快,LeetCode题库每月新增上百道题,手动维护题库就像用勺子舀干海水。直…...
LFM2.5-1.2B-Thinking-GGUF惊艳效果:32K上下文下长文档关键信息抽取准确率实测
LFM2.5-1.2B-Thinking-GGUF惊艳效果:32K上下文下长文档关键信息抽取准确率实测 1. 模型效果实测背景 LFM2.5-1.2B-Thinking-GGUF作为Liquid AI推出的轻量级文本生成模型,在低资源环境下展现出令人惊喜的性能表现。本次测试聚焦于模型在32K超长上下文环…...
中央空调组态王6.55版本脚本程序动画仿真系统
中央空调组态王脚本程序动画仿真系统,组态王6.55版本凌晨三点盯着组态王工程画面里的虚拟风机打哈欠时,突然发现温度曲线开始抽风——这大概就是每个做过工业组态的老哥都经历过的魔幻时刻。今天咱们要折腾的是中央空调系统的动画仿真,用组态…...
SEO网站推广的长期效果如何_SEO网站推广对网站优化有什么要求
SEO网站推广的长期效果如何 在当今互联网时代,SEO网站推广已经成为提升网站流量和品牌知名度的关键手段。SEO,即搜索引擎优化,通过优化网站结构、内容和外部链接,提高网站在搜索引擎结果页面(SERP)中的排名…...
OpenClaw终极效率手册:gemma-3-12b-it驱动的50个日常自动化技巧
OpenClaw终极效率手册:gemma-3-12b-it驱动的50个日常自动化技巧 1. 为什么选择OpenClawgemma-3-12b-it组合 去年冬天,当我第一次在本地部署OpenClaw时,最头疼的问题就是模型选择。试过多个开源模型后,最终锁定gemma-3-12b-it——…...
COMSOL混凝土碳化模型
COMSOL 混凝土碳化模型混凝土表面那层白霜般的碳化层,总让我想起实验室里放了三个月的苏打饼干。这层碳酸钙的生成过程,在COMSOL里建模就像在模拟一场微观世界的化学舞会——二氧化碳分子突破混凝土保护层,与氢氧化钙在孔隙溶液里跳起离子交换…...
如何从视频中高效提取幻灯片:智能工具应用指南
如何从视频中高效提取幻灯片:智能工具应用指南 【免费下载链接】extract-video-ppt extract the ppt in the video 项目地址: https://gitcode.com/gh_mirrors/ex/extract-video-ppt 你是否曾遇到这样的困扰:参加线上会议后想整理演示文稿&#x…...
Ansible Playbook实战指南:从基础到高级技巧全解析
1. Ansible Playbook基础入门 第一次接触Ansible Playbook时,我被它简洁的YAML语法和强大的自动化能力惊艳到了。记得当时需要给50台服务器部署Nginx,传统方式要手动操作每台机器,而用Playbook只花了10分钟就搞定了全部部署。这种效率提升让我…...
FreeRTOS 工程化要点:任务划分、优先级设计与 CPU 占用率监控
大家好,我是杂烩君。 今天我们来简单分享:FreeRTOS任务怎么拆、优先级怎么配、CPU 占用怎么看。1. 任务划分原则 1.1 单一职责:一个任务只干一件事 把"串口接收 数据解析 指令执行 结果反馈"全塞一个任务,解析环节一…...
《C 头文件》
《C 头文件》 引言 C 头文件是 C 语言编程中不可或缺的一部分。它们包含了 C 语言标准库中的各种函数、宏定义和类型定义,为程序员提供了丰富的编程工具。本文将详细介绍 C 头文件的作用、分类、常用头文件及其在编程中的应用。 一、C 头文件的作用 C 头文件的主要作用有以…...
