【已开源】【嵌入式 Linux 音视频+ AI 实战项目】瑞芯微 Rockchip 系列 RK3588-基于深度学习的人脸门禁+ IPC 智能安防监控系统

【已开源】【嵌入式 Linux 音视频+ AI 实战项目】瑞芯微 Rockchip 系列 RK3588-基于深度学习的人脸门禁+ IPC 智能安防监控系统

前言

本文主要介绍我最近开发的一个个人实战项目,“基于深度学习的人脸门禁+ IPC 智能安防监控系统”,全程满帧流畅运行。这个项目我目前全网搜了一圈,还没发现有相关类型的开源项目。这个项目只要稍微改进下,就可以变成市面上目前流行的三款产品,人脸识别门禁系统、IPC 安防和 NVR。在最下面会有视频演示。

本项目适用于瑞芯微 Rockchip 系列的板端,开源链接在文章最下面。

功能

人脸门禁系统

  • 人靠近自动亮屏,人走自动息屏
  • 支持人脸识别
  • 支持录入人脸,并进行人脸配对(极速配对 < 0.2S)

IPC 智能安防监控系统

  • 支持通过 onvif 实时查看摄像头画面
  • 支持实时目标检测(支持高达80种物体检测)
  • 支持录像
  • 支持检测到人时自动录像
  • 支持检测到人时自动报警

用到的硬件

1738765194618.jpg
  • 野火鲁班猫4 RK3588S2
  • IMX415 800W 4k 摄像头
  • RTL8822CE Wifi+BT
  • mipi LCD RGB 7寸 1024×600 触摸屏
  • 人体红外检测 SR501:通过 GPIO 读取相应数值,用于判断是否有人靠近
  • 128×32 OLED屏:通过 I2C 通信显示画面内容,用于显示人脸检测结果
  • 蓝牙音箱

用到的深度学习模型

  • yolo11:用于实时目标检测
  • retinaFace:用于人脸检测
  • facenet:用于人脸特征提取

模型需要经过转换和量化,并且进行精度评估,如果不知道如何在 Rockchip 平台进行模型转换的同学,可以参考我这篇文章:《瑞芯微 Rockchip 系列 RK3588 主流深度学习框架模型转成 rknn 模型教程》

用到的技术栈

  • C++
  • RKNN:用于在 Rockchip 上进行 NPU 推理
  • FFmpeg:用于音视频编解码,使用了 ffmpeg-rockchip 库进行 MPP 硬件编解码,提高编解码速度
  • Opencv:用于视频帧处理
  • LVGL:流行的 GUI 框架
  • Bluez-Alsa:用于连接蓝牙音箱并播放音频
  • Onvif:一个流行的 IP 摄像头协议标准,支持在电脑端直接查看摄像头画面,操作摄像头云台等等

线程架构图

这个项目涉及的线程较多,其中包含推理线程池、渲染线程、处理线程等待,使用了原子操作、锁、条件变量等解决了线程同步问题。

线程架构如下图所示:

image.png

如果不理解线程池概念的同学,可以参考我这篇文章:《C++ 线程池浅析》

项目演示

项目改进

由于是个人项目且时间有限,因此还存在很多可优化空间。

比如在人脸门禁系统中,可以有如下改进:

  • 加入 IR 摄像头,进行活体检测
  • 为人脸门禁系统加入 NFC 模块,支持通过 NFC 解锁
  • 为人脸门禁系统加入指纹模块,支持通过指纹解锁
  • 添加 mysql 数据库,将姓名、年龄、工号、人脸特征进行存储

而在 IPC 安防摄像头系统中,可以有如下改进:

  • 加入舵机云台,完善 onvif,支持远程控制云台转动
  • 对 yolo11 模型进行微调,加入摔倒识别、火焰识别、打架识别等等
  • 加入 IRCUT 滤光片,添加 IR 灯,实现日夜切换功能
  • 加入 webrtc,实现实时对话功能

https://github.com/qaz624824554/deep_learning_security_system

Read more

C++---万能指针 void* (不绑定具体数据类型,能指向任意类型的内存地址)

C++---万能指针 void* (不绑定具体数据类型,能指向任意类型的内存地址)

在C++的指针体系中,void* 被称为“万能指针”或“无类型指针”,是连接不同数据类型的特殊桥梁。它的核心特性是不绑定具体数据类型,能指向任意类型的内存地址,这使得它成为C/C++通用编程、底层内存操作和跨类型数据传递的基础工具。但同时,“无类型”也意味着失去了编译时类型检查,使用不当会引发内存错误、未定义行为(UB)等严重问题。 一、void*的本质与核心属性 1.1 定义与本质 void* 的语法定义为“指向void类型的指针”,但void本身表示“无类型”,因此void*的本质是仅存储内存地址,不包含任何关于指向数据的类型、大小、布局等信息的指针。换句话说,void* 只知道“内存在哪里”,但不知道“内存里存的是什么”。 1.2 指针大小与平台依赖性 void* 的大小与其他指针(如int*、char*

【C++初阶】:C++类和对象(中):类的默认成员函数---万字解说(最主要的四点)

【C++初阶】:C++类和对象(中):类的默认成员函数---万字解说(最主要的四点)

🎈主页传送门:良木生香 🔥个人专栏:《C语言》 《数据结构-初阶》 《程序设计》《鼠鼠的C++学习之路》 🌟人为善,福随未至,祸已远行;人为恶,祸虽未至,福已远离 前言:在上一篇文章中,我们学习了C++类和对象的“上”篇,学习了类的定义,类的实例化以及this指针,文章的链接我会放在本篇文章的最后。今天这篇文章我们主要讲的是类和对象的核心部分,即类的默认成员函数,主要分为三大部分:初始化和清理,拷贝复制以及取地址重载。这些内容相对来说都比较晦涩难懂,看一遍看不懂的小伙伴可以多看几遍,话不多说,我们直接进入正题。 目录 一、类的默认成员函数: 二、构造函数 三、析构函数 四、拷贝构造函数 五、赋值运算符重载 5.1、运算符重载 5.2、赋值运算符重载 5.

C++ 二叉搜索树(BST)深度解析:从概念原理、核心操作到底层实现

C++ 二叉搜索树(BST)深度解析:从概念原理、核心操作到底层实现

🔥小叶-duck:个人主页 ❄️个人专栏:《Data-Structure-Learning》 《C++入门到进阶&自我学习过程记录》 《算法题讲解指南》--优选算法 《算法题讲解指南》--递归、搜索与回溯算法 ✨未择之路,不须回头 已择之路,纵是荆棘遍野,亦作花海遨游 目录 前言 一、二叉搜索树的核心概念:什么是 BST? 二、二叉搜索树的性能分析:理想与最差情况 三. 二叉搜索树的实战实现   1、节点结构定义:BSTNode   2、BST 类核心操作:Insert、Find、Erase     2.1 插入操作(Insert) 代码实现: 测试代码:     2.2 查找操作(Find) 代码实现: 测试代码:

C++ map 全面解析:从基础用法到实战技巧

C++ map 全面解析:从基础用法到实战技巧

🔥个人主页:Cx330🌸 ❄️个人专栏:《C语言》《LeetCode刷题集》《数据结构-初阶》《C++知识分享》 《优选算法指南-必刷经典100题》《Linux操作系统》:从入门到入魔 🌟心向往之行必能至 🎥Cx330🌸的简介: 目录 前言: 一、map 核心概念与特性 1. 什么是 map? 2. 头文件与命名空间 3. map模板参数与内部类型 4. 常见初始化方式: 二、map 基础用法(必备知识点) 2.1 构造与初始化 2.2 遍历 1. 迭代器遍历(三种方式): 2. 范围for遍历 3. 结构化绑定(C++17支持): 2.3 插入操作(

阿里云全品类 8 折券限时领,建站 / AI / 存储通用 立即领取