基于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);// 反向绑定
<Buttonandroid: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.mzph.cn/news/737423.shtml

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

相关文章

ES6基础4

Set 基本用法 ES6提供了新的数据结构Set。它类似于数组&#xff0c;但是成员的值都是唯一的&#xff0c;没有重复的值。Set本身是一个构造函数&#xff0c;用来生成Set数据结构。 // 例一 var set new Set([1, 2, 3, 4, 4]); [...set] // [1, 2, 3, 4]// 例二 var items new …

升级ChatGPT4.0失败的解决方案

ChatGPT 4.0科普 ChatGPT 4.0是一款具有多项出众功能的新一代AI语言模型。以下是关于ChatGPT 4.0的一些关键特点和科普内容&#xff1a; 多模态&#xff1a;ChatGPT 4.0具备处理不同类型输入和输出的能力。这意味着它不仅可以接收文字信息&#xff0c;还能处理图片、视频等多…

CNN中常见的池化操作有哪些,作用是什么?

CNN中常见的池化操作有哪些&#xff0c;作用是什么&#xff1f; CNN中常见的池化操作只要是两种&#xff0c;平均值池化和最大值池化最大值池化常用于分类任务&#xff0c;是指在输入数据的局部区域内取最大值作为输出。最大池化的作用是降低特征图的尺寸&#xff0c;减少参数…

C++17中auto作为非类型模板参数

非类型模板参数是具有固定类型的模板参数&#xff0c;用作作为模板参数传入的constexpr值的占位符。非类型模板参数可以是以下类型&#xff1a; (1).整型&#xff1b; (2).枚举类型&#xff1b; (3).std::nullptr_t&#xff1b; (4).指向对象的指针或引…

vscode中解决驱动编写的时候static int __init chrdev_init()报错的问题

目录 错误出错原因解决方法 错误 在入口函数上&#xff0c;出现 expected a ; 这样的提示 出错原因 缺少了 __KERNEL __ 宏定义 解决方法 补上__KERNEL__宏定义 具体做法&#xff1a;在vscode中按下ctrlshiftp &#xff0c;输入&#xff1a;C/C:Edit Configurations&#xff0…

AcWing 4956. 冶炼金属

对于这个题&#xff0c;V越大&#xff0c;除出来的数就越小&#xff0c;V越小&#xff0c;除出来的数就越大&#xff0c;当我们找一个最大和最小值的时候&#xff0c;就可以通过这个性质进行二分来求解。 可以通过求满足 [ A V ] [\frac{A}{V}] [VA​] 小于等于 B B B的最小的…

手把手教使用静默 搭建Oracle 19c 一主一备ADG集群

一、环境搭建 主机IPora19192.168.134.239ora19std192.168.134.240 1.配置yum源 1.配置网络yum源 1.删除redhat7.0系统自带的yum软件包&#xff1b; rpm -qa|grep yum >oldyum.pkg 备份原信息rpm -qa|grep yum|xargs rpm -e --nodeps 不检查依赖&#xff0c;直接删除…

EE5437-IOT(Lecture 07-Control Interface System)

Review&#xff1a; introduce the micro input device system&#xff08;MIDS&#xff09; • The calibration and testing has been covered • The introduction to filters with the example called Butterworth filter and the maths have been also demonstrated. …

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:CalendarPicker)

日历选择器组件&#xff0c;提供下拉日历弹窗&#xff0c;可以让用户选择日期。 说明&#xff1a; 该组件从API Version 10开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 CalendarPicker(options?: CalendarOptions) …

跨境账号养号怎么做?Facebook、亚马逊运营必看

之前我们讨论过很多关于代理器的问题。它们的工作原理是什么?在不同的软件中要使用那些代理服务器?这些代理服务器之间的区别是什么?什么是反检测浏览器等等。 除了这些问题&#xff0c;相信很多人也会关心在使用不同平台的时代理器的选择问题。比如&#xff0c;为什么最好…

Mybatis操作sql报错ibatis.binding.BindingException: Parameter ‘empId‘ not found.

你们好&#xff0c;我是金金金。 场景 在使用Mybatis操作sql语句过程当中&#xff0c;更新操作&#xff0c;报错信息如下&#xff1a;Caused by: org.apache.ibatis.binding.BindingException: Parameter ‘empId’ not found. Available parameters are [arg1, arg0, param1, …

m序列生成器

function [m] mserial_generator(tap_set) % m序列产生器 % 输出为m序列&#xff0c;未进行极性变换。 L 2^(length(tap_set)-1)-1; x [zeros(1,(length(tap_set)-2)) 1]; for i 1:1:Lm(i)x(end);for j 1:1:length(tap_set)-1sum_vector(j)tap_set(j1)*x(j);endsum_x mod…

聊聊python中面向对象编程思想

面向对象编程思想 1、什么是面向过程 传统的面向过程的编程思想总结起来就八个字——自顶向下&#xff0c;逐步细化&#xff01; → 将要实现的功能描述为一个从开始到结束按部就班的连续的“步骤” → 依次逐步完成这些步骤&#xff0c;如果某一个步骤的难度较大&#xff…

2024暑期实习八股笔记

文章目录 自我介绍MySQL索引索引种类、B树聚簇索引、非聚簇索引联合索引、最左前缀匹配原则索引下推索引失效索引优化 日志、缓冲池redo log&#xff08;重做日志&#xff09;刷盘时机日志文件组 bin log&#xff08;归档日志&#xff09;记录格式写入机制 两阶段提交undo log&…

20240309web前端_第一周作业_古诗词

作业三&#xff1a;古诗词 成果展示&#xff1a; 完整代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0&q…

FLatten Transformer_ Vision Transformer using Focused Linear Attention

paper: https://arxiv.org/abs/2308.00442 code: https://github.com/LeapLabTHU/FLatten-Transformer 摘要 当将transformer模型应用于视觉任务时&#xff0c;自注意的二次计算复杂度( n 2 n^2 n2)一直是一个持续存在的挑战。另一方面&#xff0c;线性注意通过精心设计的映射…

事务的特性,API、隔离级别、传播行为

一、事务 1、事务的介绍 事务就是用户定义的一系列执行SQL语句的操作, 这些操作要么完全地执行&#xff0c;要么完全地都不执行&#xff0c; 它是一个不可分割的工作执行单元。 2、事务的使用场景 例如在日常生活中&#xff0c;有时我们需要进行银行转账&#xff0c;这个银行转…

就业班 2401--3.11 Linux Day15--ftp数据传输测试server和client+谷歌验证码登录远程连接

文件服务器 路漫漫其修远兮&#xff0c;吾将上下而求索.构建NFS远程共享存储 一、NFS介绍 文件系统级别共享&#xff08;是NAS存储&#xff09; --------- 已经做好了格式化&#xff0c;可以直接用。 速度慢比如&#xff1a;nfs&#xff0c;sambaNFS NFS&#xff1a;Networ…

用A*算法求解八数码问题

用A*算法求解八数码问题 实现两种启发函数实现A*算法测试 实现两种启发函数 采取两种策略实现启发函数&#xff1a; 策略1&#xff1a;不在目标位置的数字个数策略2&#xff1a;曼哈顿距离&#xff08;将数字直接移动到对应位置的步数总数&#xff09; # 策略1: 不在目标位置…

蓝桥杯每日一题 (递推、递归、)

3777. 砖块&#xff08;每日一题&#xff09; 后面if条件判断很巧妙&#xff0c;只要有一种成立就不管另一种了。 #include<bits/stdc.h> using namespace std; //3777. 砖块 //跟贪心差不多 string s; int t,n;void update(char &c) {if(cW)cB;else cW; }bool che…