基于Matlab卷积神经网络垃圾分类识别系统

        可回收垃圾的循环利用对我国经济的可持续发展有着重要意义.当前的垃圾回收需要人们手动分类垃 圾,找到一种自动分类垃圾的方法,提高垃圾回收的效率,不仅会产生显著的社会效益,而且有巨大的经济效 益.为了提高可回收生活垃圾识别的准确率,研究人员尝试利用图像处理、机器学习等方法自动识别玻璃 瓶、废纸、纸盒、易拉罐等常见生活废品.利用图像处理技术获取垃圾图像的特征后,再利用深度学习网络、支持向量机、K近邻分类器、主成分分析(PCA)方法[3]等方法对垃圾图像特征向量进行分类.

        可回收生活垃圾的分类和再利用,是我国社会经济良性循环的重要途径.基于机器视觉 的高效分类算法是垃圾智能分类的关键.提出一种在ImageNet图像数据集训练的ResNetl8模型 进行迁移学习的方法.用于解决可回收生活垃圾的分类识别问题.对现有的可回收生活垃圾图像 集进行旋转、平移、缩放等预处理后,由人工分为纸皮、废纸、塑料、玻璃和金属5个类别.每个类别 各随机选择70%的样本用作训练集,剩余30%用作测试集.在Matlab深度学习框架下,基于训练集 对ResNetl8预训练模型进行迁移学习,形成新的ResNetl8分类模型.对测试集的实验结果表明: 新分类模型分类准确率高达93.67%,而且提高了模型的训练速度.

一、数据集

        本研究的图像数据集以Gary Thung和Mindy Yang∞1创建的垃圾图像数据集为基础,该数据集由1 989 张图片组成,分为玻璃、纸张、塑料、金属、纸皮5个类别,所有图片的大小调整到512×84.由于数据集的图像 数量较少.从Kaggle网站中的waste—pictures数据集中抽取2 485张相同类型的图像,最终形成4 474张图片 的实验数据集.每个类别的样图如图l所示.这些图像能较好表达生活垃圾被回收时的状态,例如变形的瓶 子、皱褶的纸张等.每类大约有500~900张图像,每张照片的灯光和姿势都不一样,每个图像都执行了图像 增强技术.这些技术包括图像的随机旋转、随机亮度控制、随机平移、随机缩放和随机剪切.选择变换的图像 是为了考虑回收材料的不同方向,并最大化数据集的规模.

二、实验训练

        模型训练与测试均是在Matlab 2019a的深度学习框架下完成的.硬件环境:Intel i7—8750H@2.20GHz CPU,32GB内存;Nvidia RTX2070 GPU,8GB显存.软件环境:CUDA Toolkit 9.0,CUDNN V7.0;Matlab Deep Learning Toolbox;Windows 10 64bit操作系统.模型训练与测试均通过GPU加速.对于迁移学习模型训练,主 要有Epoch、Batch Size和Learning Rate参数.

  1. Epoch:一个Epoch指代所有的数据送人网络中完成一次前向计算及反向传播的过程,随着Epoch数 量的增加,神经网络中权重更新迭代的次数增多.
  2. Batch Size:Batch是每次送入网络中训练的一部分数据,而Batch Size就是每个Batch中训练图片样 本的数量.为了在内存效率和内存容量之间寻求最佳平衡,Batch Size应该进行精心设置,优化网络模型的性 能及速度.
  3. Learning Rate:是深度学习中重要的参数,其决定着训练样本的识别精度,合适的Learning Rate能够 使训练样本的识别精度在合适的时间内达到一个理想值. 随机把可回收生活垃圾数据集中每一类别图片的70%分为训练集、另外30%作为测试集.上述3个参数分别取3个不同值时,共完成27次实验,每次实验中训练模型的耗时和模型的测试精度如表1所示.为了 综合评价每种参数组合的效果.对精度和耗时做归一化处理,作为精度和耗时的得分,将精度得分和耗时得 分分别按0.6和0.4加权平均.可得综合得分.根据综合得分,可见Epoch、Batch Size和Learning Rate参数组 合分别取(5,32,10‘3)和(10,32,10。3)时,迁移学习效果最好. 考虑NtJll练过程中可能存在的随机误差,对(5,32,10。3)和(10,32,10‘3)这两个组合,再重复进行4次 实验,可得表2的实验数据.可见这两个参数组合所得的迁移模型精度比较接近,但(5,32,10。)组合的训练 耗时比(10,32,10。)组合少得多.图4和图5是两个组合训练时的过程曲线.可见,在Batch Size和Learning Rate取得合适的值时,Epoch的增加可以提高一定的精度。

三、实验代码

function varargout = main(varargin)
% MAIN MATLAB code for main.fig
%      MAIN, by itself, creates a new MAIN or raises the existing
%      singleton*.
%
%      H = MAIN returns the handle to a new MAIN or the handle to
%      the existing singleton*.
%
%      MAIN('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in MAIN.M with the given input arguments.
%
%      MAIN('Property','Value',...) creates a new MAIN or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before main_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to main_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help main

% Last Modified by GUIDE v2.5 14-Apr-2022 22:27:41

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @main_OpeningFcn, ...
                   'gui_OutputFcn',  @main_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT


% --- Executes just before main is made visible.
function main_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to main (see VARARGIN)

% Choose default command line output for main
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);
cla reset;
box on;
set(handles.axes1,'xtick',[]);
set(handles.axes1,'ytick',[]);
cla reset;
box on; %在坐标轴四周加上边框
set(handles.axes2,'xtick',[]);
set(handles.axes2,'ytick',[]);
box on; %在坐标轴四周加上边框
cla reset;
set(handles.axes3,'xtick',[]);
set(handles.axes3,'ytick',[]);
set(handles.edit1,'string','');
set(handles.edit2,'string','');

% UIWAIT makes main wait for user response (see UIRESUME)
% uiwait(handles.figure1);


% --- Outputs from this function are returned to the command line.
function varargout = main_OutputFcn(hObject, eventdata, handles) 
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
varargout{1} = handles.output;


% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global filepath
filepath = uigetdir('*.*','请选择文件夹');%fliepath为文件夹路径


% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global filepath
if filepath==0|isequal(filepath,0)|~exist(filepath,'dir')
    warndlg('文件夹不存在,请重新选择!','warning');
    return;
end
%%  数据集 %%
% 数据集,每个文件的标签是其所在文件夹
datas=imageDatastore(filepath,'LabelSource','foldernames');
% datas.Labels 标签
% datas.Files  路径+文件名

数量一定要相同
    softmaxLayer % 分类层
    classificationLayer];

%%  参数设定 %%
% 参数配置   
% 验证集才加入
%'ValidationData',valImg,...
%'ValidationFrequency',6,...
options=trainingOptions('sgdm',...
    'MiniBatchSize',10,... % 10
    'MaxEpochs',8,...
    'Shuffle','every-epoch',...
    'InitialLearnRate',1e-4,...
    'Verbose',true,... %命令窗口显示指标
    'Plots','training-progress');

% ,TrainingAccuracy,TrainingLoss
[net_cnn,info]=trainNetwork(trainImg,layers,options);

axes(handles.axes1);
plot(info.TrainingAccuracy);
xlabel('迭代');
ylabel('Accuracy(%)');
axes(handles.axes2);
plot(info.TrainingLoss);
xlabel('迭代');
ylabel('Loss');
%% 模型存储 %%
% 保存模型名称+训练好的模型
save net_cnn net_cnn;

res=num2str(accuracy*100);
res=strcat(res,'%'); 
set(handles.edit1, 'String',res);


% --- Executes on button press in pushbutton3.
function pushbutton3_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton3 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global str;
[filename,pathname]=uigetfile({'*.mat'});
str=[pathname filename];
if isequal(filename,0)|isequal(pathname,0)
    warndlg('模型不存在,请重试!','warning');
    return;
end

参考文献

【1】宁凯,张东波.基于视觉感知的智能扫地机器人的垃圾检测与分类[J].

【2】 刘雅璇,潘万彬.基于自我训练的长效垃圾分类方法[J].

详情资料请扣扣:1341703358今后应进一步 丰富可回收垃圾图像数据集,建立混合垃圾图像的分类与识别模型,以进一步提升可回收垃圾图像模型的识 别准确率.

猜你喜欢

转载自blog.csdn.net/Jiangtagong/article/details/124197943