使用512KiB RAM基于单片机的实时摄像头人脸识别DNN论文解析

article/2025/6/26 0:55:33

前言:

  1. 在读论文前可以先了解一下什么是GAP8(GAP8 是基于 RISC-V 和 PULP(并行超低功耗处理平台)开源平台的物联网应用处理器。它实现了智能设备的经济高效的开发、部署和自主操作,这些设备可以捕获、分析、分类并处理图像、声音或振动等丰富数据源的融合。)
  2. SDK的意思是软件的开发工具包。了解完所需工具再来说说这篇论文的目标吧,他是为了训练一个小而强大的人脸识别神经网络并移植到目标设备(满足512 KiB RAM的严格内存限制和1.5MiB权重大小)
  3. LFW: 自然脸部检测数据集
  4. 512KiB RAM足够了!基于单片机的实时摄像头人脸识别DNN原文

进入正题:

主要应用管道

        主要应用管道主要分为四部分,分别为帧捕获,人脸检测,人脸识别和用户交互与外部事件激活。
在这里插入图片描述
        GAP8 SDK已经包含了一个摄像头驱动程序和一个用于静态图像和视频流捕获到L2内存的API。这就可以解释上面这幅图的具体意思:摄像机识别人脸,转换成二进制网络结构捕获到L2中识别,可以识别出正确存在于内存的人的信息同时也区别出陌生人,当然陌生人的面部信息也可以被User加入到内存中。(仅为自己理解)

网络结构

        作者从网络架构开始论述,为了适应L2内存大小,网络内存应该尽可能小,作者通过对比以下网络框架MobileNet v1/v2, ShuffleNet v1/v2, SqueezeNet 1.0和1.1如下图。(MFLOPs(每秒百万浮点指令)用128x128 RGB的输入计算)
在这里插入图片描述

        SqueezeNet架构的另一个优点是没有残余连接。残余连接提供了具有更好训练能力的深度模型,但对于内存占用小的应用程序有一个主要缺点,残余连接的使用增加了(大部分时间翻倍)存储层激活所需的内存,从而增加了网络工作推断所需的内存。选择了SqueezeNet 1.1架构还有一个原因,引文它是最小、最简单的架构,因为它只包含3x3、1x1卷积、poolings和一个完全连接的层。
因为此应用是使用灰度相机,又由于使用的是彩色输入,于是我们在网络工作的开始添加了1个输入和3个输出通道的1x1卷积,以使用来自ImageNet数据的迁移学习。

数据集

使用VGGFace2数据集进行网络训练。LFW用于算法的验证。## 损失函数
使用XE + LS损耗函数训练的网络进行进一步的量化和移植过程。【标准交叉熵损失(XE)lift Structured loss (LS)】

量化

在保证量化后精度尽可能减少的少的情况下作者保守的采用十六位量化。(因为量化比较显著的缺点是质量下降)
在这里插入图片描述
量化步骤如下:

  • 估计用于存储输入、输出特征映射的整数部分的比特数,以及每个卷积的权值张量,通过网络对一些数据进行推理,估计每个张量的最大绝对值。如果我们有X张量,X张量的最大绝对值是Xmax,那么我们需要[log2 Xmax]位来存储X张量的整数部分。
    让我们将存储输入、输出特征映射的整数部分和卷积层的权值张量的比特数表示为IN int, OUTint, W int。

  • 如果我们有N位来存储激活值和权重值,并且N个int位用于整数部分,那么我们有以下位数用于分数部分:
    有符号数
    在这里插入图片描述
    无符号数
    在这里插入图片描述
    我们假设使用带符号的数字,并将输入、输出特征映射和权重张量的分数位表示为IN frac、OUTfrac、Wf rac。

  • 下一步是量化卷积权值和偏差为N定点值。
    在这里插入图片描述
    比如对于卷积层权重,我们做如下式子:
    在这里插入图片描述
    输入张量与权值进行卷积后,再将卷积偏差加到输出张量中,卷积偏差应该具有与输出相同的分数位数:B frac =OUT frac

  • 下一步是选择卷积的范数参数,需要注意:我们不能失去一个数字的高阶,应该保留尽可能多的最低有效位。
    第一步是估计存储输出激活结果的比特数:
    在这里插入图片描述
    然后
    在这里插入图片描述
    此时还需解决32位累加器的溢出问题;
    累加器的分数位:
    在这里插入图片描述
    累加器整数位:
    在这里插入图片描述
    判断(各个数前面都已经定义过 )
    在这里插入图片描述
    如果不满足此条件,则溢出,应减少分数部分。作者使用的方法是减少卷积权重的分数位的数量(怪不得作者说最简单的方法,确实是容易理解,若是溢出,则权重直接减去超出小数部分):
    在这里插入图片描述

研究

        确保仿真结果与主板结果相差不超过最后一位,因为pytorch的舍入操作有所偏差,所以这个准确率误差作者可以接受。
在这里插入图片描述
        作者提出了不同的想法,通常,数据归一化用于预处理图像,作者建议取消这些计算。这样我们就有了量化的网络输入,减少了图像预处理的操作。卷积运算包括两种运算:带权值的输入卷积和偏置相加(线性运算),故而有了下面的操作链:
W为卷积的权值,b为偏差
        最后一个公式等于非标准化输入与
在这里插入图片描述的卷积再加上个在这里插入图片描述

        (从表三中看出这个操作并不影响质量,表4显示了浮点PyTorch模型和在PC上进行卷积仿真的量化模型的精度值。精度只下降了0.0005)

        此外,我们还确定了不同方面如何影响我们算法的质量:bounding box origination(B)(我更倾向于理解为边界框大小)、 face alignment(A)、量化(Q)和人脸识别网络运行的设备。

        结果表明,bounding box origination和face alignment严重影响度量,同时量化对质量的影响很小(如下表)。
很期待未来能见到百分百的量化模型
        作者结论:我们的量化模型在PC上的质量比通常的PyTorch模型高0.0007。最后,我们使用在目标设备上计算的嵌入物来测量质量。图表显示移植后我们的质量只比非量化模型差0.0023。(移植后精度下降0.0023算是一个很可以的一个范围了,这是作者保守的使用16位量化)

移植到目标平台

        包括以下几个部分:数据转换为合适的布局;DNN模型实现与现有GAP8 SDK原语操作融合;内存布局优化;与现有组件集成,如人脸检测;
(移植过程表明,L2利用率是应用程序最重要的瓶颈。)
        提升L2的利用率可以从多方面入手,作者简述了一个例子:人脸检测和人脸识别不是同时执行,应用程序可以重用相同的内存缓冲区,从而减少L2占用。

Autotiler模型

内存占用优化(注:这一块均为内容部分,仅为自己认为重要的部分说明)

        作者初步研究时是发现512kib的L2肯定是不足以存储所有数据,实现这一目标的唯一方法是将权重存储在外部L3内存中,并在每层推理之前下载到L2内存中。不仅仅是权重、激活值,还有推理用到的各个数据,由于内存资源非常有限,作者找到的唯一解决方案是在每一层的连续内存池之上分配静态编译时缓冲区,并在接下来的步骤中考虑层输出的使用情况,这种解决方案需要对不同的网络子图进行推理图分析和不同的技术。

        然后作者详细介绍了两种内存管理方式L:层的线性链、SqueezeNet Fire模块。分别如下图:
层的线性链
        其中第i层的输出被用作第i+1层的输入,对于这种情况,应用了带有浮动边界的两个缓冲区链.输入和输出从内存池开始分配,并从浮动边界开始分配。选择浮动边界地址以适应当前层的输入和下一层的输出,不重新分配已经计算的数据,实现释放连续内存缓冲区。第二个缓冲区后的内存块用作外部L3内存的重量和偏置加载区域。Border地址由式(12)计算。

SqueezeNet Fire模块
        该模块由挤压卷积和两个使用挤压运算的卷积组成输入。两个扩展卷积的结果被连接起来,并且必须在扩展的两个阶段都被存储在L2的连续缓冲区中。带有浮动内存边界的方法也可以适用于Fire模块,但它包括三层,而不是之前的两层。
该图说明了如何使用缓冲区的左侧部分作为挤压输入,并将其作为展开层的连接位置。缓冲区的右侧既是挤压层的输出,又是展开层的输入,不能作为中间数据丢弃。边界地址由表单计算:
在这里插入图片描述
        通过使用两种内存管理方法,我们可以估计每层网络工作推断所需的最小L2缓冲区大小,而不需要内存移动和与外部内存之间的日期数据交换。最大的内存使用量是由架构中的前两个卷积和所有Fire模块消耗的。内存消耗的统计数据如下:
在这里插入图片描述

集成

        作者非常合理的进行了重用其他部分和内存缓冲区,这一部分解释了缓冲区的使用与各个模块之间的重用才达到它本身的目的!512kib RAM足矣(详细请看原文6.3部分)


http://chatgpt.dhexx.cn/article/NB8KQLub.shtml

相关文章

Springboot集成海康威视门禁设备,车牌识别摄像头,人脸设备

海康设备集成springboot 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 海康设备集成springboot前言一、海康SDK包根据下载的SKD包中的DEMO示例连接设备创建一个springboot项目将库文件放入根目录lib文件下&#…

java海康摄像头添加人脸_java及opencv实现调用本地摄像头、网络摄像头完成人脸检测、人脸收集、人脸识别、性别识别...

这几年人脸识别比较流行,各种应用场景都用到了人脸识别,如:无人店、火车站检票口、小区门禁、智慧展厅、某些银行网点等,这也是未来生活的一种趋势。我也是好奇想研究一下,百度google了一大堆资料,发现网上…

JAVA使用海康SDK摄像头人体目标识别模块

JAVA使用海康SDK 首先到海康威视官网下载SDK 海康威视SDK 1.导入项目时候需要注意,linux环境跟windows不同的 区别如下: public interface HCNetSDK extends Library //linux public interface HCNetSDK extends StdCallLibrary //windows2.初始化SDK …

PDF图片文字识别

工具 adobe acrobat XI PRO 没有安装该软件的,需下载安装,有了此软件,pdf随意改,必备! 步骤 1.打开pdf文件,点击工具---文本识别---在本文件中 2.选择“所有页面”,点击“编辑” 3.选择语言&a…

利用Java实现的图片中文字识别,你学会了吗?

一. 背景 今天有粉丝向波哥提出了这样一个疑问:给出一张图片,如何利用Java中的技术获取图片中的文字信息?针对这个问题,你有么有解决办法呢?如果你没有想到好的解决思路,也不用怕,看波哥来给你…

Python利用百度AI图像识别技术识别图片

准备工作:在百度云控制台创建文字识别模块;装备几张简单的有文字的图片。 百度官方文档:http://ai.baidu.com/docs#/OCR-API/7e4792c7 然后进入编码阶段: 如下代码获取access_token client_id和client_secret是百度云列表提供…

java做图文识别

现在的世界,什么都需要人工智能AI进行处理,那么,对于Java程序猿来说,是不是有些工作是不是就不能胜任呢,答案是显然是不一定的,对于图片识别来说,这个任务就可以使用Java进行开发,虽…

【计算机视觉】人脸识别--人脸识别技术综述

https://www.cnblogs.com/huty/p/8517691.html 参考:http://www.xuehuile.com/thesis/9a81f680054441ad907934b07b465c8e.html,本文做了相关修改。 1 人脸识别技术概述 近年来,随着计算机技术的迅速发展,人脸自动识…

厉害了,用 Java 也能实现图片识别!

点击上方蓝色“终端研发部”,选择“设为星标” 学最好的别人,做最好的我们 最近闲来无事研究了一下用 Java 如何模拟浏览器的行为,在实验登录的步骤时碰到了识别验证码的问题,于是在网上查找了关于 Java 如何进行图片识别验证码&a…

图片验证码识别教程技术原理分析

面对技术这片大海,我们都是一个渔民,三天打鱼,两天结网。我是把过去自己所掌握的所有技术总结成一张网,若一个技术干货分享的东西离我的网还太远,我就会放弃去了解。因为如果不能连结到这张网中,形成一个节…

Java OCR tess4j 图片识别技术(三)

先贴代码段 tess4j整个的代码调用到时是蛮简单的。 1.先去官网下载:http://tess4j.sourceforge.net/ 我的是Tess4J-3.4.0版,目录如下: 2.新建项目,将lib,tessdata,src复制到新建的项目中 3.将lib下的jar包加到build path 中 项目目录…

Java图像识别技术:Test4J

简介 做图像识别,可以使用TESSERACT-OCR来实现,但是该方式需要下载软件,在电脑上安装环境,移植性不高,使用Tess4J只需要下载相关Jar包,导入项目,再把项目封装好就可以处处运行了。 Test4J官网&…

计算机识别图像的原理,什么是图像识别技术?图像识别技术原理介绍

图像识别技术是人工智能的一个重要领域。它是指对图像进行对象识别,以识别各种不同模式的目标和对像的技术。 图像识别的发展经历了三个阶段:文字识别、数字图像处理与识别、物体识别。图像识别,顾名思义,就是对图像做出各种处理、分析,最终识别我们所要研究的目标。今天所…

图片识别——需求篇

最近由于工作的关系,学习了一些关于图片识别的知识,并成功用于解决实际问题当中,特此一一记录下来,以备后用,同时希望对大家有用。 场景 企业端用户在注册时,会上传一下公司的Logo。上传的步骤是:选择本地Logo图片,点上传,图片被上传至公司图片服务器(此时这张图片有…

Ubuntu重启黑屏——Intel微码更新兼容性问题

9月13日前后对Ubuntu 22.04进行软件更新,再开机后经过grub直接黑屏,没有任何报错信息。 对于默认不显示Grub菜单的机器,可以在闪过紫屏前长按Esc进入Grub菜单。由于此时仍能进入Grub菜单界面,此处优先选择使用自带的Recovery Mod…

华为-微码开发入门 - 环境搭建

搭建环境 安装 Node.js 前言: We码的整个开发依赖 Node.js 环境,我们需要对 Node.js 做一个简单的了解。Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,类似Java的JRE,JRE有一个称为Java Virtual Machine&#xff08…

Brocade FC微码升级

一、组网图 无 二、问题描述 在实际生产环境下,不少项目都存在着 Brocade FC 交换机 Firmware 版本过旧的问题,需要将 Firmware 版本升级至新版本。 三、过程分析 具体升级流程: 四、解决方法 1.搭建FTP环境 搭建FTP环境可以下载3cdaemon-ftp的免安装版小工具…

IBM X3550 m4 微码升级

Ibm pc server升级顺序为IMM->UEFI->DSA(->FPGA) 微码下载 进入IBM官网->支持->fix central 选择升级设备对应的微码或补丁 PCserver 微码升级先升级IMM 选择IMM 选择最新版下载,升级测试本机IMM版本为1.50 最新6.60,时间相隔六年多&am…

微信小程序生成二微码(JAVA)

前段时间在项目中,写了一个生成微信二微码的功能,之所以会开发这个功能,是因为我们做的小程序要进行推广让用户扫我们做的小程序的二微码进行去体验,功能实现的场景大概是: 后台生成小程序二微码,返回到后台页面进行展…

联想SR850系列微码升级

1. 通过服务器管理口(X-clarity controller)收集日志.方法是使用直连线(此网口可自适应 连接方式)将此网口连接于一台终端机(笔记本或台式机). 2. .将笔记本的网卡 IP 设置为与“192.168.70.125”处于同网段的 IP(如: 192.168.70.…