基于RV1126开发板的口罩识别算法开发

news2025/5/26 11:58:53

1. 口罩识别简介

       口罩识别是一种基于深度学习的判断人员有没有戴口罩的分类算法,能广泛的用于安防、生产安全等多种场景。本算法先基于人脸检测和人脸标准化获取的标准人脸,然后输入到口罩识别分类算法进行识别。

       本人脸检测算法在数据集表现如下所示:

口罩识别ACC
口罩分类验证集99.7%

       基于EASY-EAI-Nano硬件主板的运行效率:

算法种类运行效率
face_mask_judgement62ms

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;
}

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

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

相关文章

PyCharm显示主菜单和工具栏

显示主菜单 新版 PyCharm 是不显示主菜单的&#xff0c;要想显示主菜单和工具栏&#xff0c;则通过 “视图” → “外观” &#xff0c;勾选 “在单独的工具栏中显示主菜单” 和 “工具栏” 即可。 设置工具栏 此时工具栏里并没有什么工具&#xff0c;因此我们需要自定义工具…

Java工程行业管理软件源码 - 全面的项目管理工具 - 工程项目模块与功能一览

工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 项目背景 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;公司对内部工程管理的提升提…

Redis 高可用集群搭建与优化实践

在分布式系统中,缓存技术用于提升性能和响应速度。 Redis 作为一款高性能的键值存储系统,广泛应用于缓存、消息队列和会话管理等场景。随着业务规模的扩大,单机 Redis 的性能和可用性逐渐无法满足需求。 因此,搭建高可用的 Redis 集群可以解决这一问题。我将详细介绍 Red…

【AI大模型】基于阿里百炼大模型进行调用

目录 一、认识阿里云百炼 模型广场 创建自己的模型 二、AI扩图示例 1、开头服务、设置秘钥 2、选择HTTP方式调用流程 3、创建任务请求示例 4、发送http请求提交任务 5、查看任务进度的流程设计 6、后端查看任务进度代码 三、总结 大家好&#xff0c;我是jstart千语…

【神经网络结构的组成】深入理解 转置卷积与转置卷积核

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;《深度学习理论直觉三十讲》_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 …

MyBatis-plus笔记 (上)

简介 [MyBatis-Plus]&#xff08;简称 MP&#xff09;是一个 [MyBatis]的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 mybatis-plus总结&#xff1a; 注意&#xff1a;mybatis-puls仅局限于单表操作。 自动生成单表的C…

大模型微调数据集怎么搞?基于easydataset实现文档转换问答对json数据集!

微调的难点之一在与数据集。本文介绍一种将文档转换为问答数据集的方法&#xff0c;超级快&#xff01; 上图左侧是我的原文档&#xff0c;右侧是我基于文档生成的数据集。 原理是通过将文档片段发送给ollama本地模型&#xff0c;然后本地模型生成有关问题&#xff0c;并基于文…

opencv 灰度实验

opencv 灰度实验 1. 最大值法2. 平均值法3. 加权均值法4(直接读取灰度图)cv2.IMREAD_GRAYSCALE5内置将原图转换为灰度图cv2.cvtColor()6 两个极端的灰度值 灰度图与彩色图最大的不同就是&#xff1a;彩色图是由R、G、B三个通道组成&#xff0c;而灰度图只有一个通道&#xff0c…

高性能内存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里面的高可用体现在哪里&#xff1f; 3.1r…

【指纹浏览器系列-chromium编译】

本文提供了一步一步的指导来帮助读者在Windows环境下成功编译Chromium浏览器。涵盖了系统需求、开发环境搭建、代码下载及构建等关键步骤。 官方编译文档&#xff1a;https://github.com/chromium/chromium/blob/main/docs/windows_build_instructions.md 一、系统要求 一台…

Docker华为云创建私人镜像仓库

Docker华为云创建私人镜像仓库 在华为云官网的 产品 中搜索 容器镜像服务 &#xff1a; 或者在其他页面的搜索栏中搜索 容器镜像服务 &#xff1a; 进入到页面后&#xff0c;点击 创建组织 &#xff08;华为云的镜像仓库称为组织&#xff09;&#xff1a; 设置组织名字后&…

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 的详细解析&#xff0c;涵盖其作用、内容、历史背景及使用注意事项&#xff1a; 一、jce.jar 的核心作用 jce.jar 是 Java Cryptography Extension (JCE) 的核心实现库&#xff0c;提供 加密算法支持&#xff0c;包括&#xff1a; 对称加密&…

React 更新state中的对象

更新 state 中的对象 state 中可以保存任意类型的 JavaScript 值&#xff0c;包括对象。但是&#xff0c;你不应该直接修改存放在 React state 中的对象。相反&#xff0c;当你想要更新一个对象时&#xff0c;你需要创建一个新的对象&#xff08;或者将其拷贝一份&#xff09;…

算法思想之模拟

欢迎拜访&#xff1a;雾里看山-CSDN博客 本篇主题&#xff1a;算法思想之模拟 发布时间&#xff1a;2025.4.14 隶属专栏&#xff1a;算法 目录 算法介绍核心特点常见问题优化方向 例题替换所有的问号题目链接题目描述算法思路代码实现 提莫攻击题目链接题目描述算法思路代码实现…

测试基础笔记第四天(html)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 html介绍1. 介绍2.骨架标签3.常用标签标题标签段落标签超链接标签图片标签换行和空格标签布局标签input标签&#xff08;变形金刚&#xff09;form标签列表标签 htm…

WPF 中的元素继承层次结构 ,以下是对图中内容的详细说明:

顶层基类 DispatcherObject&#xff1a;处于继承体系最顶端&#xff0c;是一个抽象类。它为 WPF 元素提供了与 Dispatcher&#xff08;调度器&#xff09;交互的能力&#xff0c;Dispatcher 负责管理线程间的消息传递&#xff0c;确保 UI 操作在正确的线程&#xff08;通常是 …

十九、UDP编程和IO多路复用

1、UDP编程 服务端&#xff1a; #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、信任中心设置 打开【信任中心】&…

华为OD机试真题——攀登者2(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 A卷 200分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析&#xff1b; 并提供Java、python、JavaScript、C、C语言、GO六种语言的最佳实现方式&#xff01; 华为OD机试真题《攀登者2》&#xff1a; 目录 题目名称&#xff1a;攀登者2…