使用DJL和PaddlePaddle的口罩检测详细指南

使用DJL和PaddlePaddle的口罩检测详细指南

完整代码

该项目利用DJL和PaddlePaddle的预训练模型,构建了一个口罩检测应用程序。该应用能够在图片中检测人脸,并将每张人脸分类为“戴口罩”或“未戴口罩”。我们将深入分析代码的每个部分,以便清晰了解每一步。

代码关键组件

  1. 缩放比例和置信度阈值配置

    • scale:控制图像缩放比例;值越小检测速度越快,但精度会降低。可根据应用场景的精度要求调整。
    • threshold:设定检测结果的最低置信度,用于过滤低置信度的检测结果。
  2. 人脸和口罩检测模型的初始化

    • 初始化FaceDetection用于定位人脸区域,FaceMaskDetect则用于对检测出的人脸区域进行口罩状态的分类。
  3. 模型加载和预测

    • 使用DJL的ZooModel类加载人脸检测和口罩分类模型。人脸检测模型识别图像中的人脸区域,分类模型判断每张人脸是否佩戴口罩。
    • 遍历资源目录中的所有图像文件,分别进行检测和分类,并将结果保存和记录。

优化后的代码讲解

以下是代码的改进版本,加入了详细的注释来说明每一步的操作:

@SneakyThrows
@Test
public void test1() {// 设置人脸检测的缩放比例和置信度阈值float scale = 0.5f;  // 缩小图像尺寸,提升检测速度float threshold = 0.7f;  // 仅保留置信度大于0.7的检测结果// 初始化人脸检测和口罩检测模型FaceDetection faceDetection = new FaceDetection();FaceMaskDetect faceMaskDetect = new FaceMaskDetect();try (// 加载人脸检测模型ZooModel<Image, DetectedObjects> model = ModelZoo.loadModel(faceDetection.criteria(scale, threshold));Predictor<Image, DetectedObjects> faceDetector = model.newPredictor();// 加载口罩分类模型ZooModel<Image, Classifications> classifyModel = ModelZoo.loadModel(faceMaskDetect.criteria());Predictor<Image, Classifications> classifier = classifyModel.newPredictor()) {// 遍历资源目录中的图像文件for (File file : new File("src/test/resources").listFiles()) {// 读取并处理图像BufferedImage img = ImageIO.read(file);Image image = ImageFactory.getInstance().fromImage(img);// 使用人脸检测和口罩分类器进行预测DetectedObjects detections = faceMaskDetect.predict(faceDetector, classifier, image);// 保存检测结果,绘制边框并记录到指定目录ImageUtils.saveBoundingBoxImage(image, detections, file.getName(), "build/output");// 日志输出检测结果logger.info("{}", detections);}}
}

各步骤详细解读
Step 1: 设置检测参数
scale参数控制图像缩放的比率。缩小图像的尺寸会提升检测速度,但可能会损失一些精度。该值可以根据需求灵活调整。
threshold参数设定了最小置信度,用于过滤低置信度的检测结果。例如,0.7的阈值意味着仅保留置信度在70%以上的结果。
Step 2: 初始化检测模型
这里分别初始化FaceDetection和FaceMaskDetect两个对象。FaceDetection对象用于人脸检测,即识别图像中的人脸位置。FaceMaskDetect对象则用于口罩检测,即对识别出的人脸区域进一步分类。

Step 3: 加载模型和初始化预测器
ModelZoo.loadModel(faceDetection.criteria(scale, threshold))通过criteria加载人脸检测模型,并将其转化为DJL的ZooModel对象。
Predictor<Image, DetectedObjects> faceDetector = model.newPredictor()创建一个Predictor,用于接收Image对象并返回人脸检测的DetectedObjects。
同样,口罩分类模型通过faceMaskDetect.criteria()加载,并使用Predictor<Image, Classifications>进行分类预测。
Step 4: 遍历图像文件
使用listFiles()方法遍历指定目录下的所有图像文件,以便逐个进行人脸检测和口罩分类。

Step 5: 执行人脸检测和口罩分类
faceMaskDetect.predict(faceDetector, classifier, image)方法同时使用人脸检测器faceDetector和分类器classifier,首先检测人脸位置,然后在检测到的人脸区域内进行口罩状态的分类。
Step 6: 保存检测结果
使用ImageUtils.saveBoundingBoxImage()方法,将检测结果绘制到图像上,并保存到build/output目录下。该方法会在图片上标注检测框及口罩状态,便于直观观察检测效果。

Step 7: 输出检测结果
使用日志记录检测结果,包含分类结果(“MASK” 或 “NO MASK”)、置信度、检测框的坐标和尺寸等信息。控制台示例输出如下:

运行效果示例

执行该代码后,在控制台中可以看到每张图片的检测结果,包括人脸位置和是否佩戴口罩的分类信息。以下是示例输出:

[INFO ] - [class: "MASK", probability: 0.95524, bounds: [x=0.415, y=0.234, width=0.319, height=0.425]
]
[INFO ] - [class: "MASK", probability: 0.99275, bounds: [x=0.274, y=0.226, width=0.412, height=0.523]
]
[INFO ] - [class: "MASK", probability: 0.99931, bounds: [x=0.489, y=0.289, width=0.234, height=0.443]
]
[INFO ] - [class: "NO MASK", probability: 0.99916, bounds: [x=0.489, y=0.311, width=0.171, height=0.395]
]
[INFO ] - [
]
[INFO ] - [class: "MASK", probability: 0.99964, bounds: [x=0.190, y=0.187, width=0.309, height=0.538]
]

检测效果图示例

以下展示了原图和检测后的效果图:

原图检测图
mask3mask3
mask6mask6

总结与优化建议

该系统能够精准地检测人脸并判断口罩佩戴状态,可应用于各类检测场景。可以根据实际需求,调整缩放比例scale和置信度阈值threshold以平衡速度和精度。
完整代码

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

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

相关文章

filebeat+elasticsearch+kibana日志分析

1 默认配置 1.1 filebeat filebeat-7.17.yml,从网关中下载k8s的配置&#xff0c;指定es和kibana的配置 通过kibana查询可以查询到日志了&#xff0c;但此时还不知道具体怎么用。 1.2 kibana 在Discover中创建索引格式&#xff1a;filebeat-*&#xff0c;得到如下图&#xf…

XGBoost Regressor --- 论文实战

一、前言 在《机器学习论文复现实战---linear regression》中通过Pearson 相关性分析,去除了2个高相关性特征 "PN" 和 "AN" ,数据维度变为890*25。(数据集地址) 这里我们不做任何前期处理,直接就将数据放入 XGBRegressor 模型中进行训练了。 二、模型…

MySQL表的增删改查(CRUD1)

好兄弟们&#xff0c;有没有忘了咱们上节说的知识点呢&#xff1f;忘了也没关系&#xff0c;让我们开始复习吧&#xff01;&#xff01;&#xff01; 上期我们介绍了数据类型&#xff0c;还有一些表的操作&#xff0c;我们常用的数据类型有&#xff1a;1.数值类型 tinyint …

C/C++ 知识点:声明与定义

文章目录 一、声明与定义1、声明&#xff08;Declaration&#xff09;2、定义&#xff08;Definition&#xff09;3、声明与定义的区别 前言&#xff1a; 在C编程中&#xff0c;声明&#xff08;declaration&#xff09;和定义&#xff08;definition&#xff09;是两个重要的概…

express搭建ts(TypeScript)运行环境

要在使用 TypeScript 的环境下运行一个简单的 Express 应用&#xff0c;可以使用 ts-node 直接运行 TypeScript 文件&#xff0c;而无需先将其编译为 JavaScript。以下是一个简单的示例&#xff0c;展示了如何设置和运行一个基本的 Express 应用。 步骤 1. 初始化项目&#x…

C++和OpenGL实现3D游戏编程【连载17】——着色器进阶(附源码)

🔥C++和OpenGL实现3D游戏编程【目录】 1、本节要实现的内容 在前面着色器初步一节我们了解了着色器的一些初步知识,通过顶点着色器和片段着色器显示出了一个彩色的立方体。我们这节课就来了解一些在着色器中显示纹理等一系列实用操作,同时了解一些进阶的图像渲染技术,比如…

【缓存与加速技术实践】Web缓存代理与CDN内容分发网络

文章目录 Web缓存代理Nginx配置缓存代理详细说明 CDN内容分发网络CDN的作用CDN的工作原理CDN内容的获取方式解决缓存集中过期的问题 Web缓存代理 作用&#xff1a; 缓存之前访问过的静态网页资源&#xff0c;以便在再次访问时能够直接从缓存代理服务器获取&#xff0c;减少源…

C++ | Leetcode C++题解之第520题检测大写字母

题目&#xff1a; 题解&#xff1a; class Solution { public:bool detectCapitalUse(string word) {// 若第 1 个字母为小写&#xff0c;则需额外判断第 2 个字母是否为小写if (word.size() > 2 && islower(word[0]) && isupper(word[1])) {return false;…

教育技术革新:SpringBoot在线试题库系统开发

2 相关技术 2.1 Spring Boot框架简介 Spring Boot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样板化的配置。通过这种方式&#xff0c;Sprin…

React + Vite + TypeScript + React router项目搭建教程

一、创建项目 运行项目 二、目录结构 项目目录&#xff1a; ├─node_modules //第三方依赖 ├─public //静态资源&#xff08;不参与打包&#xff09; └─src├─assets //静态资源├─components //组件├─config //配置├─http //请求方法封装├─layout //页面…

Android笔记(三十一):FrameLayout遇到的坑

背景 当FrameLayout里面是match_parent的时候&#xff0c;如果FrameLayout是wrap_content,则里面的view也会被当作wrap_content处理 原因 FrameLayout内的measureChildWithMargins -> getChildMeasureSpec的子类的MeasureSpec确定规则由父类的MeasureSpec和子类的LayoutP…

爬虫学习3

防盗链 #1.拿到conyId #2.拿到videoStatus返回的json.->srURL #srcURL里面的内容进行整理 #下载视频import requestsurl "https://www.pearvideo.com/video_1797054" contId url.split("_")[1]videoStatusUrl f"https://www.pearvideo.com/vi…

字典学习python

字典中的健可以添加&#xff0c;删除&#xff0c;但是不可以修改&#xff0c;只可以改后面的值 修改 字典名称[] value 若不存在健&#xff0c;那就添加&#xff0c;否则修改 pop删除&#xff0c;根据key实现对键值对&#xff0c;返回值是对应的value popitem返回值是一整个键…

QT-C++ 西门子snap7通讯库接口

QT-C 西门子snap7通讯库接口 一、核心程序1.头文件2.源文件 二、下载连接 一、核心程序 1.头文件 #pragma once #include <QObject> #include <QMutex> #include <QThread> #include "ToolSnapGlobal.h" #include "snap7.h" /* 特别说…

【设计模式】结构型模式(一):适配器模式、装饰器模式

结构型模式&#xff08;一&#xff09;&#xff1a;适配器模式、装饰器模式 1.适配器模式&#xff08;Adapter&#xff09;2.装饰器模式&#xff08;Decorator&#xff09;2.1 主要特点2.2 组成部分2.3 示例代码2.3.1 Component 组件2.3.2 ConcreteComponent 具体组件2.3.3 Dec…

认识物联网

新一代信息技术 物联网 物物相连的互联网&#xff0c;即物联网&#xff0c;又称传感器常见的传感器 • 温度传感器 • 压力传感器 • 声音传感器 • 02 • */08521 物联网概念 • 通过射频识别&#xff0c;红外传感器&#xff0c;全球定位系统GPS&#xff0c;激光扫描…

iOS 再谈KVC、 KVO

故事背景&#xff1a;大厂面试&#xff0c;又问道了基本的kvc kvo的原理和使用&#xff0c;由于转了前端&#xff0c;除了个setter和getter&#xff0c;我全忘记了&#xff0c;其实还是没有理解记忆&#xff0c;下面再看一下kvc 和kvo ,总结一个让人通过理解而无法忘记的方法&a…

07.适配器模式设计思想

07.适配器模式设计思想 目录介绍 01.适配器模式基础 1.1 适配器模式由来1.2 适配器模式定义1.3 适配器模式场景1.4 适配器模式思考 02.适配器模式实现 2.1 罗列一个场景2.2 用例子理解适配器2.3 适配器基本实现2.4 如何选择适配器 03.适配器模式分析 3.1 类适配器案例3.2 对象…

C语言 | Leetcode 题解之第535题TinyURL的加密与解密

题目&#xff1a; 题解&#xff1a; typedef struct {int key;char *val;UT_hash_handle hh; } HashItem;HashItem *dataBase NULL;char* encode(char* longUrl) {srand(time(0));int key;HashItem * pEntry NULL;while (true) {key rand();pEntry NULL;HASH_FIND_INT(dat…

Linux:线程安全的单例模式

设计模式 设计模式听上去是个很高贵的名词&#xff0c;其实就是是一套 多数人知晓、被反复使用、经过分类编目的、代码设计经验的总结&#xff0c;简称&#xff1a;对于编程比较典的场景的解决方案 单例模式 单例模式就是其中一种设计模式&#xff0c;是设计模式里的创建型模…