使用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以平衡速度和精度。
完整代码

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

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

相关文章

【go从零单排】go三种结构体:for循环、if-else、switch

Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 for循环是go语言唯一的循环语句&#xff0c;没错&#xff0c;在go中再也不会看到while true package mainimport …

python怎么去掉换行符

换行符与其他字符并没有区别&#xff0c;由于换行符总是最后一个字符&#xff0c;所以直接选择除去最后一个字符的所有字符即可。 x abc\n x[:-1] 也可以使用字符串的strip()方法 但是strip()方法除了会去掉换行符&#xff0c;还会去掉空格等其他字符。 x.strip()

集中管理用户名和密码,定期修改密码快捷方便

在运维工作中&#xff0c;凭证管理是一项至关重要的任务。随着系统复杂性的增加和安全性要求的提高&#xff0c;如何有效地管理用户名和密码成为了运维团队面临的一大挑战。本文将介绍新版本中的凭证管理功能&#xff0c;并探讨其在运维行业中的应用和最佳实践。 一、凭证管理…

十年码农的编程心得分享

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

Elasticsearch中时间字段格式用法详解

Elasticsearch中时间字段格式用法详解 攻城狮Jozz关注IP属地: 北京 2024.03.18 16:27:51字数 758阅读 2,571 Elasticsearch&#xff08;简称ES&#xff09;是一个基于Lucene构建的开源、分布式、RESTful搜索引擎。它提供了全文搜索、结构化搜索以及分析等功能&#xff0c;广泛…

【研究报告】2024年中国工业大模型行业发展研究报告

需要行业报告PDF的朋友请点击下方免费获取 报告聚焦于中国工业大模型的发展现状&#xff0c;详细分析了其在工业领域的应用与前景。工业大模型借助人工智能技术优化了制造流程、提升了生产效率&#xff0c;尤其在能源、制造、自动化等领域取得了显著成果。报告指出&#xff0c…

PLC单键启停控制的多种写法

题目&#xff1a;编写程序&#xff0c;实现当按下SB1按钮奇数次&#xff0c;灯亮&#xff1b;当按下SB1按钮偶数次&#xff0c;灯灭&#xff0c;即单键启停控制&#xff0c;设计梯形图。 解法一&#xff1a;使用标志位进行自锁互锁 &#xff08;1&#xff09;刚上电&#xff0c…

vit及其变体(swin Deit)

参考&#xff1a;https://www.zhihu.com/question/538049269/answer/2773898603 ViT模型变体&#xff1a;DeiT模型&#xff08;Data-Efficient Image Transformer&#xff09;&#xff1b;Swin Transformer模型 &#xff08;Shifted Windows Transformer&#xff09;&#xff1…

盲盒潮玩小程序,盲盒市场的巨大商业机遇!

近几年&#xff0c;盲盒展现出了强劲的发展态势&#xff0c;成为了消费者热衷的娱乐消费方式&#xff0c;各种大热IP在市场中大放异彩&#xff01;在网络中&#xff0c;关于盲盒的讨论度更是持续火热&#xff0c;显而易见&#xff0c;盲盒成为了一个不容小觑的行业&#xff01;…

聊一聊Elasticsearch的索引的分片分配机制

1、什么是分片分配 分片分配是由ES主节点将索引分片移动到ES集群中各个节点上的过程。 该过程尽量保证&#xff0c;同一个索引的分片尽量分配到更多的节点上&#xff0c;以此来达到读写索引的时候可以利用更多硬件资源的效果。 在分配过程当中&#xff0c;也不能将某个主分片…

DAY21|二叉树Part08|LeetCode: 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

目录 LeetCode: 669. 修剪二叉搜索树 基本思路 C代码 LeetCode: 108.将有序数组转换为二叉搜索树 基本思路 C代码 LeetCode: 538.把二叉搜索树转换为累加树 基本思路 C代码 LeetCode: 669. 修剪二叉搜索树 力扣代码链接 文字讲解&#xff1a;LeetCode: 669. 修剪二叉搜…

Halcon edges_sub_pix

1、算子帮助文档 edges_sub_pix 使用递归实现的滤波器&#xff08;根据Deriche、Lanser和Shen的方法&#xff09;或Canny提出的常规实现的“高斯导数”滤波器&#xff08;使用滤波器掩模&#xff09;来检测阶梯边缘。因此&#xff0c;以下边缘算子可用于滤波器&#xff1a; der…

SpringBoot配置Rabbit中的MessageConverter对象

SpringAMQP默认使用SimpleMessageConverter组件对消息内容进行转换 SimpleMessageConverter&#xff1a; only supports String, byte[] and Serializable payloads仅仅支持String、Byte[]和Serializable对象Jackson2JsonMessageConverter&#xff1a;was expecting (JSON Str…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-30

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-30 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-30目录1. Step Guided Reasoning: Improving Mathematical Reasoning using Guidance Generation and Step Reasoning摘要研究背…

LabVIEW在Windows和Linux开发的差异

LabVIEW广泛应用于工程和科研领域的自动化和测量控制系统开发&#xff0c;其在Windows和Linux平台上的开发环境有所不同。这些差异主要体现在操作系统兼容性、硬件支持、软件库和驱动程序、实时系统开发以及部署选择上。以下从各个方面详细对比分析LabVIEW在Windows与Linux系统…

大模型日报|7 篇必读的大模型论文

大家好&#xff0c;今日必读的大模型论文来啦&#xff01; 1.加州大学团队推出“罕见病”大模型 Zebra-Llama 罕见病为医疗保健带来了独特的挑战&#xff0c;通常会出现诊断延迟和信息分散的情况。这些疾病的可靠知识稀缺&#xff0c;给大语言模型&#xff08;LLM&#xff09…

Docker篇(基础命令)

目录 一、启动与停止 二、镜像相关的命令 1. 查看镜像 2. 搜索镜像 3. 拉取镜像 4. 删除镜像 三、容器创建与启动容器 1. 查看容器 2. 创建容器 交互式方式创建容器 守护式方式创建容器 3. 容器启动与停止 四、容器操作命令 1. 文件拷贝 2. 目录&#xff08;文件…

网络安全认证的证书有哪些?

在网络安全领域&#xff0c;专业认证不仅是个人技术能力的象征&#xff0c;也是职业发展的重要推动力。随着网络安全威胁的日益严峻&#xff0c;对网络安全专业人才的需求也在不断增长。本文将介绍一些网络安全认证的证书&#xff0c;帮助有志于从事网络安全行业的人士了解并选…

论文阅读笔记:Image Processing GNN: Breaking Rigidity in Super-Resolution

论文阅读笔记&#xff1a;Image Processing GNN: Breaking Rigidity in Super-Resolution 1 背景2 创新点3 方法4 模块4.1 以往SR模型的刚性4.2 图构建4.2.1 度灵活性4.2.2 像素节点灵活性4.2.3 空间灵活性 4.3 图聚合4.4 多尺度图聚合模块MGB4.5 图聚合层GAL 5 效果5.1 和SOTA…

tomato靶机

下载tomato地址:https://vulnhub.com/entry/tomato-1,557/ 直接拖进虚拟机中 tomato靶机和kali虚拟机必须在同一网段所以使用nat模式 扫描主机 arp-scan -I eth0 -l 发现新主机ip 192.168.142.147 nmap扫描端口 namp -p- -A -T4 --min-rate10000 192.168.142.147 有用的信息…