一、前言

关于人脸识别这块,前些年不要太火,哪怕是到了今天依然火的一塌糊涂,什么玩意都要跟人脸识别搭个边,这东西应该只是人工智能的一个很小的部分,人脸识别光从字面上理解就是识别出人脸区域,其实背后真正的处理是拿到人脸区域图片,提取人脸特征值,再用这些特征值去做比对分析处理,识别出到底是谁,国内厂家也不少,比拼的就是准确度误报率,速度无非就是靠堆硬件来,什么VPU各种并行运算都堆上去,速度杠杠的,好多厂家都做到了几个毫秒的级别,估计很多厂家都是在开源的基础上加上了自家的算法,一直跑呀跑的整出了符合自家算法的人脸模型文件,比如百度的人脸识别模型文件,经过好几年的发展,越来越大越来越细越来越准。

听某个大神说过,很多时候人工智能其实并不是完全的智能,绝大部分都停留在半智能阶段,而且这种半智能阶段还需要借助很多辅助的硬件甚至人为的判断,很多模型库文件的生成就是靠一小小姑娘在那边流水线上类似的不停的点呀点,号称深度学习算法,就是让他识别更多的数据,使得更准确。关于人脸识别或者人工智能,外行一般觉得很科幻,内行一般觉得很绝望,业界领袖和领袖各种打鸡血。

国内的厂家大部分都提供了官网对应的api来进行处理,注册个账号,搞个key,直接就可以撸起来,关于这块技术上没有任何难点,初学者都可以搞定,无非就是先post数据,拿到返回的数据进行解析,要搞清楚的就是如何填充要post的数据,比如带上key,组织其他数据比如图片是base64字符串上传还是二进制文件上传等,返回的数据都是json啦,直接用现成的json库进行解析就ok。

百度人脸识别在线版和离线版SDK的封装:

  1. 离线版要求支持C++11的编译器,而且必须为MSVC。不支持mingw编译器。
  2. 在线版中的密钥等信息,务必记得换成自己申请的。
  3. 离线版本只能在windows上使用。
  4. 离线版本需要自己申请密钥。找到facebaidusdk文件夹下的LicenseTool.exe,填写后台离线SDK管理中申请到的序列号,单击激活按钮。
  5. 离线版本对应的动态库和模型文件自行从官网下载。
  6. 如果源码包中有facebaidusdk+face-resource文件夹则说明带了动态库和模型库文件夹,只需要将facebaidusdk文件夹下的所有文件复制到可执行文件同一目录,face-resource文件夹复制到可执行文件夹目录同等级目录即可。目录位置见snap文件夹下的示例图。
  7. facebaidusdk目录下的TestFaceApi.exe为百度提供的测试程序,先要将USB摄像头插到电脑上,会实时找人脸框。

二、功能特点

  1. 支持的功能包括人脸识别、人脸比对、人脸搜索、活体检测等。
  2. 在线版还支持身份证、驾驶证、行驶证、银行卡等识别。
  3. 在线版的协议支持百度、旷视,离线版的支持百度,可定制。
  4. 除了支持X86架构,还支持嵌入式linux比如contex-A9、树莓派等。
  5. 每个功能的执行除了返回结果还返回执行用时时间。
  6. 多线程处理,通过type控制当前处理类型。
  7. 支持单张图片检索相似度最高的图片。
  8. 支持指定目录图片用来生成人脸特征值文件。
  9. 可设置等待处理图片队列中的数量。
  10. 每次执行都有成功或者失败的信号返回。
  11. 人脸搜索的返回结果包含了原图+最大相似度图+相似度等。
  12. 人脸比对同时支持两张图片和两个特征值比对。
  13. 相关功能自定义一套协议用于客户端和服务端,可以通过TCP通信进行交互。
  14. 自定义人脸识别协议非常适用于中心一台服务器,现场若干设备请求的场景。
  15. 每个模块全部是独立的一个类,代码整洁、注释完善。

三、效果图

四、相关站点

  1. 国内站点:https://gitee.com/feiyangqingyun/QWidgetDemo
  2. 国际站点:https://github.com/feiyangqingyun/QWidgetDemo
  3. 个人主页:https://blog.csdn.net/feiyangqingyun
  4. 知乎主页:https://www.zhihu.com/people/feiyangqingyun/
  5. 体验地址:https://blog.csdn.net/feiyangqingyun/article/details/97565652

五、核心代码

void FaceWebBaiDu::finished(QNetworkReply *reply)
{
QString error = reply->errorString();
if (!error.isEmpty() && error != "Unknown error") {
emit receiveError(error);
} if (reply->bytesAvailable() > 0 && reply->error() == QNetworkReply::NoError) {
QString data = reply->readAll();
reply->deleteLater(); //发送接收数据信号
emit receiveData(data); //初始化脚本引擎
QScriptEngine engine;
//构建解析对象
QScriptValue script = engine.evaluate("value=" + data); //获取鉴权标识符
QString token = script.property("access_token").toString();
if (!token.isEmpty()) {
this->token = token;
emit receiveResult(0, "鉴权标识返回成功");
return;
} //通用返回结果字段
int code = script.property("error_code").toInt32();
QString msg = script.property("error_msg").toString();
emit receiveResult(code, msg); //图片识别部分
QScriptValue result = script.property("result");
if (!result.isNull()) {
//人脸识别
if (data.contains("location")) {
QScriptValue face_list = result.property("face_list");
checkFaceList(face_list);
} //人脸比对
if (data.contains("score") && !data.contains("location")) {
QScriptValue score = result.property("score");
float result = score.toString().toFloat();
if (result > 0) {
emit receiveFaceCompare(QRect(), QRect(), result);
} else {
emit receiveFaceCompareFail();
}
} //活体检测
if (data.contains("face_liveness")) {
QScriptValue face_liveness = result.property("face_liveness");
float result = face_liveness.toString().toFloat();
if (result >= 0) {
emit receiveLive(result);
}
}
}
}
} void FaceWebBaiDu::checkFaceList(const QScriptValue &scriptValue)
{
//创建迭代器逐个解析具体值
QScriptValueIterator it(scriptValue);
while (it.hasNext()) {
it.next();
if (it.flags() & QScriptValue::SkipInEnumeration) {
continue;
} QRect rect;
QString face_token = it.value().property("face_token").toString();
if (!face_token.isEmpty()) {
QScriptValue value = it.value().property("location");
rect = FaceHelper::getRect(value);
} if (rect.width() > 0) {
emit receiveFaceRect(rect);
break;
}
}
} void FaceWebBaiDu::getToken()
{
//具体参见 http://ai.baidu.com/ai-doc/REFERENCE/Ck3dwjhhu
QStringList list;
list.append(QString("grant_type=%1").arg("client_credentials"));
list.append(QString("client_id=%1").arg(key));
list.append(QString("client_secret=%1").arg(secret));
QString data = list.join("&"); QString url = "https://aip.baidubce.com/oauth/2.0/token";
FaceHelper::sendData(manager, url, data);
} void FaceWebBaiDu::detect(const QImage &img)
{
QString imgData = FaceHelper::getImageData2(img); QStringList list;
list.append(QString("{\"image\":\"%1\",\"image_type\":\"BASE64\"}").arg(imgData));
QString data = list.join(""); QString url = QString("https://aip.baidubce.com/rest/2.0/face/v3/detect?access_token=%1").arg(token);
FaceHelper::sendData(manager, url, data);
} void FaceWebBaiDu::compare(const QImage &img1, const QImage &img2)
{
QString imgData1 = FaceHelper::getImageData2(img1);
QString imgData2 = FaceHelper::getImageData2(img2); //如果需要活体检测则NONE改为LOW NORMAL HIGH
QStringList list;
list.append("[");
list.append(QString("{\"image\":\"%1\",\"image_type\":\"BASE64\",\"liveness_control\":\"NONE\"}").arg(imgData1));
list.append(",");
list.append(QString("{\"image\":\"%1\",\"image_type\":\"BASE64\",\"liveness_control\":\"NONE\"}").arg(imgData2));
list.append("]");
QString data = list.join(""); QString url = QString("https://aip.baidubce.com/rest/2.0/face/v3/match?access_token=%1").arg(token);
FaceHelper::sendData(manager, url, data);
} void FaceWebBaiDu::live(const QImage &img)
{
QList<QImage> imgs;
if (!img.isNull()) {
imgs << img;
} live(imgs);
} void FaceWebBaiDu::live(const QList<QImage> &imgs)
{
//记住最后一次处理的时间,限制频繁的调用
QDateTime now = QDateTime::currentDateTime();
if (lastTime.msecsTo(now) < 500) {
return;
} lastTime = now;
QStringList list;
list.append("["); int count = imgs.count();
for (int i = 0; i < count; i++) {
QString imgData = FaceHelper::getImageData2(imgs.at(i));
list.append(QString("{\"image\":\"%1\",\"image_type\":\"BASE64\"}").arg(imgData));
if (i < count - 1) {
list.append(",");
}
} list.append("]");
QString data = list.join(""); QString url = QString("https://aip.baidubce.com/rest/2.0/face/v3/faceverify?access_token=%1").arg(token);
FaceHelper::sendData(manager, url, data);
}

Qt音视频开发39-人脸识别在线版的更多相关文章

  1. Android IOS WebRTC 音视频开发总结(八十五)-- 使用WebRTC广播网络摄像头视频(下)

    本文主要介绍WebRTC (我们翻译和整理的,译者:weizhenwei,校验:blacker),最早发表在[编风网] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:bl ...

  2. Android IOS WebRTC 音视频开发总结(八十三)-- 使用WebRTC广播网络摄像头视频(上)

    本文主要介绍WebRTC (我们翻译和整理的,译者:weizhenwei,校验:blacker),最早发表在[编风网] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:bl ...

  3. WebRTC 音视频开发

    WebRTC 音视频开发 webrtc   Android IOS WebRTC 音视频开发总结(七八)-- 为什么WebRTC端到端监控很关键? 摘要: 本文主要介绍WebRTC端到端监控(我们翻译 ...

  4. 转:Android IOS WebRTC 音视频开发总结 (系列文章集合)

    随笔分类 - webrtc   Android IOS WebRTC 音视频开发总结(七八)-- 为什么WebRTC端到端监控很关键? 摘要: 本文主要介绍WebRTC端到端监控(我们翻译和整理的,译 ...

  5. Python音视频开发:消除抖音短视频Logo的图形化工具实现

    ☞ ░ 前往老猿Python博文目录 ░ 一.引言 在<Python音视频开发:消除抖音短视频Logo和去电视台标的实现详解>节介绍了怎么通过Python+Moviepy+OpenCV实现 ...

  6. Python音视频开发:消除抖音短视频Logo和去电视台标

    ☞ ░ 前往老猿Python博文目录 ░ 一.引言 对于带Logo(如抖音Logo.电视台标)的视频,有三种方案进行Logo消除: 直接将对应区域用对应图像替换: 直接将对应区域模糊化: 通过变换将要 ...

  7. Moviepy音视频开发:视频转gif动画或jpg图片exe图形化工具开发案例

    ☞ ░ 前往老猿Python博文目录 ░ 一.引言 老猿之所以学习和研究Moviepy的使用,是因为需要一个将视频转成动画的工具,当时在网上到处搜索查找免费使用工具,结果找了很多自称免费的工具,但转完 ...

  8. 【秒懂音视频开发】02_Windows开发环境搭建

    音视频开发库的选择 每个主流平台基本都有自己的音视频开发库(API),用以处理音视频数据,比如: iOS:AVFoundation.AudioUnit等 Android:MediaPlayer.Med ...

  9. Android音视频开发(1):H264 基本原理

    前言 H264 视频压缩算法现在无疑是所有视频压缩技术中使用最广泛,最流行的.随着 x264/openh264 以及 ffmpeg 等开源库的推出,大多数使用者无需再对H264的细节做过多的研究,这大 ...

  10. Android IOS WebRTC 音视频开发总结(四六)-- 从另一个角度看国内首届WebRTC大会

    文章主要从开发者角度谈国内首届WebRTC大会,支持原创,文章来自博客园RTC.Blacker,支持原创,转载必须说明出处,更多详见www.rtc.help. -------------------- ...

随机推荐

  1. Excel488个函数一览

    目录: 常用函数 Web 函数 财务函数 查找和引用函数 多维数据集函数 工程函数 兼容性函数 逻辑函数 日期和时间函数 数据库函数 数学和三角函数 统计函数 文本函数 信息函数 与加载项一起安装的用 ...

  2. How To Remove the Oracle OLAP API Objects From 9i and 11g Databases (Doc ID 278111.1)

    How to remove the Oracle OLAP API objects from a 9i database We can consider like olap api objects: ...

  3. 利用 Kubernetes 内置 PodTemplate 管理 Jenkins 构建节点

    作者:Rick Jenkins 可以很好地与 Kubernetes 集成,不管是控制器(controller)还是构建节点(agent),都能以 Pod 的形式运行在 Kubernetes 上. 熟悉 ...

  4. [NOI Online 2022 入门组] 数学游戏

    P8255 [NOI Online 2022 入门组] 数学游戏 注:妙哉,此题可以理解为数学题. 思路 由题易得: \[\notag z=d_x\times d_y\times \gcd(x,y)^ ...

  5. VMware安装Ubuntu操作系统 2024.9.27

    1.安装 Ubuntu的官方网站是:https://www.ubuntu.com/download 点进去可以直接下载 文件下载会比较慢,我这点用了约5分钟 然后就可以打开vmware,选择: 就可以 ...

  6. 论文发表汇款:SWIFT code跨境汇款 —— 如何向境外账号汇款

    如何向境外账号汇款? 有以下几种方式: 对方开通中国金融产品账号或在中国有代理公司:如对方开通中国的银行卡,微信.支付宝,等等,这样其实就不属于跨境汇款了,外国的一些公司已经开设中国的金融产品和银行账 ...

  7. macOS安装使用OpenConnect客户端替代cisco连接公司内网环境

    mac_os安装openconnect服务 brew install openconnect 使用OpenConnect客户端拨通VPN,打开终端执行以下命令: sudo openconnect -u ...

  8. ABP —— 权限管理

    ABP入门系列目录--学习Abp框架之实操演练 源码路径:Github-LearningMpaAbp 完成了简单的增删改查和分页功能,是不是觉得少了点什么?是的,少了权限管理.既然涉及到了权限,那我们 ...

  9. 选型4G-Cat.1模组Air780E,必须要说的注意事项!

    ​ Air780E是合宙低功耗4G-Cat.1模组经典型号之一,累计出货数量2000万+,广泛应用于物联网各行业.在此,特别感谢各位大佬的信任与支持. 写这篇文档的目的是什么呢? 从用户的角度,解答大 ...

  10. 2024最新免费IP地址SSL证书申请

    为IP地址申请免费的SSL证书相对较为困难,因为多数证书颁发机构(CA)提供的免费SSL证书主要是基于域名的.不过,还是可以尝试以下方法来申请免费的IP地址SSL证书: 一.确认IP地址与了解需求 确 ...