C# OpenCV机器视觉:利用TrashNet实现垃圾分类

devtools/2025/2/8 1:04:47/

在繁华的都市里,垃圾分类成了让人头疼的难题。阿强住在一个老旧小区,每天扔垃圾的时候,他都要对着垃圾桶纠结半天:“这到底是可回收物,还是有害垃圾啊?要是分错了,会不会被罚款?” 阿强一边挠着头,一边看着手中的垃圾,感觉自己像个在迷宫里找不到出口的小可怜。

一天,阿强在网上闲逛,突然看到一篇关于 TrashNet 的文章。“TrashNet?这是什么神秘组织?” 阿强好奇地点进去,发现这是一个专门用于垃圾分类的深度学习模型。“哇,这不就是我一直在找的‘垃圾分类神器’嘛!” 阿强兴奋得从椅子上跳起来,眼睛里闪烁着希望的光芒。

第一章:神秘的 TrashNet 登场

阿强迫不及待地开始研究 TrashNet。原来,TrashNet 是由一群热心环保的技术大神开发的。他们看到人们在垃圾分类上的困扰,就决定用科技的力量来解决这个问题。TrashNet 经过大量垃圾图片的 “训练”,已经能像个经验丰富的垃圾分类专家一样,准确识别出各种垃圾的类型。

“太神奇了!这简直就是垃圾世界的‘超级侦探’啊!” 阿强惊叹道。他想象着 TrashNet 在数据的海洋里 “学习” 的场景,就像一个勤奋的学生在知识的图书馆里疯狂阅读。“有了它,我就能告别垃圾分类的烦恼,成为小区里的‘垃圾侠’啦!” 阿强握紧拳头,仿佛已经看到自己站在垃圾桶前,指挥着垃圾们各归其位的帅气模样。

第二章:筹备 “垃圾侠” 行动

阿强决定用 OpenCvSharp 来实现基于 TrashNet 的垃圾分类识别。他先在电脑上安装好 OpenCvSharp 库,这个过程并不顺利,各种报错和依赖问题让阿强差点崩溃。“这电脑怎么跟我作对啊!” 阿强一边抱怨,一边疯狂地在网上搜索解决办法。经过一番折腾,终于安装成功了。

“呼,总算是搞定了!” 阿强擦了擦额头上的汗,长舒了一口气。他打开 Visual Studio,创建了一个新的 C# 项目,准备大展身手。

第三章:代码冲锋 —— 垃圾分类的 “魔法咒语”

阿强开始编写代码,他的手指在键盘上飞舞,就像在弹奏一首激昂的乐章。

using System;
using OpenCvSharp;
using OpenCvSharp.Dnn;namespace TrashClassification
{class Program{static void Main(){// 1. 加载TrashNet模型,这就像召唤出垃圾分类的“超级英雄”Net net = Cv2.Dnn.ReadNetFromCaffe("deploy.prototxt", "trashnet.caffemodel");// 2. 读取要分类的垃圾图像,这里假设图像路径为“trash_image.jpg”Mat image = Cv2.ImRead("trash_image.jpg");if (image.Empty()){Console.WriteLine("哎呀,图像读取失败啦!是不是路径写错了或者图像文件损坏了?赶紧检查检查。");return;}// 3. 图像预处理,把图像调整成模型能“看懂”的样子Mat blob = Cv2.Dnn.BlobFromImage(image, 1.0 / 255.0, new Size(224, 224), new Scalar(0, 0, 0), true, false);// 4. 将预处理后的图像输入模型进行预测net.SetInput(blob);Mat predictions = net.Forward();// 5. 解析预测结果,找出可能性最大的垃圾类别int[] classIds = new int[1];float[] confidences = new float[1];Point[] classIndices;Cv2.MinMaxLoc(predictions.Reshape(1, 1), out _, out float maxValue, out _, out classIndices);classIds[0] = classIndices[0];confidences[0] = maxValue;// 6. 定义垃圾类别标签数组,这里假设标签顺序为:可回收物、有害垃圾、厨余垃圾、其他垃圾string[] classLabels = { "可回收物", "有害垃圾", "厨余垃圾", "其他垃圾" };string predictedClass = classLabels[classIds[0]];Console.WriteLine($"预测结果:这是{predictedClass},可信度为{confidences[0] * 100}%");// 显示图像,看看我们要分类的垃圾长啥样Cv2.ImShow("Trash Image", image);Cv2.WaitKey(0);Cv2.DestroyAllWindows();}}
}

代码解析

  • 加载 TrashNet 模型:阿强用Cv2.Dnn.ReadNetFromCaffe方法加载了 TrashNet 模型,这就像是给垃圾分类行动找了个厉害的 “指挥官”,所有的分类指令都要听它的。
  • 读取图像:使用Cv2.ImRead读取垃圾图像,如果图像读取失败,就像没找到要分类的垃圾,程序自然没法继续,所以要检查并提示。
  • 图像预处理:通过Cv2.Dnn.BlobFromImage把图像转换成模型能处理的格式,调整大小、归一化等操作,就像给垃圾穿上了 “标准制服”,让模型能轻松识别。
  • 模型预测:把预处理后的图像输入模型,模型就开始 “思考”,给出预测结果,这个结果就像模型给出的 “答案”。
  • 解析结果:从模型给出的预测结果中找到可能性最大的类别索引,再根据预先定义的类别标签数组,找到对应的垃圾类别名称,这样就能知道垃圾属于哪一类啦。
  • 显示结果:最后,把预测结果打印出来,还显示出要分类的垃圾图像,让阿强能直观地看到分类情况。

第四章:实战检验 ——“垃圾侠” 初显身手

阿强准备好一张垃圾图片,小心翼翼地运行程序。屏幕上很快显示出了预测结果:“预测结果:这是可回收物,可信度为 95%”。

“哈哈,成功啦!” 阿强大喊一声,兴奋地在房间里转圈圈。他迫不及待地把这个好消息告诉了小区的邻居们。大家都对阿强的 “高科技” 垃圾分类方法赞不绝口。

从那以后,阿强经常拿着手机,用他的垃圾分类程序帮助邻居们分类垃圾。在他的带动下,小区的垃圾分类工作变得井井有条,环境也越来越整洁。阿强也成了小区里人人皆知的 “垃圾侠”,大家都夸他是环保小卫士。

阿强知道,这只是一个开始。他打算继续研究,让垃圾分类程序更加准确和智能。他相信,只要大家一起努力,用科技的力量助力环保,我们的城市一定会变得更加美丽。而他,也会继续在 “垃圾侠” 的道路上,守护着这片绿色家园。


http://www.ppmy.cn/devtools/156979.html

相关文章

MySQL——表操作及查询

一.表操作 MySQL的操作中,一些专用的词无论是大写还是小写都是可以通过的。 1.插入数据 INSERT [INTO] table_name (列名称…)VALUES (列数据…), (列数据…); "[]"表示可有可无,插入时,如果不指定要插入的列,则表示默…

HTTP和HTTPS协议详解

HTTP和HTTPS协议详解 HTTP详解什么是http协议http协议的发展史http0.9http1.0http1.1http2.0 http协议的格式URI和URL请求request响应response http协议完整的请求与响应流程 HTTPS详解为什么使用HTTPSSSL协议HTTPS通信过程TLS协议 HTTP详解 什么是http协议 1、全称Hyper Tex…

iOS 音频录制、播放与格式转换

iOS 音频录制、播放与格式转换:基于 AVFoundation 和 FFmpegKit 的实现 在 iOS 开发中,音频处理是一个非常常见的需求,比如录音、播放音频、音频格式转换等。本文将详细解读一段基于 AVFoundation 和 FFmpegKit 的代码,展示如何实现音频录制、播放以及 PCM 和 AAC 格式之间…

几种K8s运维管理平台对比说明

目录 深入体验**结论**对比分析表格**1. 功能对比****2. 用户界面****3. 多租户支持****4. DevOps支持** 细对比分析1. **Kuboard**2. **xkube**3. **KubeSphere**4. **Dashboard****对比总结** 深入体验 KuboardxkubeKubeSphereDashboard 结论 如果您需要一个功能全面且适合…

【VM】VirtualBox安装ubuntu22.04虚拟机

阅读本文之前,请先根据 安装virtualbox 教程安装virtulbox虚拟机软件。 1.下载Ubuntu系统镜像 打开阿里云的镜像站点:https://developer.aliyun.com/mirror/ 找到如图所示位置,选择Ubuntu 22.04.3(destop-amd64)系统 Ubuntu 22.04.3(desto…

100 ,【8】 buuctf web [蓝帽杯 2021]One Pointer PHP(别看)

进入靶场 没提示&#xff0c;去看源代码。 user.php <?php // 定义一个名为 User 的类&#xff0c;该类可用于表示用户相关信息或执行与用户有关的操作 class User{// 声明一个公共属性 $count&#xff0c;可在类的内部和外部直接访问// 这个属性可能用于记录与用户相关…

VDN 微服务架构搭建篇(三)基于 Nacos 的 Spring Cloud Gateway 动态路由管理

VDN 微服务架构搭建篇&#xff08;三&#xff09;&#xff1a;基于 Nacos 的 Spring Cloud Gateway 动态路由管理 在微服务架构中&#xff0c;网关 是整个系统的入口&#xff0c;负责 流量管理、请求路由、安全控制等关键功能。 Spring Cloud Gateway 作为 Spring 生态官方推荐…

ES6 变量解构赋值总结

1. 数组的解构赋值 1.1 基本用法 // 基本数组解构 const [a, b, c] [1, 2, 3]; console.log(a); // 1 console.log(b); // 2 console.log(c); // 3// 跳过某些值 const [x, , y] [1, 2, 3]; console.log(x); // 1 console.log(y); // 3// 解构剩余元素 const [first, ...re…