基于RV1126开发板的口罩识别算法开发
1. 口罩识别简介
口罩识别是一种基于深度学习的判断人员有没有戴口罩的分类算法,能广泛的用于安防、生产安全等多种场景。本算法先基于人脸检测和人脸标准化获取的标准人脸,然后输入到口罩识别分类算法进行识别。
本人脸检测算法在数据集表现如下所示:
| 口罩识别 | ACC |
| 口罩分类验证集 | 99.7% |
基于EASY-EAI-Nano硬件主板的运行效率:
| 算法种类 | 运行效率 |
| face_mask_judgement | 62ms |
2. 快速上手
2.1 开发环境准备
如果您初次阅读此文档,请阅读《入门指南/开发环境准备/Easy-Eai编译环境准备与更新》,并按照其相关的操作,进行编译环境的部署。
在PC端Ubuntu系统中执行run脚本,进入EASY-EAI编译环境,具体如下所示。
cd ~/develop_environment
./run.sh

2.2 源码下载以及例程编译
在EASY-EAI编译环境下创建存放源码仓库的管理目录:
cd /opt
mkdir EASY-EAI-Toolkit
cd EASY-EAI-Toolkit
通过git工具,在管理目录内克隆远程仓库
git clone https://github.com/EASY-EAI/EASY-EAI-Toolkit-C-Demo.git

注:
* 此处可能会因网络原因造成卡顿,请耐心等待。
* 如果实在要在gitHub网页上下载,也要把整个仓库下载下来,不能单独下载本实例对应的目录。
进入到对应的例程目录执行编译操作,具体命令如下所示:
cd EASY-EAI-Toolkit-C-Demo/algorithm-face_mask_judgement/
./build.sh cpres
注:
* 若build.sh脚本带有cpres参数,则会把Release/目录下的所有资源都拷贝到开发板上。
* 若build.sh脚本不带任何参数,则仅会拷贝demo编译出来的可执行文件。
* 由于依赖库部署在板卡上,因此交叉编译过程中必须保持adb连接。

2.3 模型部署
要完成算法Demo的执行,需要先下载人脸检测算法模型。
百度网盘链接为:https://pan.baidu.com/s/1cxnx1T0ldJvoqkyTk1RmUg(提取码:0b6h )。

也要下载口罩识别算法模型。
百度网盘链接为:https://pan.baidu.com/s/1KdytlkahhNptp7Gz2eGG0Q (提取码:2sdg )。

同时需要把下载的人脸检测算法模型复制粘贴到Release/目录:

再通过下方命令将模型署到板卡中,如下所示。
cp ./Release/*.model /mnt/userdata/Demo
2.4 例程运行
通过按键Ctrl+Shift+T创建一个新窗口,执行adb shell命令,进入板卡运行环境。
adb shell

进入板卡后,定位到例程上传的位置,如下所示:
cd /userdata/Demo
运行例程命令如下所示:
./test-face-mask-judgement 1.jpg
2.5 运行效果
face-mask-judgement的Demo执行效果如下所示:

再开一个窗口,在PC端Ubuntu环境通过以下命令可以把图片拉回来:
adb pull /userdata/Demo/result.jpg .
结果图片如下所示,戴口罩标绿色框:

API的详细说明,以及API的调用(本例程源码),详细信息见下方说明。
3. 人脸检测API说明
3.1 引用方式
为方便客户在本地工程中直接调用我们的EASY EAI api库,此处列出工程中需要链接的库以及头文件等,方便用户直接添加。
| 选项 | 描述 |
| 头文件目录 | easyeai-api/algorithm_api/face_detect |
| 库文件目录 | easyeai-api/algorithm_api/face_detect |
| 库链接参数 | -lface_detect -lface_alignment -lpthread -lrknn_api |
3.2 人脸检测初始化函数
设置人脸检测初始化函数原型如下所示。
int face_detect_init(rknn_context *ctx, const char *path)
具体介绍如下所示。
| 函数名:face_detect_init() | |
| 头文件 | face_detect.h |
| 输入参数 | ctx:rknn_context句柄 |
| path:算法模型的路径 | |
| 返回值 | 成功返回:0 |
| 失败返回:-1 | |
| 注意事项 | 无 |
3.3 人脸检测运行函数
设face_detect_run原型如下所示。
int face_detect_run(rknn_context ctx, cv::Mat &input_image, std::vector<det> &result)
具体介绍如下所示。
| 函数名: face_detect_run () | |
| 头文件 | face_detect.h |
| 输入参数 | ctx: rknn_context句柄 |
| input_image:Opencv Mat格式图像 | |
| result:人脸检测的结果输出 | |
| 返回值 | 成功返回:0 |
| 失败返回:-1 | |
| 注意事项 | 无 |
3.4 人脸检测释放函数
人脸检测释放函数原型如下所示。
int face_detect_release(rknn_context ctx)
具体介绍如下所示。
| 函数名: face_detect_release () | |
| 头文件 | face_detect.h |
| 输入参数 | face_detect.h |
| 返回值 | 成功返回:0 |
| 失败返回:-1 | |
| 注意事项 | 无 |
4. 口罩识别API说明
4.1 引用方式
为方便客户在本地工程中直接调用我们的EASY EAI api库,此处列出工程中需要链接的库以及头文件等,方便用户直接添加。
| 选项 | 描述 |
| 头文件目录 | easyeai-api/algorithm_api/face_mask_judgement |
| 库文件目录 | easyeai-api/algorithm_api/face_mask_judgement |
| 库链接参数 | -lface_alignment -lface_mask_judgement -lpthread -lrknn_api |
4.2 口罩识别初始化函数
设置人脸检测初始化函数原型如下所示。
int face_mask_judgement_init(rknn_context *ctx, const char * path)
具体介绍如下所示。
| 函数名: face_mask_judgement_init() | |
| 头文件 | face_mask_judgement.h |
| 输入参数 | ctx:rknn_context句柄 |
| path:算法模型的路径 | |
| 返回值 | 成功返回:0 |
| 失败返回:-1 | |
| 注意事项 | 无 |
4.3 口罩识别执行函数
设face_pose_estimation_run原型如下所示。
int face_mask_judgement_run(rknn_context ctx, cv::Mat *face_image, float *result)
具体介绍如下所示。
| 函数名: face_mask_judgement_run () | |
| 头文件 | face_landmark98.h |
| 输入参数 | ctx: rknn_context句柄 |
| face_image:图像数据输入(cv::Mat是Opencv的类型) | |
| result: 算法输出的二分类概率结果 | |
| 返回值 | 成功返回:0 |
| 失败返回:-1 | |
| 注意事项 | 无 |
4.4 口罩识别释放函数
口罩识别释放函数原型如下所示。
int face_mask_judgement_release(rknn_context ctx)
具体介绍如下所示。
| 函数名:face_mask_judgement_release () | |
| 头文件 | face_mask_judgement.h |
| 输入参数 | ctx: rknn_context句柄 |
| 返回值 | 成功返回:0 |
| 失败返回:-1 | |
| 注意事项 | 无 |
5. 口罩识别算法例程
例程目录为Toolkit-C-Demo/algorithm-face_mask_judgement/test-face-mask-judgement.cpp,操作流程如下。

参考例程如下所示。
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <fstream>
#include <iostream>
#include <fstream>
#include <atomic>
#include <queue>
#include <thread>
#include <mutex>
#include <chrono>
#include <sys/time.h>
#include <sys/stat.h>
#include <dirent.h>
#include <unistd.h>#include <opencv2/opencv.hpp>#include <unistd.h>
#include <sys/syscall.h>
#include "face_detect.h"
#include "face_alignment.h"
#include "face_mask_judgement.h"using namespace std;
using namespace cv;int main(int argc, char **argv)
{if( argc != 2){printf("./test-face-mask-judgement xxx.jpg \n");return -1;}rknn_context detect_ctx, mask_judge_ctx;std::vector<det> detect_result;float mask_result[2];int ret;cv::Mat src;src = cv::imread(argv[1], 1);/* 人脸检测初始化 */ret = face_detect_init(&detect_ctx, "./face_detect.model");if( ret < 0){printf("face_detect_init fail! ret=%d\n", ret);return -1;}/* 人脸戴口罩判断初始化 */ret = face_mask_judgement_init(&mask_judge_ctx, "./face_mask_judgement.model");if( ret < 0){printf("face_mask_judgement_init fail! ret=%d\n", ret);return -1;}/* 人脸检测执行 */face_detect_run(detect_ctx, src, detect_result);for( int i=0; i < (int)detect_result.size() ; i++ ){Point2f points[5];for (int j = 0; j < (int)detect_result[i].landmarks.size(); ++j) {points[j].x = (int)detect_result[i].landmarks[j].x;points[j].y = (int)detect_result[i].landmarks[j].y;}Mat face_algin;face_algin = face_alignment(src, points);/* 人脸戴口罩判断运行 */face_mask_judgement_run(mask_judge_ctx, &face_algin, mask_result);printf("normal_face possibility:%f\n", mask_result[0]);printf("masked_face possibility:%f\n", mask_result[1]); int x = (int)(detect_result[i].box.x);int y = (int)(detect_result[i].box.y);int w = (int)(detect_result[i].box.width);int h = (int)(detect_result[i].box.height);if( mask_result[0] > 0.6 ){rectangle(src, Rect(x, y, w, h), Scalar(0, 0, 255), 2, 8, 0);}else{rectangle(src, Rect(x, y, w, h), Scalar(0, 255, 0), 2, 8, 0);}}imwrite("result.jpg", src);/* 人脸检测释放 */face_detect_release(detect_ctx);/* 人脸戴口罩判断释放 */face_mask_judgement_release(mask_judge_ctx);return 0;
}
相关文章:
基于RV1126开发板的口罩识别算法开发
1. 口罩识别简介 口罩识别是一种基于深度学习的判断人员有没有戴口罩的分类算法,能广泛的用于安防、生产安全等多种场景。本算法先基于人脸检测和人脸标准化获取的标准人脸,然后输入到口罩识别分类算法进行识别。 本人脸检测算法在数据集表现如下所示&am…...
PyCharm显示主菜单和工具栏
显示主菜单 新版 PyCharm 是不显示主菜单的,要想显示主菜单和工具栏,则通过 “视图” → “外观” ,勾选 “在单独的工具栏中显示主菜单” 和 “工具栏” 即可。 设置工具栏 此时工具栏里并没有什么工具,因此我们需要自定义工具…...
Java工程行业管理软件源码 - 全面的项目管理工具 - 工程项目模块与功能一览
工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 项目背景 随着公司的快速发展,企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性,公司对内部工程管理的提升提…...
Redis 高可用集群搭建与优化实践
在分布式系统中,缓存技术用于提升性能和响应速度。 Redis 作为一款高性能的键值存储系统,广泛应用于缓存、消息队列和会话管理等场景。随着业务规模的扩大,单机 Redis 的性能和可用性逐渐无法满足需求。 因此,搭建高可用的 Redis 集群可以解决这一问题。我将详细介绍 Red…...
利用多GPU计算探索量子无序及AI拓展
量子无序系统的领域是凝聚态物理学中一个引人入胜的前沿。与它们完全有序的对应物不同,这些材料表现出量子力学和内在随机性的复杂相互作用,导致了许多令人着迷且常常难以理解的行为。量子自旋玻璃就是一个典型的例子,在这种系统中࿰…...
【AI大模型】基于阿里百炼大模型进行调用
目录 一、认识阿里云百炼 模型广场 创建自己的模型 二、AI扩图示例 1、开头服务、设置秘钥 2、选择HTTP方式调用流程 3、创建任务请求示例 4、发送http请求提交任务 5、查看任务进度的流程设计 6、后端查看任务进度代码 三、总结 大家好,我是jstart千语…...
【神经网络结构的组成】深入理解 转置卷积与转置卷积核
🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀《深度学习理论直觉三十讲》_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 …...
数据战略新范式:从中台沉淀到服务觉醒,SQL2API 如何重塑数据价值链条?
一、数据中台退烧:从 “战略神话” 到 “现实拷问” 曾几何时,数据中台被视为企业数字化转型的 “万能解药”,承载着统一数据资产、打破业务壁垒的厚望。然而,大量实践暴露出其固有缺陷:某零售企业投入 500 万元建设中…...
Docker 代理配置全攻略:从入门到企业级实践
Docker 代理配置终极指南:从原理到实践 在企业环境中,Docker 的网络访问常常需要通过代理来完成,例如拉取镜像或在容器内访问外部网络。本文将从核心流程、配置方法到验证步骤,全面解析 Docker 代理的配置方式,助你轻…...
MyBatis-plus笔记 (上)
简介 [MyBatis-Plus](简称 MP)是一个 [MyBatis]的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 mybatis-plus总结: 注意:mybatis-puls仅局限于单表操作。 自动生成单表的C…...
大模型微调数据集怎么搞?基于easydataset实现文档转换问答对json数据集!
微调的难点之一在与数据集。本文介绍一种将文档转换为问答数据集的方法,超级快! 上图左侧是我的原文档,右侧是我基于文档生成的数据集。 原理是通过将文档片段发送给ollama本地模型,然后本地模型生成有关问题,并基于文…...
opencv 灰度实验
opencv 灰度实验 1. 最大值法2. 平均值法3. 加权均值法4(直接读取灰度图)cv2.IMREAD_GRAYSCALE5内置将原图转换为灰度图cv2.cvtColor()6 两个极端的灰度值 灰度图与彩色图最大的不同就是:彩色图是由R、G、B三个通道组成,而灰度图只有一个通道,…...
安卓基础(无障碍)
配置无障碍服务 在 res/xml 目录下创建一个 accessibility_service_config.xml 文件,用于配置无障碍服务的相关信息,例如要监听的事件类型、反馈类型等。 <?xml version"1.0" encoding"utf-8"?> <!-- 这行代码告诉电脑…...
解决在linux下运行rust/tauri项目出现窗口有内容,但是渲染出来成纯黑问题
起因 最近折腾了一下rust/tauri程序开发,据说这玩意性能非常牛皮就玩了一下,但是我运行打包一直出现一个奇怪问题,窗口能正常打开,但是是纯黑的什么内容都没有,鼠标移上去又发现指针会变换(看起来是内容又…...
高性能内存kv数据库Redis(续)
目录 四.主从同步与对象模型 1.Redis 淘汰策略 2.Redis 如何做到 持久化 2.1 redis为什么要实现持久化 2.2fork进程的写时复制机制 2.3大Key的影响 2.4redis做持久化的方式 2.5 aof 2.6 rdb 2.7 redis 持久化方式的优缺点 3.redis里面的高可用体现在哪里? 3.1r…...
从0到1构建企业级消息系统服务体系(一):产品架构视角下的高并发设计与动态响应能力建设
从0到1构建企业级消息系统服务体系(一):产品架构视角下的高并发设计与动态响应能力建设 | 从今天开始将持续更新此专题下的文章,讲述从产品角度是如何从0-1的构建一个企业级的消息系统,从系统架构设计、产品架构设计&…...
ElasticSearch中常用的数据类型
一、映射 Elasticsearch中通过映射来指定字段的数据类型,映射方式有2种,静态映射和动态映射。 1.动态映射 使用动态映射时,无须指定字段的数据类型,Elasticshearch会自动根据字段内容来判断映射到哪个数据类型。 比如ÿ…...
【go】--编译
go build -o [编译完成的可执行文件] [需要编译的.go文件]#例如 go build -o myapp main.go#确保编译的结果和当前运行环境相同 #查看arch uname -a在 Linux 中查看和修改 GOOS 和 GOARCH 环境变量: 1. 查看当前 Go 环境变量 # 查看所有Go相关的环境变量 go env# …...
【指纹浏览器系列-chromium编译】
本文提供了一步一步的指导来帮助读者在Windows环境下成功编译Chromium浏览器。涵盖了系统需求、开发环境搭建、代码下载及构建等关键步骤。 官方编译文档:https://github.com/chromium/chromium/blob/main/docs/windows_build_instructions.md 一、系统要求 一台…...
Docker华为云创建私人镜像仓库
Docker华为云创建私人镜像仓库 在华为云官网的 产品 中搜索 容器镜像服务 : 或者在其他页面的搜索栏中搜索 容器镜像服务 : 进入到页面后,点击 创建组织 (华为云的镜像仓库称为组织): 设置组织名字后&…...
Ubuntu 22.04安装MySQL : Qwen2.5 模型对话数据收集与微调教程
在Ubuntu 22.04安装MySQL的教程请点击下方链接进行参考: 点击这里获取MySQL安装教程 今天将为大家带来如何微调Qwen2.5模型并连接数据库进行对话的教程。快跟着小编一起试试吧~ 1 大模型 Qwen2.5 微调步骤 1.1 从 github 仓库 克隆项目 克隆存储库:#拉取代码 git clo…...
关于 JDK 中的 jce.jar 的详解,以及与之功能类似的主流加解密工具的详细对比分析
以下是关于 JDK 中的 jce.jar 的详细解析,涵盖其作用、内容、历史背景及使用注意事项: 一、jce.jar 的核心作用 jce.jar 是 Java Cryptography Extension (JCE) 的核心实现库,提供 加密算法支持,包括: 对称加密&…...
React 更新state中的对象
更新 state 中的对象 state 中可以保存任意类型的 JavaScript 值,包括对象。但是,你不应该直接修改存放在 React state 中的对象。相反,当你想要更新一个对象时,你需要创建一个新的对象(或者将其拷贝一份)…...
【嵌入式八股4】C++:引用、模板、哈希表与 I/O
1. 左值引用与右值引用 左值与右值的定义 左值:指那些可以在表达式后取得地址的对象。换句话说,左值代表一个可以出现在赋值号()左边的值,也可以被修改。例如,变量、数组元素、以及通过引用或指针访问的对…...
算法思想之模拟
欢迎拜访:雾里看山-CSDN博客 本篇主题:算法思想之模拟 发布时间:2025.4.14 隶属专栏:算法 目录 算法介绍核心特点常见问题优化方向 例题替换所有的问号题目链接题目描述算法思路代码实现 提莫攻击题目链接题目描述算法思路代码实现…...
测试基础笔记第四天(html)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 html介绍1. 介绍2.骨架标签3.常用标签标题标签段落标签超链接标签图片标签换行和空格标签布局标签input标签(变形金刚)form标签列表标签 htm…...
WPF 中的元素继承层次结构 ,以下是对图中内容的详细说明:
顶层基类 DispatcherObject:处于继承体系最顶端,是一个抽象类。它为 WPF 元素提供了与 Dispatcher(调度器)交互的能力,Dispatcher 负责管理线程间的消息传递,确保 UI 操作在正确的线程(通常是 …...
十九、UDP编程和IO多路复用
1、UDP编程 服务端: #include<stdio.h> #include <arpa/inet.h> #include<stdlib.h> #include<string.h> #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #include <pthread.h> #include &l…...
DeepSeek使用001:Word中配置DeepSeek AI的V3和R1模型
文章目录 Word中配置DeepSeek大模型1、勾选开发工具2、信任中心设置3、添加DeepSeek-V3模型4、获取API KEY5、添加DeepSeek-R1模型6、新建组7、测试使用 Word中配置DeepSeek大模型 1、勾选开发工具 打开【选项】 选择【自定义功能区】 2、信任中心设置 打开【信任中心】&…...
linux tracepoint系列宏定义(TRACE_EVENT,DEFINE_TRACE等)展开过程分析之三 define_trace.h头文件
在linux tracepoint系列宏定义(TRACE_EVENT,DEFINE_TRACE等)展开过程分析之二 文章中,我们知道trace-events-sample.h 文件在包含了tracepoint.h后第一次对TRACE_EVENT(...)等系列宏定义进行了展开,主要是构建tracepoint 调用钩子函数,注册/注销函数。展开的第二阶段…...
