基于卷積神經網絡(CNN)的垃圾分類模型研究

摘要:
隨著城市化進程的加快,垃圾問題日益嚴重。傳統的垃圾分類方法存在效率低下、準確率不高等問題。本文提出了一種基于卷積神經網絡(CNN)的垃圾分類模型,該模型能夠自動識別并分類不同類型的垃圾。實驗表明,該模型在垃圾分類任務中取得了較高的準確率,為垃圾處理提供了有效的技術支持。

關鍵詞:卷積神經網絡;垃圾分類;深度學習;圖像識別

一、引言

(一)背景

隨著人們生活水平的提高,城市垃圾產生量不斷增加,垃圾分類已成為城市管理的重要任務。然而,傳統的垃圾分類方法主要依賴于人工操作,存在勞動強度大、分類效率低、易受主觀因素影響等問題。近年來,深度學習技術的快速發展為垃圾分類提供了新的解決方案。其中,卷積神經網絡(CNN)因其強大的圖像處理能力在圖像識別領域取得了顯著成果[1]。因此,本文提出了一種基于CNN的垃圾分類模型,旨在提高垃圾分類的效率和準確率。

(二)框架選取

本文將采用由百度飛槳研發的PaddlePaddle深度學習框架(下文簡稱Paddle框架)。該框架支持傳統深度學習框架的基本功能,如模型組網、顯卡訓練等。此外,該框架提供了高級API,可以更加方便快捷地完成訓練腳本的編寫。

二、數據集選取

本文選取了飛槳AI Studio的“垃圾分類40種”數據集,如圖2.1、圖2.2所示。該數據集的截取對象更偏向于“垃圾”而非“生活物品”,更符合垃圾分類模型的應用場景:

圖2.1 該數據集的“一次性快餐盒”數據

圖2.2 該數據集的“食用油桶”數據

并且,該數據集基本覆蓋了常見的生活垃圾,其40個類別如表2.1所示。

表2.1 該數據集的分類

類別
其他垃圾/一次性快餐盒
其他垃圾/污損塑料
廚余垃圾/茶葉渣
廚余垃圾/菜葉菜根
廚余垃圾/蛋殼
廚余垃圾/魚骨
可回收物/充電寶
可回收物/包
可回收物/化妝品瓶
可回收物/塑料玩具
可回收物/塑料碗盆
可回收物/塑料衣架
其他垃圾/煙蒂
可回收物/快遞紙袋
可回收物/插頭電線
可回收物/舊衣服
可回收物/易拉罐
可回收物/枕頭
可回收物/毛絨玩具
可回收物/洗發水瓶
可回收物/玻璃杯
可回收物/皮鞋
可回收物/砧板
其他垃圾/牙簽
可回收物/紙板箱
可回收物/調料瓶
可回收物/酒瓶
可回收物/金屬食品罐
可回收物/鍋
可回收物/食用油桶
可回收物/飲料瓶
有害垃圾/干電池
有害垃圾/軟膏
有害垃圾/過期藥物
其他垃圾/破碎花盆及碟碗
其他垃圾/竹筷
廚余垃圾/剩飯剩菜
廚余垃圾/大骨頭
廚余垃圾/水果果皮
廚余垃圾/水果果肉

?其數據總量較多,每個類別分配較平均,其每個類別的數量如表2.2所示。

表2.2 該數據集的分類數量情況

三、數據集處理

本文采用Paddle框架搭建數據集。在數據集初始化時,程序會順序執行以下操作:

  1. 獲取數據集文件夾下的所有子文件夾
  2. 對每個子文件夾,遍歷每個圖片,順序進行如下操作:
    1. 使用PIL打開圖片
    2. 重設圖片大小為256x256
    3. 將通道維度置于最前,以適應Paddle框架。即將圖片維度從(256, 256, 3)轉為(3, 256, 256)
    4. 將圖片和標簽存入對應列表

當外界需要獲取指定索引的數據時,程序會按照對應索引,從列表中讀取并返回數據。

數據集腳本的具體代碼如下:

import paddle
import numpy as np
from PIL import Image
import osdef getAllPath(path):return [os.path.join(path, f) for f in os.listdir(path)]class Dataset(paddle.io.Dataset):def __init__(self, mode='train'):super().__init__()self.data = []self.label = []for type_dir in getAllPath(f'./dataset/{mode}'):print('正在讀取:', os.path.basename(type_dir))for path in getAllPath(type_dir):img = Image.open(path)img = img.resize((256, 256))img = np.array(img, dtype=np.float32).transpose((2, 0, 1))self.data.append(img)self.label.append(int(os.path.basename(type_dir)))self.data = np.array(self.data, dtype=np.float32)def __getitem__(self, idx):return self.data[idx], self.label[idx]def __len__(self):return len(self.data)

四、模型訓練

(一)模型選取

本文采用ResNet(Residual Neural Network)作為分類模型。ResNet是深度學習中一種非常有效的卷積神經網絡(CNN)結構,通過引入殘差塊(Residual Block)解決了深度神經網絡訓練中的梯度消失和模型退化問題。ResNet的提出使得訓練深度達到幾百甚至上千層的神經網絡成為可能,提高了模型的準確性,并在多項計算機視覺任務中取得了顯著的性能提升。[2]

由于垃圾分類的任務相對簡單,不需要過于復雜的模型,因此本文采用ResNet-18(18層的ResNet模型)進行分類任務,達到較號的性能與準確的平衡。

(二)優化器選取

在訓練神經網絡時,優化器的選擇對模型的性能具有重要影響。優化器用于更新和計算影響模型訓練和模型參數的梯度,以最小化損失函數。本文采用Adam(Adaptive Moment Estimation)作為優化器。

Adam優化器將在梯度大時加速訓練,梯度小時減速訓練,而不是以固定的學習率訓練。這將會大大加速訓練過程,并且減少因訓練集梯度問題而產生的訓練問題,增加準確率。[3]

(三)損失函數選取

在機器學習和深度學習中,損失函數用于量化模型預測與真實標簽之間的差異。選擇一個合適的損失函數對于訓練一個高效且準確的模型至關重要。本文采用交叉熵損失函數(Cross-Entropy Loss Function)進行訓練。

在多分類問題中,通常有多個類別(假設為C個),模型的輸出是一個C維的向量,每個元素表示樣本屬于對應類別的概率,其表達式為:

L = -\sum_{i=1}^{C} y_i \log(p_i)

其中,C表示樣本個數,y是標簽(0或1),p是模型的輸出。

交叉熵損失函數常用于分類問題,衡量預測概率分布與真實概率分布之間的差異。而垃圾分類是典型的分類問題,適用于交叉熵損失函數。

使用交叉熵損失函數的好處之一是它能夠有效地處理類別不平衡的問題,因為它關心的是預測概率與真實概率之間的差異,而不是僅僅關注是否預測正確。此外,交叉熵損失函數在梯度下降過程中表現良好,能夠提供穩定的梯度更新,有助于模型的快速收斂。[4]

(四)訓練腳本編寫

Paddle框架提供的高級API極大簡化了訓練腳本的編寫。因此,該腳本只需要設置優化器、損失函數和評價指標(準確率)并調用model.fit方法即可進行訓練。另外,該腳本還通過回調函數,實現損失和準確率的記錄,并寫到一個csv文件中。

該腳本的代碼如下:

import paddle
import csv
from paddle.metric import Accuracy
from paddle.callbacks import ProgBarLogger, Callback
from dataset import Datasettrain_dataset = Dataset()net = paddle.vision.models.resnet18(num_classes=40)
model = paddle.Model(net)# 自定義一個回調函數來記錄loss和acc
class CSVLogger(Callback):def __init__(self, csv_file):super().__init__()self.csv_file = csv_fileself.file = Noneself.csv_writer = Nonedef on_train_begin(self, logs=None):self.file = open(self.csv_file, 'w', newline='')fieldnames = ['epoch', 'loss', 'acc']self.csv_writer = csv.DictWriter(self.file, fieldnames=fieldnames)self.csv_writer.writeheader()def on_epoch_end(self, epoch, logs=None):row_dict = {'epoch': epoch + 1, 'loss': logs.get('loss')[0], 'acc': logs.get('acc')}self.csv_writer.writerow(row_dict)def on_train_end(self, logs=None):self.file.close()# 實例化CSVLogger
csv_logger = CSVLogger('training_history.csv')# 準備模型訓練
model.prepare(paddle.optimizer.Adam(parameters=model.parameters()),paddle.nn.CrossEntropyLoss(),Accuracy())# 使用fit方法并傳入自定義的CSVLogger
model.fit(train_dataset, epochs=50, batch_size=64, callbacks=[ProgBarLogger(verbose=1), csv_logger])# 模型保存
model.save('./output/model')

(五)訓練結果

經過50個epoch的訓練后,模型的準確率穩定在97%左右,損失也逐漸趨于平穩,如圖4.1和圖4.2所示。

圖4.1 模型準確率隨epoch的變化圖
圖4.2 模型損失隨epoch的變化圖

?(六)模型測試

該模型的測試結果也非常好,其損失達到了9.6559^-6,準確率達到99.25%。可以看到,這個模型的分類是比較準確的,擬合性較高。

五、模型使用

本文提供了簡單的模型使用程序,將會讀取指定文件,并輸出分類結果。其代碼如下所示。

import paddle
from PIL import Image
import numpy as np
import json# 初始化模型
net = paddle.vision.models.resnet18(num_classes=40)
model = paddle.Model(net)# 加載模型
model.load('output/model')# 加載鍵值對
with open('dataset/garbage_dict.json', 'r', encoding='utf-8') as f:mapping = json.load(f)# 加載圖片
path = 't3.jpeg'
img = Image.open(path)
img = img.resize((256, 256))
img = np.array(img, dtype=np.float32).transpose((2, 0, 1))[np.newaxis, :]# 預測
pred = model.predict_batch(img)[0]
label = int(pred.argmax())
print(mapping[str(label)])

本文使用模型給出了三個網絡圖片的分類,如圖5.1、圖5.2、圖5.3所示

圖5.1 預測結果:廚余垃圾/水果果皮
圖5.2 預測結果:有害垃圾/過期藥物
圖5.3 預測結果:其他垃圾/竹筷

可以看到,本模型準確地給出了這些圖片所對應的垃圾分類。?

六、結論與展望

本文提出了一種基于CNN的垃圾分類模型,并通過實驗驗證了其有效性。該模型能夠自動識別并分類不同類型的垃圾,為垃圾處理提供了有效的技術支持。實驗表明,該模型在垃圾分類任務中取得了較高的準確率,為垃圾處理提供了有效的技術支持。在應用方向上,可以將此模型應用于智能分類垃圾桶、垃圾分揀裝置等,實現準確高效的垃圾分類。

參考文獻

[1]黃琳軒.基于卷積神經網絡的垃圾自動分類算法[J].科技與創新,2024,(10):70-72.DOI:10.15913/j.cnki.kjycx.2024.10.016.

[2]孫毅,吳斯曼,方偉,等.基于ResNet的安全監控目標檢測[J/OL].集成技術:1-10[2024-06-06].http://kns.cnki.net/kcms/detail/44.1691.t.20240527.1512.004.html.

[3]張波,肖杰.深度學習模型訓練的優化器實驗設計[J].電子制作,2024,32(02):114-117.DOI:10.16589/j.cnki.cn11-3571/tn.2024.02.023.

[4]黃輝城,李建新.基于深度視覺的智能卸垛機快遞箱邊界檢測系統[J].光學技術,2024,50(02):220-227.DOI:10.13741/j.cnki.11-1879/o4.2024.02.018.

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/23334.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/23334.shtml
英文地址,請注明出處:http://en.pswp.cn/web/23334.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Kruskal算法求最小生成樹

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #define MAX 100 #define NO INT_MAX//NO表示沒有邊&#xff0c;相當于INFtypedef struct Graph {int arcnum;int vexnum;char vextex[MAX][20];int martrix[MAX][MA…

什么無線領夾麥克風音質最好?領夾麥克風品牌排行榜前十名推薦

?在當今的數字化浪潮中&#xff0c;個人聲音的傳播和記錄變得尤為重要。無論是會議中心、教室講臺還是戶外探險&#xff0c;無線領夾麥克風以其卓越的便攜性和連接穩定性&#xff0c;成為了人們溝通和表達的首選工具。面對市場上琳瑯滿目的無線麥克風選擇&#xff0c;為了幫助…

【Python】使用 SQLObject orm 庫快速將接口數據存入數據庫

使用 SQLObject orm 庫快速將接口數據存入數據庫 文章目錄 使用 SQLObject orm 庫快速將接口數據存入數據庫背景orm python 版本都有哪些&#xff1f; SQLObject 簡單的使用 背景 因為測試需要&#xff0c;要將百萬條數據接口查詢數據存入數據庫中&#xff0c;為了減少 mysql …

Doris insert into 插入語句執行成功,且select查詢成功,返回結果不報錯,但查不到該插入數據

問題&#xff1a;Doris insert into 正常執行成功&#xff0c;select 查詢也執行成功&#xff0c;但查不到該寫入數據 原因&#xff1a;由于有其他 insert commit 事務待提交且該任務處于鎖的狀態&#xff0c;導致不斷在回滾&#xff0c;進而造成其他的insert into 語句也執行成…

26 - 超過5名學生的課(高頻 SQL 50 題基礎版)

26 - 超過5名學生的課 select class fromCourses group byclass havingcount(*)>5;

Seed-TTS語音編輯有多強?對比實測結果讓你驚嘆!

GLM-4-9B 開源系列模型 前言 就在最近&#xff0c;ByteDance的研究人員最近推出了一系列名為Seed-TTS的大規模自回歸文本轉語音(TTS)模型,能夠合成幾乎與人類語音無法區分的高質量語音。那么Seed-TTS的表現究竟有多強呢?讓我們一起來感受下Seed-TTS帶來的驚喜吧! 介紹Seed-TTS…

Java并發包中的鎖升級

在Java中&#xff0c;特別是ReentrantLock和synchronized關鍵字的實現中&#xff0c;鎖的升級通常涉及到從無鎖狀態到偏向鎖、再升級到輕量級鎖&#xff0c;最后可能升級到重量級鎖的過程。這一系列過程是為了減少鎖帶來的開銷&#xff0c;提高并發效率。 偏向鎖&#xff08;Bi…

如何用手寫代碼實現JavaScript中的reduce函數?

在JavaScript中&#xff0c;Array.prototype.reduce() 是一個內置方法&#xff0c;它遍歷數組中的每個元素&#xff0c;并將它們累積成一個單一的返回值。我們可以自己編寫一個類似的函數來模擬這個過程。 下面是一個簡單的手寫實現例子&#xff1a; function myReduce(arr, …

組裝服務器重裝linux系統【idrac集成戴爾遠程控制卡】

&#x1f341;博主簡介&#xff1a; &#x1f3c5;云計算領域優質創作者 &#x1f3c5;2022年CSDN新星計劃python賽道第一名 &#x1f3c5;2022年CSDN原力計劃優質作者 &#x1f3c5;阿里云ACE認證高級工程師 &#x1f3c5;阿里云開發者社區專…

Vue 跨平臺性能優化十法

Vue.js 開發能夠同時運行在不同平臺&#xff08;如 Web、移動平臺和桌面平臺&#xff09;的應用程序。以下是一些常見的跨平臺解決方案&#xff1a; 1. 使用 Vue.js 官方發布的框架&#xff1a; Vue.js&#xff1a;主要用于 Web 開發。 Vue Native&#xff1a;使用 Vue 語法開…

數據結構 | 超詳細講解七大排序(C語言實現,含動圖,多方法!)

目錄 ?編輯 排序的概念 常見排序算法 ?編輯 1.冒泡排序 &#x1f379;圖解 &#x1f973;代碼實現 &#x1f914;時間復雜度 2.插入排序 &#x1f379;圖解 &#x1f334;深度剖析 &#x1f34e;代碼思路 &#x1f973;代碼實現 &#x1f914;時間復雜度 3.希爾…

2024 年適用于 Linux 的 5 個微軟 Word 替代品

對于那些最近由于隱私問題或其他原因而轉向 Linux 的用戶來說&#xff0c;可能很難替換他們最喜歡的、不在 Linux 操作系統上運行的應用程序。 尋找流行程序的合適替代品可能會成為一項挑戰&#xff0c;而且并不是每個人都準備好花費大量時間來嘗試弄清楚什么可以與他們在 Win…

讀書筆記|《把自己變成稀缺資產》:我們都擁有100分的欲望,卻只有1分的耐心。

哈嘍&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 最近在讀一本書《把自己變成稀缺資產》&#xff0c;其中一章講到耐心的重要性&#xff0c;很有共鳴。 當今社會&#xff0c;生活節奏越來越快&#xff0c;我們都在急于求成的追求結果&#xff0c;對過程越來越缺乏耐…

C++核心編程友元的應用

文章目錄 1.友元1.什么是友元2.全局函數做友元2.類做友元3.成員函數做友元 1.友元 1.什么是友元 在C中&#xff0c;友元&#xff08;friend&#xff09;是一種允許一個類或函數訪問另一個類的非公有&#xff08;private 或 protected&#xff09;成員的機制。這種機制打破了類…

系統研發安全漏洞

軟件安全漏洞指的是軟件中存在的具體缺陷或疏忽&#xff0c;這些缺陷或疏忽能夠被攻擊者利用并執行一些惡意行為。這些行為包括但不限于泄露或修改敏感信息、干擾或銷毀系統、接管計算機系統或程序權限等。與大眾熟悉的軟件缺陷&#xff08;Bug&#xff09;相比&#xff0c;安全…

Mysql中表的常用約束

在MySQL表中常用的約束有以下幾種&#xff1a; 1. 主鍵約束&#xff08;Primary Key Constraint&#xff09;&#xff1a;用于標識表中的唯一記錄。一個表只能有一個主鍵&#xff0c;主鍵列不能有重復值&#xff0c;也不能為NULL。 2. 唯一約束&#xff08;Unique Constraint…

2024050402-重學 Java 設計模式《實戰責任鏈模式》

重學 Java 設計模式&#xff1a;實戰責任鏈模式「模擬618電商大促期間&#xff0c;項目上線流程多級負責人審批場景」 一、前言 場地和場景的重要性 射擊&#x1f3f9;需要去靶場學習、滑雪&#x1f3c2;需要去雪場體驗、開車&#x1f697;需要能上路實踐&#xff0c;而編程…

Scanpy(4)用與數據整合和批次處理

Scanpy包,用與數據整合和批次處理,包含批次效應的BBKNN算法和用于對比的ingest基礎算法比較,及其原理簡介。 1. 依賴: (1)數據集(全部需要掛VPN): PBMC:pbmc3k_processed()(需要下載);pbmc68k_reduced()(scanpy自帶)Pancreas(需要下載)(2)Python包:Scanp…

【Python】把xmind轉換為指定格式txt文本

人工智能訓練通常需要使用文本格式&#xff0c;xmind作為一種常規格式不好進行解析&#xff0c;那如何把xmind轉換為txt格式呢&#xff1f; 軟件信息 python python -v Python 3.9.13 (tags/v3.9.13:6de2ca5, May 17 2022, 16:36:42) [MSC v.1929 64 bit (AMD64)] on win32…

Python 包安裝及常用命令【python 入門】

背景&#xff1a; 近期看到一個項目&#xff0c;做微信只能機器人&#xff0c;服務是使用python搭建的&#xff0c;于是拷貝下來自己打算跑一跑&#xff0c;部署一下&#xff0c;可是自己又沒有python的經驗&#xff0c;于是各種查資料學習&#xff0c;跟著敲一敲&#xff0c;順…