基于Yolo5模型的动态口罩佩戴识别安卓Android程序设计

禁止完全抄袭,引用注明出处。

下载地址

前排提醒:文件还没过CSDN审核,GitHub也没上传完毕,目前只有模型的.pt文件可以下载。我会尽快更新。

所使用.ptl文件

基于Yolo5的动态口罩佩戴识别模型的pt文件资源-CSDN文库

项目完整文件(还未更新完)

BFU-CS/MaskRecognition at main · CCCP-lus/BFU-CS (github.com)

程序演示

开发环境

项目使用的开发环境:Android Studio Giraffe | 2022.3.1 Patch 2、Kotlin 1.9.20、 JDK1.8、cameraX 1.0.0-beta07、 pytorch 2.1.0

设计思路

(1)需求分析

无论是新冠等全球传染病,还是一直蛰伏在身边的换季流感,都是人类健康的威胁因素。佩戴口罩可以有效阻断传染途径,是公共场所传染病防治最简洁有效的手段。针对以上需求,开发一款基于Yolo5的智能口罩识别安卓应用程序。

其主要实现三个任务:A.保存照片 B.实时显示人脸个数 C.识别人脸并判定口罩佩戴情况

(2)模型训练

①数据集:Kaggle上的口罩照片数据集[1],其中包含了853张进行过预打标的图片,包括戴口罩、未戴口罩、未正确戴口罩三类样本。

②训练模型:采用yolov5s模型[2],epoch值为300,batch-size取4。使用一张RTX4060显卡重复训练四次,得到的最优准确率和召回曲线如下图所示。

图1 模型训练的准确率与召回曲线

(3)架构设计

如下图所示,项目采用了MVVM架构。

图2 架构示意图

布局(View)文件包括资源包 layout 文件夹下放置的布局配置文件: activity_main.xml 与 texture_view.xml,它们定义了主活动的界面。然后再通过 data binding 和 ViewModel 对象 CameraTool.java 进行绑定,以实现拍照功能为例,负责绑定的相关代码如下。

//正向绑定
cameraBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
cameraBinding.setViewModel(cameraTool);

// 反向绑定
<Button
    android:id="@+id/camera_capture_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginBottom="50dp"
    android:elevation="2dp"
    android:scaleType="fitCenter"
    android:text="Take Photo"
    android:onClick="@{()->viewModel.capturePhoto2()}"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintHorizontal_bias="0.498"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent" />

Model 部分包括获取相机权限、图片处理、拍照等活动。这样就实现了一个 MVVM 架构,它的特点是以数据为中心,由数据来驱动,ViewModel 帮助 Activity 分担一部分或者所有的工作,可以降低代码之间的耦合度。

项目的功能结构如下图所示。该项目的主要功能为实现屏幕中人脸识别并按照口罩佩戴情况的分类功能。在界面中用户可以实时查看到识别到的人脸位置、分类结果、数量统计,也可以点击拍照按钮抓拍照片。

图3 功能结构图

模型训练

我的过程还在整理,这篇就写的很好,可以先参照下。但是使用的数据集不一样,所以结果、性能等也不一定一样,请读者知悉。

利用yolov5实现口罩佩戴检测算法(非常详细)_基于yolov5的口罩识别-CSDN博客

程序编写

(1)代码结构分析

资源文件

资源包 assets 文件夹下放置一些静态资源,包括用于保存和加载完整的 PyTorch 模型结构和参数等信息的 best.torchscript.ptl 文件,以及存放此模型对应类别标签的 classes.txt 文件。

布局文件

资源包 layout 文件夹下放置布局配置文件 activity_main.xml 与 texture_view.xml,它们定义了主活动的界面。

任务A

A任务中,点击按钮存储照片的功能是在上述功能的基础上,定义了一个按钮侦听器负责调用拍照函数。该函数通过调用 CameraX 库中的方法拍照,并传入 OutputFileOptions 对象、执行器对象和回调函数。在回调函数中显示 Toast 提示用户文件成功保存。

任务B

B任务中,计算并输出检测到的⼈脸的个数功能是模型运算结果的中间产物,通过调取将模型输出 outputs 转换而成的结果列表 Array,求其长度即可得到检测到的⼈脸个数。

任务C

C任务的主要目标可以简化为在拍摄过程中寻找人脸,并根据人脸的面部特征进行分类。这个过程可以大致分为三步:

首先程序会判断权限是否已经获得,如果已经获得就会启动相机。相机启动后会捕获图像用于后续操作(分析、保存等)。

然后,需要对原始数据进行处理。通过创建 ImageAnalysis 实例的方式,完成包括旋转角度、镜像等操作,其目的是让在屏幕上显示的照片符合人眼观看方向。

最后模型返回一个 Result 类型的结果数组,包括每个矩形的位置,类别和属于这个类别的概率。通过调用分析图像方法将分析结果应用于UI线程,这个过程的更新间隔非常短,使用户可以视觉上认为这是实时分析的结果。

(2)测试结果

模型准确度测试

更换新的数据集Object_Dete_Masking[3],充分模拟了视角变化、遮挡物、多目标等不同情境。再次进行预测,准确率曲线和部分测试结果如下图所示。这个结果表示有充分理由认为模型的训练结果是可以接受的。

 图4 新数据集测试结果

图5 新数据集测试结果(部分)

模型鲁棒性测试

针对连续按键、过量目标等非正常情况进行了程序的鲁棒性测试。测试结果发现,系统能够在各种复杂环境下保持稳定的性能,并且对于异常输入和各种干扰情况都有较好的处理能力。可以认为鲁棒性测试通过。

存在问题

口罩佩戴不正确的训练样本过少,导致这种临界情况不能被有效识别。后续可以通过增大这部分样本重新训练的方式解决此问题。另外模型有时会将中景里模糊的白色物体(测试中是一个路由器)识别为口罩从而造成误判。后续可以通过增加训练样本、减小敏感度参数的方式解决此问题。

参考文献

[1] Face Mask Detection[OL].2020.https://www.kaggle.com/datasets/andrewmvd/face-mask-detection

[2] Glenn Jocher: yolov5: v3.1 - Bug Fixes and Performance Improvements[J].2020.10. Zenodo

[3] Object_Dete_Masking[OL].2020.https://github.com/huzixuan1/Object_Dete_Masking

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/438272.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

信息抽取技术:电商领域的智能化革命与市场策略优化

一、引言 在当今快速发展的互联网电商领域&#xff0c;信息抽取技术的应用已经成为商家优化供应链、降低成本、提高响应速度的关键手段。随着消费者需求的日益多样化和个性化&#xff0c;电子商务平台需要更高效、智能的数据处理能力来应对市场的挑战。从供应商管理到库存优化…

蓝桥杯(3.7)

P1102 A-B 数对 import java.util.Scanner; public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();int c sc.nextInt();int[] res new int[n1];for(int i1;i<n;i)res[i] sc.nextInt();int sum 0;for(i…

看一看阿里云,如何把抽象云概念,用可视化表达出来。

云数据库RDS_关系型数据库 云数据库RDS_关系型数据库 专有宿主机 云数据库RDS_关系型数据库_MySQL源码优化版 内容协作平台CCP-企业网盘协同办公-文件实时共享

python基础——入门必备知识

&#x1f4dd;前言&#xff1a; 本文为专栏python入门基础的第一篇&#xff0c;主要带大家先初步学习一下python中的一些基本知识&#xff0c;认识&#xff0c;了解一下python中的一些专有名词&#xff0c;为日后的学习打下良好的基础,。本文主要讲解以下的python中的基本语法&…

【nodejs】“__dirname is not defined”错误修复

▒ 目录 ▒ &#x1f6eb; 问题描述环境 1️⃣ 原理CommonJS vs ESM错误原因 2️⃣ 禁用 ESM 模式并改用 CommonJS方案一&#xff1a;项目方案二&#xff1a;单文件 3️⃣ 在 ESM 模式下自实现__dirname&#x1f4d6; 参考资料 &#x1f6eb; 问题 描述 从网上找了一份代码&am…

opengl 学习(一)-----创建窗口

创建窗口 分类opengl 学习(一)-----创建窗口效果解析教程补充 分类 c opengl opengl 学习(一)-----创建窗口 demo: #include "glad/glad.h" #include "glfw3.h" #include <iostream> #include <cmath> #include <vector>using names…

智能控制:物联网智能插座对接文档

介绍 一开始买的某米的插座&#xff0c;但是好像接口不开放&#xff0c;所以找到了这个插座&#xff0c;然后自己开发了下&#xff0c;用接口控制插座开关。wifi的连接方式&#xff0c;通电后一般几秒后就会连接上wifi&#xff0c;这个时候通过接口发送命令给他。 产品图片 通…

第十篇:复习maven

文章目录 一、什么是Maven1. 依赖管理2. 统一项目结构3. 项目构建4. 依赖的仓库 二、IDEA集成Maven1. Maven简单的安装和配置2. 配置Maven环境3. 创建Maven项目4. Maven坐标4. 导入Maven项目 三、依赖管理1. 依赖配置2. 依赖传递3. 依赖范围4. 生命周期 四、小结 一、什么是Mav…

SAP MM学习笔记 - 错误 BMG140 - The material number is longer than the length set

错误 BMG140 - The material number is longer than the length set 品目编号大于长度设置 1&#xff0c;在新规品目的时候&#xff0c;出的错 2&#xff0c;OMSL 品目Code书式变更 IMG path>Logistic general>Material Master>Basic settings>Define output for…

【Web前端入门学习】—CSS

目录 CSS简介CSS语法CSS三种导入方式CSS选择器元素选择器&#xff08;标签选择器&#xff09;类选择器ID选择器通用选择器子元素选择器后代选择器&#xff08;包含选择器&#xff09;并集选择器&#xff08;兄弟选择器&#xff09;伪类选择器伪元素选择器 CSS常用属性盒子模型网…

TabLayout预览不了?

<TableLayoutandroid:layout_width"wrap_content"android:layout_height"wrap_content"/> 当然预览不了了&#xff0c;这其实不是我要的控件。 而实际需要的是TabLayout 不是TableLayout &#xff01;&#xff01;&#xff01; <com.google.an…

机器学习——感知机模型

机器学习系列文章 入门必读&#xff1a;机器学习介绍 文章目录 机器学习系列文章前言1. 感知机1.1 感知机定义1.2 感知机学习策略 2. 代码实现2.1 构建数据2.2 编写函数2.3 迭代 3. 总结 前言 大家好&#xff0c;大家好✨&#xff0c;这里是bio&#x1f996;。这次为大家带来…

lvs+keepalive

虚拟路由冗余协议(Virtual Router Redundancy Protocol&#xff0c;简称VRRP) VRRP能够在不改变组网的情况下&#xff0c;将多台路由器虚拟成一个虚拟路由器&#xff0c;通过配置虚拟路由器的IP地址为默认网关&#xff0c;实现网关的备份。 协议版本: VRRPv2&#xff08;常用&…

日常生活小技巧 -- USR-TCP232-M4(读取IP)

下载&#xff1a;[Configuration Software]USR-TCP232-M4_V2.3.4.106

Vue2+3

vue相关介绍 Vue的两种使用方式&#xff1a; 1、vue核心包开发 场景&#xff1a;局部模块改造 2、vue核心包&vue插件工程化开发 场景&#xff1a;整站开发 概念&#xff1a;vue是用于构建用户界面的渐进式框架 创建vue实例 创建Vue实例&#xff0c;初始化渲染步骤&am…

Unity类银河恶魔城学习记录8-4 P80 Blackhole ability state源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Entity.cs using System.Collections; using System.Collections.Generic…

Windows系统获取硬盘读写速度(固态、机械通用)

管理员身份运行cmd&#xff0c;注意不要用powershell&#xff0c;可能会闪退 运行命令 winsat disk -drive C 获得C盘的读写速度 同理 winsat disk -drive D 可获得D盘的读写性能

【产品文档分类及撰写路径】

一、产品文档的分类 产品文档根据所处阶段和面相对象的差异大致可以分为三类&#xff1a; 商业需求文档 (BRD)&#xff1a;商业需求文档是面向公司高层和项目组&#xff0c;目的是为了获得资金、资源支持。市场需求文档 (MRD)&#xff1a;市场需求文档是面向运营和市场销售人员…

Python读取.csv/.txt文件并画图

文章目录 读取.txt文件并画出每列数据读取.csv文件并画出每列数据python绘图的基本知识补充 读取.txt文件并画出每列数据 main.ipynb //注意文件类型为.ipynbimport matplotlib.pyplot as plt import numpy as npdata np.loadtxt(result.txt) fig plt.figure(dpi100,figsize…

哪个牌子宠物空气净化器好?质量好的宠物空气净化器推荐

即使我们很爱自家的宠物&#xff0c;但我们也无法否认处理房间里飘荡的宠物毛发和皮屑&#xff0c;以及那些令人不快的气味&#xff08;比如地毯上的意外和垃圾桶里的气味&#xff09;的挑战。对于过敏患者来说&#xff0c;这几乎是无法忍受的。寻找有效的方法来减少这些问题对…