m基于CNN卷积神经网络的口罩识别系统matlab仿真,带GUI操作界面,可以检测图片和视频,统计人数

发布时间 2023-09-09 22:07:01作者: 我爱C编程

1.算法仿真效果

matlab2022a仿真结果如下:

 

 

 

2.算法涉及理论知识概要

          CNN 由许多神经网络层组成。卷积和池化这两种不同类型的层通常是交替的。网络中每个滤波器的深度从左到右增加。最后通常由一个或多个全连接的层组成。

 

Convnets 背后有三个关键动机:局部感受野、共享权重和池化。

 

1)局部感受野

 

        如果想保留图像中的空间信息,那么用像素矩阵表示每个图像是很方便的。然后,编码局部结构的简单方法是将相邻输入神经元的子矩阵连接成属于下一层的单隐藏层神经元。这个单隐藏层神经元代表一个局部感受野。请注意,此操作名为“卷积”,此类网络也因此而得名。

 

2)共享权重和偏置

 

        假设想要从原始像素表示中获得移除与输入图像中位置信息无关的相同特征的能力。一个简单的直觉就是对隐藏层中的所有神经元使用相同的权重和偏置。通过这种方式,每层将从图像中学习到独立于位置信息的潜在特征。

理解卷积的一个简单方法是考虑作用于矩阵的滑动窗函数。在下面的例子中,给定输入矩阵 I 和核 K,得到卷积输出。将 3×3 K(有时称为滤波器或特征检测器)与输入矩阵逐元素地相乘以得到输出卷积矩阵中的一个元素。

 

3)池化层

 

        假设我们要总结一个特征映射的输出。我们可以使用从单个特征映射产生的输出的空间邻接性,并将子矩阵的值聚合成单个输出值,从而合成地描述与该物理区域相关联的含义。

 

         基于卷积神经网络(CNN)的口罩识别系统是一种用于自动检测人们是否佩戴口罩的技术。在COVID-19疫情爆发以来,这样的系统变得尤为重要,因为佩戴口罩已成为一种重要的健康防护措施。下面是对基于CNN的口罩识别系统的详细介绍:

 

系统工作原理:

 

数据收集与准备: 收集包含戴口罩和不戴口罩的人脸图像数据集。这些图像可以来自不同角度、光照条件和种类的人脸图像。数据集应具有标签,以指示每张图像中是否戴口罩。

 

数据预处理: 对收集到的图像进行预处理,包括图像尺寸调整、数据增强(如旋转、翻转、缩放等)以及归一化处理,以确保数据集具有一致的格式和质量。

 

构建CNN模型: 构建卷积神经网络模型,它是一种在图像处理任务中表现出色的深度学习模型。CNN模型通常包含卷积层、池化层、全连接层等,这些层可以有效地从图像中提取特征。

 

模型训练: 使用数据集对构建好的CNN模型进行训练。通过将图像输入模型并与相应的标签进行比较,模型会自动调整其内部参数,以最小化预测标签与实际标签之间的误差。

 

模型评估: 使用另外的测试数据集对训练好的模型进行评估,计算其在识别戴口罩和不戴口罩情况下的准确率、召回率、精确率等指标。

 

预测与应用: 使用训练好的模型对新的人脸图像进行预测。模型将分析图像并输出预测结果,即判断该人是否佩戴口罩。

 

系统优势:

 

自动化检测: 基于CNN的口罩识别系统可以自动检测人们是否戴口罩,减少了人工干预的需要。

 

准确性: CNN在图像处理任务中表现出色,可以准确地捕捉人脸图像中的特征,从而实现高准确率的口罩识别。

 

实时性: 经过优化的CNN模型可以实现实时的口罩识别,适用于人流密集的场所。

 

适应性: 可以通过不断收集新的数据进行模型迭代,提高系统在各种情况下的适应性。

 

应用场景:

 

公共场所管理: 在火车站、机场、商场等人流密集的公共场所使用,协助管理人员监控口罩佩戴情况。

 

企业入口管理: 用于企业、学校等机构的入口,确保进入人员佩戴口罩。

 

疫情防控: 在医院、隔离点等场所使用,辅助疫情防控工作。

 

交通工具: 用于公共交通工具入口,确保乘客佩戴口罩后方可乘坐。

 

基于CNN的口罩识别系统在当今的健康卫生环境中具有重要作用,有助于有效地降低疫情传播风险。

 

3.MATLAB核心程序

 

function varargout = tops(varargin)
% TOPS MATLAB code for tops.fig
%      TOPS, by itself, creates a new TOPS or raises the existing
%      singleton*.
%
%      H = TOPS returns the handle to a new TOPS or the handle to
%      the existing singleton*.
%
%      TOPS('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in TOPS.M with the given input arguments.
%
%      TOPS('Property','Value',...) creates a new TOPS or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before tops_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to tops_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 tops
 
% Last Modified by GUIDE v2.5 23-Aug-2023 23:37:39
 
 
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @tops_OpeningFcn, ...
                   'gui_OutputFcn',  @tops_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 tops is made visible.
function tops_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 tops (see VARARGIN)
 
% Choose default command line output for tops
handles.output = hObject;
 
% Update handles structure
guidata(hObject, handles);
 
% UIWAIT makes tops wait for user response (see UIRESUME)
% uiwait(handles.figure1);
 
 
% --- Outputs from this function are returned to the command line.
function varargout = tops_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 im;
cla (handles.axes1,'reset')
cla (handles.axes2,'reset')
set(handles.edit1,'string',num2str(0));
set(handles.edit2,'string',num2str(0));
set(handles.edit3,'string',num2str(0));
load CNNmask.mat
axes(handles.axes1);
[filename,pathname]=uigetfile({'*.bmp;*.jpg;*.png;*.jpeg;*.tif'},'选择一个图片','F:\test');
str=[pathname filename];
% 判断文件是否为空,也可以不用这个操作!直接读入图片也可以的
% im = imread(str);
% imshow(im)
if isequal(filename,0)||isequal(pathname,0)
    warndlg('please select a picture first!','warning');
    return;
else
    im = imread(str);
    imshow(im);
end
 
 
% --- 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 im;
load CNNmask.mat
 
img_size     = [227,227];
frameCount   = 0;
FDetect      = vision.CascadeObjectDetector;
picture      = im;
orig_picture = picture;
BB           = step(FDetect, picture);
frameCount   = frameCount+1;
axes(handles.axes2);
 
cnt0=0;
cnt1=0;
if size(BB,1) >= 1 
    for faces_iter = 1:size(BB,1)  
        picture_cropped = imcrop(orig_picture,BB(faces_iter,:));
        picture_resized = imresize(picture_cropped,img_size);
        label = classify(net, picture_resized); 
        label_text = char(label);
 
 
        if strcmp(label_text, 'no_mask')
            text_color = 'red';
            line_color{faces_iter} = 'r';
            cnt0=cnt0+1;
        end
        if strcmp(label_text, 'mask')
           text_color = 'green';
           line_color{faces_iter} = 'g';
            cnt1=cnt1+1;
        end
         label_text
         line_color
         image(picture); 
         axis off;
    end
    for faces_iter = 1:size(BB,1)  
        rectangle('Position', BB(faces_iter,:), 'Linewidth',2,'LineStyle','-','EdgeColor',line_color{faces_iter});
        hold on
    end
else 
    image(picture);
    picture = imresize(picture,img_size);  
    axis off
end
 
 
set(handles.edit1,'string',num2str(size(BB,1)));
set(handles.edit2,'string',num2str(cnt1));
set(handles.edit3,'string',num2str(cnt0));
% --- 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 vid;
global numFrames;
cla (handles.axes1,'reset')
cla (handles.axes2,'reset')
load CNNmask.mat
set(handles.edit1,'string',num2str(0));
set(handles.edit2,'string',num2str(0));
set(handles.edit3,'string',num2str(0));
 
 
axes(handles.axes1);
[filename,pathname]=uigetfile({'*.mp4'},'选择一个视频','F:\test');
str=[pathname filename];
% 判断文件是否为空,也可以不用这个操作!直接读入图片也可以的
% im = imread(str);
% imshow(im)
if isequal(filename,0)||isequal(pathname,0)
    warndlg('please select a picture first!','warning');
    return;
else
    vid = VideoReader(str);
    numFrames = vid.NumFrames;
    for i = 1:1:numFrames
        picture = read(vid,i);
        image(picture); 
        drawnow;
    end
end
 
 
 
 
 
% --- Executes on button press in pushbutton4.
function pushbutton4_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton4 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global vid;
global numFrames;
load CNNmask.mat
    img_size = [227,227];
    frameCount = 0;
FDetect = vision.CascadeObjectDetector;
axes(handles.axes2);