距离上次入门篇时隔两个月才出这进阶篇,小编惭愧,对不住关注我的卡哇伊的小伙伴们,为此小编用这篇博来谢罪。

前面的准备工作我就不说了,注册百度账号api,创建web网站项目,引入动态链接库引入。

不了解的童鞋可以花费10分钟移步学习:https://www.cnblogs.com/xiongze520/p/10387355.html(C# 10分钟完成百度人脸识别——入门篇)。

如果要学习的童鞋最好下载本demo源码,因为有信息入库功能,BLL、DAL、数据库就在源码里面。


  一般情况下笔记本自带的可见光摄像头就可以进行人脸识别,但是这种摄像头不能很好的进行活体检测,可能会被照片和视频骗过,

而且受到光线影响,太暗或者太亮都不行。如果要实现更好的人脸识别效果和更高的安全性,

就需要特殊的人脸识别摄像头或者配套宽动态和近红外双摄像头,既能确保活体,又能使用光线,我们这里就使用简单的笔记本自带的摄像头进行讲解,

后续有相关需要的可以讨论讨论。


提示:下载源码对比观看效果更佳

百度网盘源码下载链接:https://pan.baidu.com/s/1IzJCeF8uTKjZ882BTxI4bw
提取码:p92w

复制这段内容后打开百度网盘手机App,操作更方便哦。

我的百度人脸库一直开启,需要使用的小伙伴们自行在下面代码里面提取api_key和secret_key

操作的步骤(我使用的编辑器是visual studio 2013):

  • 效果图查看;
  • 人脸注册:开启摄像头,填入当前人脸注册的相关信息进行注册;
  • 人脸识别:开启摄像头,将人脸移入摄像头指定区域进行识别;
  • 总结:

效果图查看:


人脸注册——效果图:

百度人脸识别控制台查看人脸——效果图

数据库查看数据——效果图

人脸识别成功——效果图

活体检测——效果图

控制关键代码预览——截图


人脸注册:


(文末附带源码)新建一个ASP.NET Web应用程序网站项目,命名为WebApplication1,添加百度SDK引用,不知道怎么引用的童鞋看这儿:https://www.cnblogs.com/xiongze520/p/10387355.html

添加简单的类库充当三层架构,分别命名为:FaceBLL、FaceDAL、FaceModel,引入自己擅长的ORM框架(SQLSugar、Dapper、EF等,小编引入的SQLSugar)。

编写映射实体Face_UserInfo,字段和数据库一样,编写相关的bll、dal、增删查改。

接下来就是控制器编写,我们把代码粘贴出来看一下(单独粘贴这个代码是会报错的,因为没有bll、dal等内容):

提示:下载源码对比观看效果更佳

百度网盘源码下载链接:https://pan.baidu.com/s/1IzJCeF8uTKjZ882BTxI4bw
提取码:p92w

 //人脸注册
public JsonResult Face_Registration()
{
// 设置APPID/AK/SK
var API_KEY = "XFPA49myCG7S37XP1DxjLbXF"; //你的 Api Key
var SECRET_KEY = "ZvZKigrixMLXNZOLmkrG6iDx9QprlGuT"; //你的 Secret Key
var client = new Baidu.Aip.Face.Face(API_KEY, SECRET_KEY);
client.Timeout = ; // 修改超时时间 var imageType = "BASE64"; //BASE64 URL
string imgData64 = Request["imgData64"];
imgData64 = imgData64.Substring(imgData64.IndexOf(",") + );      //将‘,’以前的多余字符串删除 ResultInfo result = new ResultInfo();
try
{
//注册人脸
var groupId = "group1";
var userId = "user1";
//首先查询是否存在人脸
var result2 = client.Search(imgData64, imageType, userId); //会出现222207(未找到用户)这个错误
var strJson = Newtonsoft.Json.JsonConvert.SerializeObject(result2);
var o2 = Newtonsoft.Json.JsonConvert.DeserializeObject(strJson) as JObject; //判断是否存在当前人脸,相识度是否大于80
if (o2["error_code"].ToString() == "" && o2["error_msg"].ToString() == "SUCCESS")
{
var result_list = Newtonsoft.Json.JsonConvert.DeserializeObject(o2["result"].ToString()) as JObject;
var user_list = result_list["user_list"];
var Obj = JArray.Parse(user_list.ToString());
foreach (var item in Obj)
{
//80分以上可以判断为同一人,此分值对应万分之一误识率
var score = Convert.ToInt32(item["score"]);
if(score>)
{
result.info = result2.ToString();
result.res = true;
result.startcode = ;
return Json(result, JsonRequestBehavior.AllowGet);
}
}
} var guid = Guid.NewGuid();
// 调用人脸注册,可能会抛出网络等异常,请使用try/catch捕获
// 如果有可选参数
var options = new Dictionary<string, object>{
{"user_info", guid}
};
// 带参数调用人脸注册
var resultData = client.UserAdd(imgData64, imageType, groupId, userId, options);
result.info = resultData.ToString();
result.res = true;
result.other = guid.ToString();
}
catch (Exception e)
{
result.info = e.Message;
}
return Json(result, JsonRequestBehavior.AllowGet);
} //用户信息入库
public JsonResult face_userInfoSace()
{
ResultInfo result = new ResultInfo(); try
{
//这里就不进行非空判断了,后期根据实际情况进行优化
var UserName = Request["UserName"];
var Month = Request["Month"];
var Sex = Request["Sex"];
var Works = Request["Works"];
var face_token = Request["face_token"];
var Guid_Id = Request["Guid_Id"]; Face_UserInfo model = new Face_UserInfo();
model.UserName = UserName;
model.Month = Month;
model.Sex = Sex;
model.Works = Works;
model.face_token = face_token;
model.Guid_Id = Guid_Id; //根据人脸唯一标识判断是否存在数据
List<Face_UserInfo> strlist = new Face_UserInfoBLL().GetfaceinfoByToken(Guid_Id);
if(strlist.Count>)
{
result.res = true;
result.info = "当前用户已注册过!";
return Json(result, JsonRequestBehavior.AllowGet);
} if(new Face_UserInfoBLL().face_userInfoSace(model)>)
{
result.res = true;
result.info = "注册成功";
}
else
result.info = "注册失败";
}
catch (Exception e)
{
result.info = e.Message;
}
return Json(result, JsonRequestBehavior.AllowGet);
}

人脸识别:


注册完后就是识别,识别主要做一个简单的活体检测。识别后将人脸相关信息显示出来。

注意,人脸识别效果可以做出特效,本人才疏学浅,谁会canvas动画的可以私我,有个人脸识别的动画特效需要实现,我做了一个简单的上下扫描动画。

下面就将代码贴出来:

        //人脸识别
public JsonResult Face_Distinguish()
{
// 设置APPID/AK/SK
var API_KEY = "XFPA49myCG7S37XP1DxjLbXF"; //你的 Api Key
var SECRET_KEY = "ZvZKigrixMLXNZOLmkrG6iDx9QprlGuT"; //你的 Secret Key
var client = new Baidu.Aip.Face.Face(API_KEY, SECRET_KEY);
client.Timeout = ; // 修改超时时间 var imageType = "BASE64"; //BASE64 URL
string imgData64 = Request["imgData64"];
imgData64 = imgData64.Substring(imgData64.IndexOf(",") + );      //将‘,’以前的多余字符串删除 ResultInfo result = new ResultInfo();
try
{
var groupId = "group1";
var userId = "user1"; var result323 = client.Detect(imgData64, imageType); //活体检测阈值是多少
//0.05 活体误拒率:万分之一;拒绝率:63.9%
//0.3 活体误拒率:千分之一;拒绝率:90.3%
//0.9 活体误拒率:百分之一;拒绝率:97.6%
//1误拒率: 把真人识别为假人的概率. 阈值越高,安全性越高, 要求也就越高, 对应的误识率就越高
//2、通过率=1-误拒率
//所以你thresholds参数返回 和 face_liveness 比较大于推荐值就是活体 ////活体判断
var faces = new JArray
{
new JObject
{
{"image", imgData64},
{"image_type", "BASE64"}
}
};
var Living = client.Faceverify(faces); //活体检测交互返回
var LivingJson = Newtonsoft.Json.JsonConvert.SerializeObject(Living);
var LivingObj = Newtonsoft.Json.JsonConvert.DeserializeObject(LivingJson) as JObject;
if (LivingObj["error_code"].ToString() == "" && LivingObj["error_msg"].ToString() == "SUCCESS")
{
var Living_result = Newtonsoft.Json.JsonConvert.DeserializeObject(LivingObj["result"].ToString()) as JObject;
var Living_list = Living_result["thresholds"];
double face_liveness = Convert.ToDouble(Living_result["face_liveness"]);
var frr = Newtonsoft.Json.JsonConvert.SerializeObject(Living_list.ToString());
var frr_1eObj = Newtonsoft.Json.JsonConvert.DeserializeObject(Living_list.ToString()) as JObject;
double frr_1e4= Convert.ToDouble(frr_1eObj["frr_1e-4"]);
if (face_liveness < frr_1e4)
{
result.info = "识别失败:不是活体!";
return Json(result, JsonRequestBehavior.AllowGet);
}
} //首先查询是否存在人脸
var result2 = client.Search(imgData64, imageType, groupId);
var strJson = Newtonsoft.Json.JsonConvert.SerializeObject(result2);
var o2 = Newtonsoft.Json.JsonConvert.DeserializeObject(strJson) as JObject; //判断是否存在当前人脸,相识度是否大于80
if (o2["error_code"].ToString() == "" && o2["error_msg"].ToString() == "SUCCESS")
{
var result_list = Newtonsoft.Json.JsonConvert.DeserializeObject(o2["result"].ToString()) as JObject;
var user_list = result_list["user_list"];
var Obj = JArray.Parse(user_list.ToString());
foreach (var item in Obj)
{
//80分以上可以判断为同一人,此分值对应万分之一误识率
var score = Convert.ToInt32(item["score"]);
if (score > )
{
result.info = result2.ToString();
result.res = true;
result.startcode = ;
return Json(result, JsonRequestBehavior.AllowGet);
}
}
}
else
{
result.info = strJson.ToString();
result.res = false;
return Json(result, JsonRequestBehavior.AllowGet);
} }
catch (Exception e)
{
result.info = e.Message;
}
return Json(result, JsonRequestBehavior.AllowGet);
} //识别成功,查询数据库
public JsonResult Face_UserInfoList()
{
ResultInfo result = new ResultInfo();
//这里就不进行非空判断了,后期根据实际情况进行优化
var Guid_Id = Request["Guid_Id"];
//根据人脸唯一标识判断是否存在数据
List<Face_UserInfo> strlist = new Face_UserInfoBLL().GetfaceinfoByToken(Guid_Id);
var strJson = Newtonsoft.Json.JsonConvert.SerializeObject(strlist);
result.info = strJson;
result.res = true;
return Json(result, JsonRequestBehavior.AllowGet);
}

总结:


匆匆忙忙就结束了,其实学起来也简单,大家下载demo对比学习一下,有什么疑问大家讨论讨论。

删除、更新还是一样的操作,去直接拷贝官网的几行代码即可,都是需要face_token作为添加更新删除,这个字段注册的时候已经存到数据库了。

我的百度人脸库一直开启,需要使用的小伙伴们自行在下面代码里面提取api_key和secret_key

又要去开启新项目,大家后面再见。

关注小编不迷路!

demo源码下载:

百度网盘源码下载链接:https://pan.baidu.com/s/1IzJCeF8uTKjZ882BTxI4bw
提取码:p92w

C# 30分钟完成百度人脸识别——进阶篇(文末附源码)的更多相关文章

  1. C# 10分钟完成百度人脸识别——入门篇

    嗨咯,小编在此祝大家新年快乐财多多! 今天我们来盘一盘人脸注册.人脸识别等相关操作,这是一个简单入门教程. 话不多说,我们进入主题: 完成人脸识别所需的步骤: 注册百度账号api,创建自己的应用: 创 ...

  2. Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码)

    Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码) 来源 https://blog.csdn.net/jiangwei0910410003/article/details/51 ...

  3. 动态方式破解apk进阶篇(IDA调试so源码)

    动态方式破解apk进阶篇(IDA调试so源码) 来源 https://blog.csdn.net/qq_21051503/article/details/74907449 下面就说关于在IDA中And ...

  4. Android动态方式破解apk进阶篇(IDA调试so源码)

    一.前言 今天我们继续来看破解apk的相关知识,在前一篇:Eclipse动态调试smali源码破解apk 我们今天主要来看如何使用IDA来调试Android中的native源码,因为现在一些app,为 ...

  5. 人脸检测识别,人脸检测,人脸识别,离线检测,C#源码

    百度网盘地址 微云地址 使用虹软人工智能开放平台技术开发完成

  6. Android ORC文字识别之识别身份证号等(附源码)

    项目地址https://github.com/979451341/OrcTest 我们说说实现这个项目已实现的功能,能够截图手机界面的某一块,将这个某一块图片的Bitmap传给tess-two的代码来 ...

  7. 百度人脸识别AI实践.doc

    0, 前言 百度开放了很多AI能力,其中人脸识别就是其中之一. 本文对百度人脸识别AI进行实践检验,看看其使用效果如何. 鉴于是最为基础的实践,基本都是在其接口范例代码修改而来. 百度人脸识别AI网站 ...

  8. 百度人脸识别api及face++人脸识别api测试(python)

    一.百度人脸识别服务 1.官方网址:http://apistore.baidu.com/apiworks/servicedetail/464.html 2.提供的接口包括: 2.1 多人脸比对:请求多 ...

  9. 基于Emgu CV+百度人脸识别,实现视频动态 人脸抓取与识别

    背景 目前AI 处于风口浪尖,作为 公司的CTO,也作为自己的技术专研,开始了AI之旅,在朋友圈中也咨询 一些大牛对于AI 机器学习框架的看法,目前自己的研究方向主要开源的 AI 库,如:Emgu C ...

随机推荐

  1. BZOJ_4006_[JLOI2015]管道连接_斯坦纳树

    BZOJ_4006_[JLOI2015]管道连接_斯坦纳树 题意: 小铭铭最近进入了某情报部门,该部门正在被如何建立安全的通道连接困扰. 该部门有 n 个情报站,用 1 到 n 的整数编号.给出 m ...

  2. Centos打开、关闭、结束tomcat,及查看tomcat运行日志

    cd到tomcat目录下之后 启动:一般是执行sh bin/startup.sh 停止:一般是执行sh bin/shutdown.sh查看:执行ps -ef |grep tomcat 输出如下 *** ...

  3. python环境下实现OrangePi Zero寄存器访问及GPIO控制

    最近入手OrangePi Zero一块,程序上需要使用板子上自带的LED灯,在网上一查,不得不说OPi的支持跟树莓派无法相比.自己摸索了一下,实现简单的GPIO控制方法,作者的Zero安装的是Armb ...

  4. ELK入门使用-与springboot集成

    前言 ELK官方的中文文档写的已经挺好了,为啥还要记录本文?因为我发现,我如果不写下来,过几天就忘记了,而再次捡起来必然还要经历资料查找筛选测试的过程.虽然这个过程很有意义,但并不总是有那么多时间去做 ...

  5. Spring Boot 入门教程 | 图文讲解

    目录 一.Spring Boot 是什么 二.为什么要使用 Spring Boot 三.快速入门 3.1 创建 Spring Boot 项目 3.2 项目结构 3.3 引入 Web 依赖 3.4 编写 ...

  6. Vue 进阶之路(七)

    之前的文章我们对 vue 的列表输出做了介绍,本章我们来看一下 vue 的组件 component. <!DOCTYPE html> <html lang="en" ...

  7. 『这是一篇干货blog』

    更新记录一些很好的干货博客以及工具网站. 各文章,工具网站版权归原作者所有,侵删. Articles 浅谈C++ IO优化--读优输优方法集锦 浅谈斜率优化 思维导图好助手--开心食用Xmind Ty ...

  8. 【效率神奇】Github丧心病狂的9个狠招

    Github,一个被业内朋友成为「全球最大的同性交友社区」的平台. 小时候遇到不会的字可以查新华字典.后来写作文我们可以通过作文书.或者文摘去找合适的素材.同样,写代码可以去Github上找适合自己的 ...

  9. Git学习:如何在Github的README.MD文件下添加图片

    格式如下: ![image](图片的绝对路径) 关于图片的绝对路径: 必须把图片上传到github的代码仓库里,再将其图片的网址复制到括号里才可以,不能够直接把图片复制到readme.md文件里面,这 ...

  10. RadioButton监听事件

    RadioButton为单选按钮,他需要与RadioGroup配合使用 对应的布局代码: <?xml version="1.0" encoding="utf-8&q ...