使用DJL和PaddlePaddle的口罩检测详细指南
使用DJL和PaddlePaddle的口罩检测详细指南
完整代码
该项目利用DJL和PaddlePaddle的预训练模型,构建了一个口罩检测应用程序。该应用能够在图片中检测人脸,并将每张人脸分类为“戴口罩”或“未戴口罩”。我们将深入分析代码的每个部分,以便清晰了解每一步。
代码关键组件
-
缩放比例和置信度阈值配置:
scale:控制图像缩放比例;值越小检测速度越快,但精度会降低。可根据应用场景的精度要求调整。threshold:设定检测结果的最低置信度,用于过滤低置信度的检测结果。
-
人脸和口罩检测模型的初始化:
- 初始化
FaceDetection用于定位人脸区域,FaceMaskDetect则用于对检测出的人脸区域进行口罩状态的分类。
- 初始化
-
模型加载和预测:
- 使用DJL的
ZooModel类加载人脸检测和口罩分类模型。人脸检测模型识别图像中的人脸区域,分类模型判断每张人脸是否佩戴口罩。 - 遍历资源目录中的所有图像文件,分别进行检测和分类,并将结果保存和记录。
- 使用DJL的
优化后的代码讲解
以下是代码的改进版本,加入了详细的注释来说明每一步的操作:
@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]
]
检测效果图示例
以下展示了原图和检测后的效果图:
| 原图 | 检测图 |
|---|---|
![]() | ![]() |
![]() | ![]() |
总结与优化建议
该系统能够精准地检测人脸并判断口罩佩戴状态,可应用于各类检测场景。可以根据实际需求,调整缩放比例scale和置信度阈值threshold以平衡速度和精度。
完整代码
相关文章:
使用DJL和PaddlePaddle的口罩检测详细指南
使用DJL和PaddlePaddle的口罩检测详细指南 完整代码 该项目利用DJL和PaddlePaddle的预训练模型,构建了一个口罩检测应用程序。该应用能够在图片中检测人脸,并将每张人脸分类为“戴口罩”或“未戴口罩”。我们将深入分析代码的每个部分,以便…...
基于stm32的多旋翼无人机(Multi-rotor UAV based on stm32)
在现代无人机技术中,多旋翼无人机因其稳定性和操控性而受到广泛应用。STM32微控制器因其强大的处理能力和丰富的外设接口,成为实现多旋翼无人机控制的理想选择。本文将详细介绍如何基于STM32实现多旋翼无人机的控制,包括硬件设计、软件设计和…...
第二十四章 v-model原理及v-model简化表单类组件封装
目录 一、v-model 原理 二、表单类组件封装 三、v-model简化组件封装代码 一、v-model 原理 原理:v-model本质上是一个语法糖。例如应用在输入框上,就是 value属性 和 input事件 的合写。 作用:提供数据的双向绑定 ① 数据变&#x…...
Java基于SpringBoot 的校园外卖点餐平台微信小程序(附源码,文档)
大家好,我是Java徐师兄,今天为大家带来的是Java基于SpringBoot 的校园外卖点餐平台微信小程序。该系统采用 Java 语言 开发,MySql 作为数据库,系统功能完善 ,实用性强 ,可供大学生实战项目参考使用。 博主介…...
细说STM32单片机USART中断收发RTC实时时间并改善其鲁棒性的方法
目录 一、工程目的 1、 目标 2、通讯协议及应对错误指令的处理目标 二、工程设置 三、程序改进 四、下载与调试 1、合规的指令 2、 proBuffer[0]不是# 3、proBuffer[4]不是; 4、指令长度小于5 5、指令长度大于5 6、proBuffer[2]或proBuffer[3]不是数字 7、;位于p…...
无人机场景 - 目标检测数据集 - 夜间车辆检测数据集下载「包含VOC、COCO、YOLO三种格式」
数据集介绍:无人机场景夜间车辆检测数据集,真实场景高质量图片数据,涉及场景丰富,比如夜间无人机场景城市道路行驶车辆图片、夜间无人机场景城市道边停车车辆图片、夜间无人机场景停车场车辆图片、夜间无人机场景小区车辆图片、夜…...
Dubbo 构建高效分布式服务架构
一、引言 随着软件系统的复杂性不断增加,传统的单体架构已经难以满足大规模业务的需求。分布式系统架构通过将系统拆分成多个独立的服务,实现了更好的可扩展性、可维护性和高可用性。在分布式系统中,服务之间的通信和协调是一个关键问题&…...
Unity XR Interaction Toolkit 开发教程(1):OpenXR 与 XRI 概述【3.0 以上版本】
文章目录 📕Unity XR 开发架构🔍底层插件(对接硬件)🔍高层 SDK(面向应用交互层) 📕OpenXR📕XR Interaction Toolkit🔍特点🔍XRI 能够实现的交互类…...
自扶正救生艇,保障水上救援的安全卫士_鼎跃安全
在应急事件中,自扶正救生艇能够发挥关键的救援和保障作用,确保救援人员和被困人员的生命安全,尤其在极端天气或突发水上事故中展现出明显优势。 在救援过程中如果遭遇翻船,救生艇能够迅速恢复正常姿态,确保救援人员不会…...
《Qwen2-VL》论文精读【下】:发表于2024年10月 Qwen2-VL 迅速崛起 | 性能与GPT-4o和Claude3.5相当
1 前言 《Qwen2-VL》论文精读【上】:发表于2024年10月 Qwen2-VL 迅速崛起 | 性能与GPT-4o和Claude3.5相当 上回详细分析了Qwen2-VL的论文摘要、引言、实验,下面继续精读Qwen2-VL的方法部分。 文章目录 1 前言2 方法2.1 Model Architecture2.2 改进措施2…...
WebSocket消息帧的组成结构
WebSocket消息帧是WebSocket协议中的一个基本单位,它定义了数据在客户端和服务器之间传递的格式。每个数据帧包含了不同类型的数据和各种控制信息。以下是WebSocket消息帧的组成结构: WebSocket 帧结构 FIN、RSV1、RSV2、RSV3 和 opcode(第一…...
如何利用低代码开源框架实现高效开发?
随着数字化转型步伐的加快,越来越多的企业开始关注提高软件开发效率的方法。低代码平台因其能够大幅减少编码量而受到欢迎,而开源框架则因其灵活性和社区支持成为开发者的首选。如何利用低代码开源框架实现高效开发,成为许多企业和开发者面临…...
使用 RabbitMQ 有什么好处?
大家好,我是锋哥。今天分享关于【使用 RabbitMQ 有什么好处?】面试题。希望对大家有帮助; 使用 RabbitMQ 有什么好处? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 RabbitMQ 是一种流行的开源消息代理,广…...
机器学习周报(RNN的梯度消失和LSTM缓解梯度消失公式推导)
文章目录 摘要Abstract 1 RNN的梯度消失问题2 LSTM缓解梯度消失总结 摘要 在深度学习领域,循环神经网络(Recurrent Neural Network, RNN)被广泛应用于处理序列数据,特别是在自然语言处理、时间序列预测等任务中。然而,…...
一篇文章理解前端中的 File 和 Blob
概述: js处理文件、二进制数据和数据转换的时候,提供了一些API和对象,例如:File、Blob、FileReader、ArraryBuffer、Base64、Object URL 和 DataURL。现在主要介绍File和Blob这两个对象。 1.Blob介绍 在js中,Blob&am…...
串口屏控制的自动滑轨(未完工)
序言 疫情期间自己制作了一个自动滑轨,基于无线遥控的,但是整体太大了,非常不方便携带,所以重新设计了一个新的,以2020铝型材做导轨的滑轨,目前2020做滑轨已经很成熟了,配件也都非常便宜&#x…...
DFA算法实现敏感词过滤
DFA算法实现敏感词过滤 需求:检测一段文本中是否含有敏感词。 比如检测一段文本中是否含有:“滚蛋”,“滚蛋吧你”,“有病”, 可使用的方法有: 遍历敏感词,判断文本中是否含有这个敏感词。 …...
Python自动化运维:技能掌握与快速入门指南
#编程小白如何成为大神?大学生的最佳入门攻略# 在当今快速发展的IT行业中,Python自动化运维已经成为了一个不可或缺的技能。本文将为您详细介绍Python自动化运维所需的技能,并提供快速入门的资源,帮助您迅速掌握这一领域。 必备…...
在linux系统中安装pygtftk软件
1.下载和安装 网址: https://dputhier.github.io/pygtftk/index.html ## 手动安装 git clone http://gitgithub.com:dputhier/pygtftk.git pygtftk cd pygtftk # Check your Python version (>3.8,<3.9) pip install -r requirements.txt python setup.py in…...
decodeURIComponentSafe转义%问题记录URI malformed
decodeURIComponentSafe转义%问题记录 问题背景 当我们解析包涵 % 字符的字符串时,会出现错误如下 Uncaught URIError: URI malformed 解决方案: function decodeURIComponentSafe(s) {if (!s) {return s;}return decodeURIComponent(s.replace(/%(?…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...



