适合rv1109+rv1126使用基于RKmedia的人脸和车牌识别的SDK及使用介绍说明

news2024/11/28 10:46:20

基于RKmedia开发的人脸识别和车牌识别SDK简介及使用

一、功能简介

SDK下载:https://download.csdn.net/download/DeepLearning_/87272848

人脸检测&识别

对于人脸部分,SDK 提供了以下能力:

1. 人脸检测

1.1 人脸是否带口罩判定
1.2 人脸角度检测

以闸口戴口罩检测为例,Demo 结果如下图所示:
在这里插入图片描述

在这里插入图片描述

2. 人脸识别

2.1 1:1 识别
2.2 1:N 识别

我们在底库中加入中国足球运动员武磊的照片,并使用3张包含他的集体照进行人脸识别测试,如下:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3. 用户重识别

车牌检测&识别

对于车牌部分,SDK 提供了以下能力:

  1. 车辆检测
  2. 车牌检测(蓝牌、绿牌、黄牌[含双层黄牌]、白牌、黑牌等)
  3. 车牌识别

以十字路口灯杆拍摄场景为例,Demo 结果如下图所示:

在这里插入图片描述

目录结构

  • SDK 目录结构

SDK 包的内容如下:

--- [face_recog_lib_rk]
   +--- Makefile
   +--- face_sdk.cpp / face_sdk.h - 人脸识别 SDK 二次封装,使用该封装即可完成图片的人脸检测、特征提取需求
   +--- face_demo.cpp - 基于二次封装的一个 Demo 程序,实现从 ../data/users 目录读取图片并作为底库,再从 ../data/images 读取图片进行人脸检索的功能,检测结果将以图片形式输出到 ../data/images_result 目录
   +--- plate_sdk.cpp / plate_sdk.h - 车牌识别 SDK 二次封装,配置参数针对街景识别
   +--- plate_demo.cpp - 基于二次封装的一个 Demo 程序,实现从 ../data/plates 目录读取图片进行车牌检索及识别的功能,检测结果将以图片形式输出到 ../data/plates_result 目录
   +--- similarity_transform.cpp
   +--- [include] - 人脸/车牌 SDK 的头文件
   +--- [lib64] - 人脸/车牌 SDK 在 AARCH64 上的动态库
   +--- [3rdparty]
      +--- [include] - 需要引入的第三方头文件
      +--- [lib64] - 编译需要的第三方动态库
  • Demo 目录结构

Demo 包的内容如下,使用时需放在 7G 盒子中的 /userdata/ 目录下

--- [userdata] - /userdata 系统目录
   +-- [face_app]
      +--- [3rdparty] - 执行 Demo 需要的第三方动态库,因为有些 RK 环境下部署的 Buildroot 版本的本地库有部分缺失,因此需在 LD_LIBRARY_PATH 中指定优先使用本目录下的动态库
      +--- [assets] - 人脸&车牌 SDK 的模型文件
      +--- [data]
         +--- [users] - 如前文 face_demo.cpp 介绍,此目录存放人脸底库图片
         +--- [images] - 人脸检测任务图片
         +--- [images_result] - 人脸检测结果
         +--- [plates] - 车牌识别任务图片
         +--- [plates_result] - 车牌识别结果
      +--- [lib] - 人脸 SDK 的动态库
      +--- [bin] - face_demo 可执行程序
         +--- face_demo_license.key - 跟设备绑定的 License
         +--- face_demo
         +--- run_face_demo.sh - 指定 LD_LIBRARY_PATH 并启动 face_demo 的脚本。进入该目录直接执行该脚本,可快速验证人脸检测&识别的 Demo
         +--- plate_demo
         +--- run_plate_demo.sh - 指定 LD_LIBRARY_PATH 并启动 plate_demo 的脚本。进入该目录直接执行该脚本,可快速验证车牌检测&识别的 Demo

快速验证

face_demo_{date}.tar 部署到 IoT 设备中的 /userdata/ 目录下并解压缩,确认 /userdata/face_app/bin/face_demo_license.key 是本设备的 License 文件。

进入 /userdata/face_app/bin/ 目录下,执行 sh run_face_demo.sh 脚本,验证人脸检测和识别功能,输出结果包括屏幕日志,及 /userdata/face_app/data/images_result/ 目录下的图片。

在同一个目录下,执行 sh run_plate_demo.sh 脚本,验证车牌检测和识别功能,输出结果包括屏幕日志,及 /userdata/face_app/data/plates_result/ 目录下的图片。

二次开发

编译

解压缩 face_sdk_{date}.tar 到任意开发目录。

./face_recog_lib_rk/face_sdk.h/cpp 对人脸 SDK 进行了二次封装,抽象了较为简单的接口,可参考 ./face_recog_lib_rk/face_demo.cpp 文件进行二次开发。

./face_recog_lib_rk/plate_sdk.h/cpp 对车牌 SDK 进行了二次封装,抽象了较为简单的接口,可参考 ./face_recog_lib_rk/plate_demo.cpp 文件进行二次开发。

编译时需使用 ./face_recog_lib_rk/3rdparty/lib64 下的动态库进行链接,可参考 ./face_recog_lib_rk/Makefile

需要注意的是,由于 RKMedia 的 RGA 库的限制,输入图片的长、宽需为4的整数倍,否则 face_sdk.cpp 中会先调用 OpenCV 的方法(耗费一定时间)对图片进行对齐。同样因为 RK1808 平台上旧版本 RGA 库的限制,输入图片的长、宽不能超过 2000 像素。

API

人脸检测及识别功能封装在 face_sdk.h 中,由 class FaceSDK 提供,具体 API 如下:

  • 初始化人脸 SDK
/*
 * @params [license_path] - 传入离线 License 文件地址
 */
explicit FaceSDK(const char* license_path);
  • 传入待检测图片

为减少 SDK 内部的内存拷贝次数,人俩检测、人脸特征计算 的 API 调用时需按照特定顺序。首先调用 loadRawImageloadEncodedImage 方法,向 SDK 传入图片;然后使用 getAllFaces 方法,获取图片中的所有人脸;再根据该方法的返回值中的人脸质量 FaceDetectResult::quality,调用 getFaceFeature 方法获取人脸特征值,或调用 getFaceImage 方法获取人脸区域图片。

在再次调用 loadRawImageloadEncodedImage 前,可以重复调用 getAllFacesgetFaceFeaturegetFaceImage 方法获取人脸及相关信息。

对于 loadRawImage 方法,需要注意的是,输入的图片为 BGR 格式,即 OpenCV::imreadOpenCV::imdecode 打开图片的默认格式。该方法通过 face_num 参数返回图片中的人脸数量。

/*
 * 载入图片 
 *
 * @params [bgr_data] - 输入 8bit 位图,色彩模式为 BGR,通道顺序为 HWC 
 * @params [image_width] - 输入图片的 Width
 * @params [image_height] - 输入图片的 Height
 * @params [bigger_face_mode] - True 表示输入为大头照,用于底库建库;False 表示输入为普通照片
 * @params face_num - 图片中人脸的数目
 *
 * @return - 0 表示正常返回,其余为错误
 */
int loadRawImage( 
        const unsigned char* bgr_data,
        size_t image_width,
        size_t image_height,
        bool bigger_face_mode,
        int* face_num);

/*
 * 载入图片 
 *
 * @params [jpg_data] - 输入 JPG/PNG 格式的图片
 * @params [jpg_size] - 输入图片的长度
 * @params [bigger_face_mode] - True 表示输入为大头照,用于底库建库;False 表示输入为普通照片
 * @params face_num - 图片中人脸的数目
 *
 * @return - 0 表示正常返回,其余为错误
 */
int loadEncodedImage( 
        const unsigned char* jpg_data,
        size_t jpg_size,
        bool bigger_face_mode,
        int* face_num);
  • 获取人脸检测结果

人脸检测及识别功能的返回结果由 struct FaceDetectResult 表示,包含以下信息:

// 人脸检测返回值
struct FaceDetectResult {
    int bbox[4];        // 人脸的 BBox,[0,1] 为左上角,[2,3] 为右下角
    int face_mask;      // 佩戴口罩的标记,0-佩戴口罩,1-未佩戴口罩
    int quality;        // 人脸质量打分
};

SDK 用户根据 loadRawImageloadEncodedImage 方法中的返回参数 face_num,获得人脸数量后,需要创建对应长度的 FaceDetectResult 数组,该数组的内存由 SDK 用户在外部自行负责创建或释放。

用户可通过 getAllFaces 方法,获得检测的所有人脸。

/*
 * 获取载入图片的人脸检测结果
 *
 * @params [face_detects] - 人脸检测结果 FaceDetectResult 数组,空间由外部分
 *                          配,其长度至少应 到 load_image 时返回的 face_num 
 *                          人脸数量
 *
 * @return - >=0 表示正常返回,且返回值为人脸的数目;<0 为错误
 **/
int getAllFaces(
        FaceDetectResult* face_detects);
  • 人脸特征

用户可以根据 FaceDetectResult 结构中的 quality 筛选符合质量要求的人脸进行特征提取,人脸质量阈值的建议在后文中描述。

用户使用 getFaceFeature 获取人脸特征向量。参数 face_feature 为长度为 512 的 float 数组,该数组的空间需由用户在自行申请或释放。

/*
 * 获取人脸的特征值
 *
 * @params [face_idx] - 人脸检测结果中对应的人脸序号 
 * @params [face_feature] - 人脸特征值数组,长度为 FRS_FEATURE_LENGTH 的 float
 *                          数组,空间由外部分配
 *
 * @return - 0 表示正常返回,其余为错误
 **/
int getFaceFeature(
        int face_idx,
        float* face_feature);

用户使用 faceSimilarity 方法比对两个人脸的相似度,返回值映射到一个百分制的分数区间中。

/*
 * 获取人脸相似度打分
 *
 * @params [face_feature0] - 人脸特征值数组,长度为 FRS_FEATURE_LENGTH 
 * @params [face_feature1] - 人脸特征值数组,长度为 FRS_FEATURE_LENGTH 
 * 
 * @return - 相似度分值,0~100 分
 */
int faceSimilarity(
    const float* face_feature0,
    const float* face_feature1);
  • 人脸区域图片

用户可调用 getFaceImage 获得人脸区域图片。

/*
 * 获取经过对齐的人脸图片
 *
 * @params [face_idx] - 人脸检测结果中对应的人脸序号 
 * @params [face_aligned] - 经过对齐的人脸图片
 *
 * @return - 0 表示正常返回,其余为错误
 **/
int getFaceImage(
        int face_idx,
        cv::Mat* face_aligned);

SDK 参数设定

针对不同的业务场景,我们给定了不同的推荐参数。

  • 人脸门禁机

我们建议输入的图片或检索 ROI 的像素不低于 320x320

在底库建库时,我们建议根据实际情况,将 FaceSDK 初始化时的 FaceDetectParam (除默认值外)设为:

track_param.face_mask_mode = false;     // false - 无需口罩检测,true - 需口罩检测 
track_param.bigger_face_mode = true;    // false - 检测所有人脸,true - 检测最大的人脸

在门禁图片比对时,我们建议根据实际情况,将 FaceSDK 初始化时的 FaceDetectParam (除默认值外)设为:

track_param.face_mask_mode = false;     // false - 无需口罩检测,true - 需口罩检测 
track_param.bigger_face_mode = false;   // false - 检测所有人脸,true - 检测最大的人脸

门禁场景中,建议将人脸质量分数的阈值设为 80 分,即 face_demo.cpp 中的 FACE_QUALITY_THRESHOLD 设为 80。

门禁场景中,比对底库是由正常条件下的人脸身份信息构造的人脸识别场景(含 1:1 和 1:N),对于人脸识别的相似度,我们建议将相似度阈值设为 89 分,即超过 89 分的刷脸行为认为是本人,允许放行,即 face_demo.cpp 中的 FACE_RECOG_SCORE_THRESHOLD 设为 89。

  • 防疫闸口

对于检测人流是否佩戴口罩的场景,我们建议输入的图片或检索 ROI 的像素不低于 640x640

FaceSDK 初始化时参数与人脸门禁机相同。

因防疫闸口的拍摄角度、光照等问题,我们建议将人脸质量分数的阈值设为 70 分。若比对底库是由正常条件下的人脸身份信息构造的人脸识别场景(含 1:1 和 1:N),对于人脸识别的余弦相似度,我们建议将相似度阈值设为 89 分;若底库为闸口的摄像头采集的非正常条件下的照片(含光照条件差、戴口罩人脸等),我们建议将相似度阈值设为 87。

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

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

相关文章

路由器的安装方法步骤

路由器的安装和设置如下&#xff1a; 1.首先连接线路&#xff0c;可以参考下图 2.线路连接完毕后&#xff0c;打开浏览器输入路由器的管理地址和管理密码然后进入路由器后台&#xff08;具体路由器的登录地址和登录密码可以参考说明书或者是路由器背面的标签&#xff09; 3.…

Nacos配置管理-配置热更新

Nacos配置自动刷新 Nacos中的配置文件变更后&#xff0c;微服务无需重启就可以感知。不过需要通过下面两种配置实现&#xff1a; 热更新-方法一&#xff1a;使用RefreshScope注解 在Value注入的变量所在类上添加RefreshScope注解&#xff1b; RestController RequestMapping(&…

直播|BIA Separations 和元生物两位大咖关于质粒DNA的制造工艺和质量控制

质粒 DNA&#xff08;pDNA&#xff09; 是生物研究和治疗开发中用于转移或表达基因的一个基本组成部分。细胞与基因治疗中最常用的载体AAV和慢病毒的生产都需要质粒作为起始材料&#xff0c;随着基因治疗&#xff0c;细胞治疗及DNA疫苗的快速发展&#xff0c;快速高效的大规模工…

腾讯云原生数据湖存储服务能力再上新,三级加速体系助力企业用数赋智

随着数据价值被越来越多企业认可&#xff0c;数据湖存储已成为企业级存储的首选和新一代提升生产力的服务。12月1日&#xff0c;在2022腾讯数字生态大会存储专场&#xff0c;腾讯云升级了云原生数据湖产品能力&#xff0c;并详细阐释了其设计理念&#xff0c;对其在多个行业的应…

数据万象技术演进之路

前言 Dale&#xff08;1969&#xff09;的“经验之塔”指出人们获取信息70%以上是通过视觉途径&#xff0c;在互联网时代也不例外。在当今图片音视频服务等已成为一个互联网应用中占比很大的部分&#xff0c;对图片和音视频等数据的处理能力也相应变成企业和开发者的一项基本技…

C++中二叉树的非递归遍历方法2-2

4 代码实现二叉树的非递归遍历 在“2 二叉树的遍历方法”中提到&#xff0c;二叉树的遍历方法有前序遍历、中序遍历、后序遍历属于深度优先遍历。接下来以前序遍历为例&#xff0c;通过代码实现该方法的二叉树非递归遍历。 4.1 前序遍历 4.1.1 前序遍历的非递归步骤 因为前…

记一次go协程读写锁 sync.RWMutex未释放导致其他协程阻塞bug

记一次go协程读写锁 sync.RWMutex未释放导致其他协程阻塞bug记一次go协程读写锁 sync.RWMutex未释放导致其他协程阻塞bug用到的监测工具程序简要介绍示例代码运行结果运行结果分析记一次go协程读写锁 sync.RWMutex未释放导致其他协程阻塞bug 通过一个简单示例模拟某协程结束&a…

[附源码]Python计算机毕业设计电影院订票系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

第53篇 Qt Quick项目详解

导语 前面我们一起创建了一个Qt Quick项目&#xff0c;并对里面的文件进行了简单的讲解&#xff0c;虽然这只是一个HelloWorld程序&#xff0c;但对于没有Qt Quick编程经验的同学来说&#xff0c;这个项目还是有点复杂。在这一篇中&#xff0c;我们将从最简单的QML文件讲起&am…

Flutter Web CORS解决方案1-禁用浏览器安全策略

Flutter Web CORS解决方案1设置CHROME_EXECUTABLE关于 CHROME_EXECUTABLE创建 CHROME_EXECUTABLE修改 chrome.dart 禁用安全策略升级 flutterSDK 后需重新修改升级后指定--web-hostname参数问题浏览器启用 Allow-CORS 插件部分协议OPTIONS预检跨域问题本文介绍第一种解决Flutte…

《纳瓦尔宝典》笔记一——你是在跟自己竞争,这是一场单人游戏

目录 一、身体的健康是top1 二、你唯一拥有的就是时间 三、选择短期内更更痛苦的道路 四、人生早期有三个重大决定 五、从雇佣关系中解脱出来 六、找合作伙伴 七、你真的嫉妒别人吗 八、从期待中解放出来 九、向内求-内在的评价标准 十、人生的大赢家就是同时拥有时间…

[附源码]Nodejs计算机毕业设计基于RationalRose的教务管理系统开发Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

基于java+swing+mysql图书管理系统3

大作业-基于java swing图书管理系统3一、系统介绍二、功能展示1.管理员登陆2.图书类别添加3.图书类别维护4.图书添加5.图书维护三、系统实现1.BookManageMainFrame.java四、其它1.其他系统实现五.获取源码一、系统介绍 该系统实现了用户登陆、图书类别管理(图书类别添加、图书…

JavaEE 初始化两个上下文对象,导致更新网站访问次数更新失败

问题描述 &#xff1a; 在做网站次数统计的时候&#xff0c;需要用到上下文对象&#xff0c;最终在上下文监听中发现上下文对象创建两次&#xff0c;销毁两次&#xff0c;导致数据库中网站访问次数统计更新失败。 原因 &#xff1a; 我们更改了项目的访问路径&#xff0c;就会导…

使用Java实现上传图片到七牛云

文章目录1.登录七牛云官网&#xff0c;注册账号并登录2.在项目中导入七牛云依赖3.编写创建文件名工具类4.编写连接七牛云工具类5.编写前端请求的Controller6.上传成功1.登录七牛云官网&#xff0c;注册账号并登录 2.在项目中导入七牛云依赖 <!-- 七牛云依赖 --> <!-…

力扣1832.判断句子是否为全字母句(cpp实现+解析)

文章目录1832.判断句子是否为全字母句解法一解法二解法三&#xff08;最优&#xff09;1832.判断句子是否为全字母句 难度&#xff1a;简单 力扣传送门&#xff1a; https://leetcode.cn/problems/check-if-the-sentence-is-pangram/description/ 题目要求&#xff1a; 全字…

Compose学习 -> Image()

基本使用&#xff1a; 通过资源id加载资源文件 Image(painter painterResource(id R.mipmap.test_01),contentDescription "这是内容描述") 通过url地址加载网络图片 1、引入第三方库&#xff0c;并添加网络权限 implementation ("io.coil-kt:coil-comp…

【深入浅出Nacos原理及调优】「原理分析专题」配置中心加载原理和配置实时更新原理分析

官方资源 官方资源 带着问题去思考 客户端长轮询的响应时间会受什么影响为什么更改了配置信息后客户端会立即得到响应客户端的超时时间为什么要设置为30s带着以上这些问题我们从服务端的代码中去探寻结论。 配置中心 (Configuration Center) 系统开发过程中通常会将一些需…

用Python调用OpenAI API做有趣的事

获取 API KEY 首先需要 可以开全局的梯子&#xff0c;选择日本或韩国节点&#xff0c;可以通过 ipinfo 检查当前 IP 地址是否为日本或韩国地区&#xff0c;然后访问 OpenAI 网站注册账号并完成认证。 如果自己完成账号认证的成本太高&#xff0c;可以在某宝直接购买一个已经通…

存储也能“一键美颜”?看 XOCP 如何助力互联科技图片业务转型

近日&#xff0c;XSKY星辰天合联合“互联科技”推出了“图片云在线处理”解决方案&#xff0c;提供海量图片高效存储访问和在线图片处理服务&#xff0c;深入业务场景简化操作流程&#xff0c;提升照片流转速度&#xff0c;为客户打造高效敏捷的拍照体验。互联科技&#xff08;…