一.概述

本文章会尝试用简单的语言,来给大家介绍一下,如何搭建一个最基本的人脸检测以及识别的场景。当然,这篇文章不只是讲解关于人脸检测相关的部分,而是围绕这个核心,包含概括了整个前端的uvc,甚至socket通信等各个方面都有所涉及。

最终的产品实际效果以及主体框图如下所示:

如上图所示,该展示需要用到:

♦ 一块1880的edb开发板(官网购买)

♦1台linux pc(推荐ubuntu)

♦一个支持uvc标准的摄像头,该实例使用的是logitech C922(此处非广告)

♦网线/电源等各个配件

该展示从流程上来看,主要分为四大部分:

1.uvc camera将实时拍摄到的数据通过usb线,传给1880主板,数据可以是h264/yuv/mjpg等各种格式,取决于不同的camera型号。

2.1880接收到uvc camera的数据后,通过Opencv的api,调用ffmpeg,并内部对接了底层的bitmain的各个驱动模块,比如硬件Jpeg解码,硬件视频解码等。

3.通过上层高度封装的API(bmiva),依次调用人脸检测、人脸识别、特征值入库以及比对的相关函数,来获得人脸坐标以及特征值等各个参数。

4.BM1880 将合成后的图片(包含人脸框以及特征值查找到的人名),通过socket的方式传给pc(1880作为socket client,PC作为socket server),并利用PC的opencv进行显示。

接下来会详细介绍这4个部分:

二. camera 和 BM1880 之间的数据传输

1.背景介绍 

-> 什么是uvc camera,以及uvc camera的基本用法

简单来说,uvc camera可以理解为免驱摄像头,而对于上层应用来说,配合简单的v4l2协议以及Ioctl的方式,就可以很方便的获取/设置摄像头的各个属性。

示范代码如下所示:

通常uvc camera会被识别为/dev/video0。 所以代码通过调用open函数,打开摄像头,然后通过ioctl,来获得摄像头的各个属性,实际应用中可以通过相关网站查找或者直接看底层代码来查阅所有支持的属性。

同样的,如果想设置摄像头的各个属性,也是类似的做法:如下代码截图所示,该例子设置摄像头的格式为320×240的MJPG。

2.实际代码

如图所示,可以看到通过Opencv来打开摄像头相比之前的做法,封装度更高。只需要调用VideoCapture类的open函数即可。opencv则帮忙隐藏了实现细节。

当然,此处有个问题是,为什么open的对应idx是200,此处略过不做展开,只要简单的记住,video0是对应的从200开始,依次类推,video1->201...

3.查询/修改摄像头属性

对于我们的人脸检测的应用来说,跟帧率强相关的一个指标则是摄像头的输入速度,通俗的理解,摄像头给BM1880开发板的速度越快,那自然帧率就有机会越高,假如摄像头以很慢的速度给BM1880开发板,那相当于前端就被卡住了,自然整体速度也快不起来。

所以,通常我会习惯于在开始的时候,先获得摄像头的基本帧率参数,从而对大概帧率有一个简单的估算。

代码如下:

通常摄像头的帧率会跟几个参数强相关,宽/高/格式。比如1080P的就要比720P的FPS要慢,YUYV就比MJPG的要慢,类似这些规律。大家也可以自己尝试。

当然,也跟具体特定的摄像头有关。

4.实时获得每一帧的数据

对于基于Opencv的写法,到了这一步其实真的非常简单。只有一行代码而已:capture.read(),  -> 即可以将数据保存到Mat frame对象里面

至此,第一阶段的工作已经完成,数据已经从camera到了BM1880开发板本地的Mat对象里面了。至于里面的具体细节,

比如数据是怎么通过opencv给到ffmpeg,并进行底层硬件解码的,都对开发者是透明的。从而大大降低了上层应用搭建的难度。

三.人脸检测识别相关操作

1.人脸识别

整个过程会用到的函数如下图所示:

可以看到,其实主要函数的使用非常简洁,只需依次调用bmiva_init->bmiva_face_detector_create->bmiva_face_detector_detect即可完成人脸的检测.

实际代码如下所示(该例子以MTCNN为例):

最终返回的信息,存放在vector<vector<bmiva_face_info_t>>results里面

至此,检测的部分告一段落。

补充:其中使用到的bmodel,是需要预先放在BM1880开发板的存储设备上的。因为我们的BM1880开发板是推理芯片。所以只是使用已经训练好的模型。

当然,目前主流的模型都可以支持转成我们的bmodel. 至于转换的部分,可以参考社区论坛的sdk的部分。

至于如何将人脸坐标,展现出来,顺便提一下即可,如下代码所示:

简单的for循环,将faceinfo里面的x/y坐标提取出来,然后利用opencv来绘画矩形框即可。

2.人脸识别

接下来会稍微麻烦一些,是人脸入库,人脸识别,特征值提取以及比对的部分。

先照例看一下示意图,首先是特征值加载,如下截图所示:

目前demo的做法是在flash里面存了一份特征值的数据,比如features.txt.然后将特征值通过ifstream读进来,并调用bmiva提供的NameLoad()函数,加载到BmivaFeature g_name_features里面。

然后是创建extractor

此处跟bmiva_face_detector_create可以类比。对应的是bmiva_face_extractor_create(),

承接之前的人脸检测的结果, 会先将之前检测到的人脸信息进行align,按照指定的宽高:

然后,会将对齐过的人脸信息(align_images),进行核心的特征值提取操作,如下函数所示:

这个函数会将提取出来的特征值存在Vector<vector<float>>features里面,然后会进行similarity的运算:

这里的第一个参数,就是前面提到的,从存储设备里面加载出来的特征值数据库.至于这个函数内部的实现,大家可以简单的理解为,遍历整个数据库,然后做相似度运算,比如Cosine之类的算法.并把最终的结果保存在vector<std::pair<string,float>>result里面。

再之后,就是一个简单的排序并选择相似度最高的结果,并将该结果对应的人名copy出来,进行最后的人名的显示。

当然,这个操作的过程中,也有一个阀值(threshold)的概念,如果相似度最高的数值,都低于我们预设的阀值,那我们就认为此次没有检测到想要的结果。这个阀值也是一个经验值,方便用户在不同的场景进行调节。

至此,整个检测/识别的全过程就已经完成。接下来就是收尾的数据传输以及显示的部分了:

四.数据传输以及显示

因为我们的bm1880开发板本身没有显示输出接口,所以必须要利用其它设备来进行显示.开发演示阶段,我们建议利用ubuntu电脑来完成该功能。

为了达到送给ubunutu显示的目的,该例子使用的是简单的socket传输,即将每帧合成好的数据,通过socket 传送给pc端。

1.建立连接

如上函数所示,此处略过不提。毕竟都是标准的玩法, 所以大家也可以在网络上很方便的查找到相关使用方法 。

2.创建线程

因为socket相对会非常耗时,所以为了并行处理,通常会建议开新的线程来做这个事情。

然后我的demo利用的是一个简单的queue<cv::Mat>imagebuffer

从而很方便的进行push/pop操作。

3.数据传输

核心还是利用socket的send函数,将数据发送出去。至于PC端,则是调用相对应的recv函数即可:

最后一步,PC端将接受的数据,存在opencv的image里面,并调用imshow进行显示。

至此,整个的流程就已经介绍完毕。

此外,开发者也可以扫描下方二维码加入我们的官方社群,与其他有志于此的同道进行交流、沟通,第一时间获取算丰边缘计算产品的最新消息。

算丰边缘计算开发板人脸检测识别-实现原理与代码介绍相关推荐

  1. Azure 物联网开发者体验 7 月更新:边缘计算开发工具,ARM64 设备开发,VS Code 容器化开发工具...

    欢迎来到 Azure 物联网开发者体验的 7 月更新! 在本次发布中,微软为物联网开发人员提供了许多新的功能和改进! 物联网边缘计算开发工具正式发布 Azure IoT Edge 于 2017 年发布 ...

  2. Centerface:开源实用的边缘设备无锚人脸检测与对齐算法

    点击我爱计算机视觉标星,更快获取CVML新技术 昨天Github上 ywlife 开源了 CenterFace:实用的边缘设备无锚人脸检测与对齐算法,引起了很多52CV群友的关注,开源不到一天,已经1 ...

  3. 基于wxpython+MySQL--实现人脸检测识别的宿舍人脸检测系统

    基于wxpython+MySQL--实现人脸检测识别的宿舍人脸检测系统 一.功能需求 二.数据库建立 2.1 初始化数据库 2.2 压缩/解压数据流 2.3 输入数据 三.宿舍管理 3.1 新建录入 ...

  4. 基于MTCNN和FaceNet的实时人脸检测识别系统

    文章目录 模型介绍 MTCNN FaceNet 基于MTCNN和FaceNet的实时人脸检测识别系统 在LFW数据集上测试 参考文献 GitHub项目地址:https://github.com/Har ...

  5. STM32F103RCT6Mini开发板搭建指纹识别系统

    STM32F103RCT6Mini开发板搭建指纹识别系统 导读 模块和工具的准备 接线 1.44寸液晶屏电源接线 液晶屏数据线接线 液晶屏控制线接线 指纹识别模块AS608接线 实物图: 接线图: 移 ...

  6. 树莓派4B爽上流安装python3的OpenCV(人脸检测识别—门禁“环境搭建篇”)

    树莓派4B安装OpenCV3.4.0人脸检测识别-门禁"环境搭建篇" 前言 一.准备工作 PC端软件 二.搭建树莓派环境 拓展TF内存卡 Tips:换源(python软件源) 修改 ...

  7. 【f1c200s/f1c100s】mangopi自制linux开发板驱动适配进度(PCB、代码开源)

    [f1c200s/f1c100s]mangopi自制linux开发板驱动适配进度(PCB.代码开源) 目前进度 过程记录博客 目前进度 目前自制的mangopi设备驱动适配已完成部分包含: 基于扫描的 ...

  8. 人脸识别SeetaFace2原理与代码详解

    人脸识别SeetaFace2原理与代码详解 前言 一.人脸识别步骤 二.SeetaFace2基本介绍 三.seetaFace2人脸注册.识别代码详解 3.1 人脸注册 3.1.1 人脸检测 3.1.2 ...

  9. 【CV】10种轻量级人脸检测算法大PK | 代码集合开源

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 最近在微信公众号 AIZOO 里看到轻量级人脸检测算法大盘点的文章 ...

最新文章

  1. Eclipse vs IDEA快捷键对比大全
  2. 快查电脑:开关机记录等(电脑使用痕迹)
  3. 给网站文字添加图标-Font Awesome
  4. cogs 167. [USACO Mar07] 月度花费
  5. 团队冲刺第二阶段-9
  6. ApacheCN Asp.NET 译文集 20211126 更新
  7. 云访问安全代理(CASB)行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  8. java 获取文件扩展名_如何在Java中获取文件扩展名
  9. JavaScript匿名函数和回调函数
  10. numpy——numpy.corrcoef
  11. 【React Native 安卓开发】----(mac下开发环境配置)【第一篇】
  12. 李宏毅 || 机器学习笔记一
  13. github船舰新文件夹,为什么github显示灰色文件夹,当我创建一个新的存储库?
  14. CF643D Bearish Fanpages
  15. 查看获取别人的微信公众号二维码
  16. 关于solidity解析abi方法,入参和结果字节码
  17. 模电学习4. 差模、共模干扰与安规电容
  18. ant design vue:upload打开选择文件弹框前弹出确认框
  19. 前端性能自动化执行机服务开发
  20. 使用driver.js实现新(xin)手(shou)导航,并使展示区域无法点击

热门文章

  1. vue项目修改浏览器图标以及标题
  2. 小米8android p怎么样,小米8推安卓P稳定版更新,官方称拍照升级为全球前三
  3. MICK-SQL基础教程(第二版)第七章 集合运算
  4. 大文件的切分--split命令选项详解
  5. python输入框_如何使用Python创建输入框?
  6. java冒泡从大到小排序代码_Java 冒泡排序、快速排序实例代码
  7. 用MySQL绘制新年祝福图形_2017微信拜年图片-2017微信拜年动态表情图片高清完整版-东坡下载...
  8. 滴滴被免副总裁黄金红:都是管理者问题 深感自责
  9. 这不是轻轻松松~Python绘制多因子柱状图到底有多简单
  10. 利用kwargs批量画图,如何初始化多个参数集