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

news2024/11/19 0:30:28

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

下载地址

前排提醒:文件还没过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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用 Docker 部署 Next Terminal 轻量级堡垒机

1&#xff09;Next Terminal 介绍 官网&#xff1a;https://next-terminal.typesafe.cn/ GitHub&#xff1a;https://github.com/dushixiang/next-terminal 想必经常玩服务器的都了解过 堡垒机&#xff0c;类似于跳板机&#xff0c;但与跳板机的侧重点不同。堡垒机的主要功能是…

python编程从入门到实践答案二

python编程从入门到实践 第五章 if语句1.条件测试&#xff1a;2.更多的条件测试&#xff1a;3.外星人颜色#1&#xff1a;4. 外星人颜色#2&#xff1a;5. 外星人颜色#3&#xff1a;6. 人生的不同阶段&#xff1a;7. 喜欢的水果&#xff1a;8. 以特殊方式跟管理员打招呼&#xff…

前端加密面面观:常见场景与方法解析

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

单链表(下)

我们在单链表&#xff08;上&#xff09;中了解了一些需要实现的函数&#xff0c;这一篇就让我们一起来实现。 1.创建新节点 2.打印 3.尾插 4.头插 5.尾删 6.头删 7.查找 8.计算节点个数 9.在指定位置之前插入数据 10.在指定位置之前插入数据 11.删除指定位置的节点 12.删除指…

RIPEMD算法:多功能哈希算法的瑰宝

title: RIPEMD算法&#xff1a;多功能哈希算法的瑰宝 date: 2024/3/10 17:31:17 updated: 2024/3/10 17:31:17 tags: RIPEMD起源算法优势安全风险对比SHA优于MD5应用领域工作原理 一、RIPEMD算法的起源与历程 RIPEMD&#xff08;RACE Integrity Primitives Evaluation Messag…

阿里云服务器多少钱一年?价格表新鲜出炉(2024)

2024阿里云服务器优惠活动政策整理&#xff0c;阿里云99计划ECS云服务器2核2G3M带宽99元一年、2核4G5M优惠价格199元一年&#xff0c;轻量应用服务器2核2G3M服务器61元一年、2核4G4M带宽165元1年&#xff0c;云服务器4核16G10M带宽26元1个月、149元半年&#xff0c;云服务器8核…

维修家用美容射频美容仪

今天收到客户寄过来的一款家用射频美容仪。根据客户的反馈&#xff0c;插电开机没反应&#xff0c;经过排查&#xff0c;原来是12v-2A电源坏了。给客户更换一个新电源就可以了。

Mysql 死锁案例2-间隙锁与意向插入锁冲突

死锁复现 CREATE TABLE t (id int(11) NOT NULL,c int(11) DEFAULT NULL,d int(11) DEFAULT NULL,PRIMARY KEY (id),KEY c (c) ) ENGINEInnoDB DEFAULT CHARSETutf8;/*Data for the table t */insert into t(id,c,d) values (0,0,0),(5,5,5),(10,10,10) 事务1事务2T1START …

【Linux】常用操作命令

目录 基本命令关机和重启帮助命令 用户管理命令添加用户&#xff1a;useradd 命令修改密码&#xff1a;passwd 命令查看登录用户&#xff1a;who 命令查看登录用户详细信息 :w切换用户 目录操作命令cdpwd命令目录查看 ls [-al] 目录操作【增&#xff0c;删&#xff0c;改&#…

Jenkins 部署 RuoYi

目录 1、项目介绍 2、部署若依 clone 源代码 导入数据库到 node-16 修改 RuoYi 配置文件 推送 RuoYi 项目至 Gitlab 3、配置 Jenkins 配置本地 Maven Jenkins 配置 Maven 新建 Maven 项目 编写构建后的脚本 Jenkins 构建后执行脚本 4、Jenkins 传递参数 设置项目部…

el-table 插入输入框并进行校验

<template><div><el-form :model"list" ref"ruleForm"><el-table :data"list.tableData" style"width: 100%"><el-table-column prop"time" label"日期" width"180"><…

Swagger修改Api文档中的数据类型

swagger不陌生,API接口利器,本次要解决的问题是:我们知道前端在接收Long类型的属性时会出现精度问题,一般我们会在序列化的时候将Long类型的数字转换成String但是swagger的API文档中的类型还是Long,我们要解决的就是这个问题 不知道swagger怎么配置得可以看之前的文章:springb…

matlab阶段学习笔记小节2

syms定义符号变量 求极限 第二题 第三题 limit(y,n,inf);求的的函数y关于自变量n在无穷处&#xff08;inf&#xff09;的极限 exp(2)即指数为2&#xff0c;底为e,也就是e^2 求导数 第一题 log(x)默认是以e为底的指数函数&#xff0c;也就是ln(x). 使用diff(f)对函数进行求…

工作纪实46-关于微服务的上线发布姿势

蓝绿部署 在部署时&#xff0c;不需要将旧版本的服务停掉&#xff0c;而是将新版本与旧版本同时运行&#xff0c;新版本测试无误之后再将旧版本停掉。这样可以避免再升级的过程中如果失败服务不可用的问题&#xff0c;因为同时部署了两个版本的程序&#xff0c;使得硬件资源是…

Xshell 连接 虚拟机

一、网络配置 1. 虚拟网络编辑器 2. 打开本机的网络适配器选项 检查 3. 修改虚拟机的网段 vim /etc/sysconfig/network-scripts/ifcfg-ens33 按键盘 i 进行修改 键盘右上角Esc退出&#xff0c;然后输入 &#xff1a;wq 保存&#xff0c;然后重启网卡 systemctl restart netwo…

Oracle Essbase 多维库导入文件数据步骤操作

第一步&#xff1a; 先确定导入数据的维度数量&#xff08;清楚自己需要导入什么数据和范围&#xff09; 第二步&#xff1a; 设置加载的规则 1.创建规则 2.编辑规则-》打开数据文件 通过数据文件来确定加载规则的加载格式 先查看数据文件格式&#xff1a; 将数据文件导入&…

javase day02笔记

第二天课堂笔记 源文件的组成部分★★ 源文件外部结构 class 类名{}main方法 public static void main(String [] args){}main方法可有可无 没有main的情况&#xff0c;编译成功&#xff0c;运行失败&#xff0c;没有程序入口 多个main情况&#xff0c;编译报错&#xff0c;…

编曲学习:钢琴编写 人性化、逻辑预制 工程音频导出

第8课 钢琴编写 人性化、逻辑预制 工程音频导出小鹅通-专注内容付费的技术服务商https://app8epdhy0u9502.pc.xiaoe-tech.com/live_pc/l_65e30339e4b064a8cfe56001?course_id=course_2XLKtQnQx9GrQHac7OPmHD9tqbv 音乐创作中,有思路时可以不套学习到的公式,没有思路时可以套…

软件测试相关内容第三弹--软件测试基础

写在前&#xff1a;在前篇的两篇博客介绍中我们主要学习软件测试的相关概念&#xff0c;对软件测试进行了初步的了解&#xff0c;本篇博客将进一步进行学习。重点内容包括&#xff1a;软件测试的生命周期、如何描述一个bug、如何定义bug的级别、bug的生命周期以及在实际工作中如…

C语言:ctype和string库中的部分常用函数的应用和实现

在编程过程中&#xff0c;我们经常要处理字符和字符串&#xff0c;C语言标准库中就提供了一系列的库函数&#xff0c;便于我们操作库函数。 字符分类函数 C语⾔中有⼀系列的函数是专⻔做字符分类的&#xff0c;也就是⼀个字符是属于什么类型的字符的。这些函数的使⽤都需要包含…