距离上次入门篇时隔两个月才出这进阶篇, 小编惭愧, 对不住关注我的卡哇伊的小伙伴们, 为此小编用这篇博来谢罪.
前面的准备工作我就不说了, 注册百度账号 API, 创建 web 网站项目, 引入动态链接库引入.
不了解的童鞋可以花费 10 分钟移步学习: https://www.cnblogs.com/xiongze520/p/10387355.html(C# 10 分钟完成百度人脸识别 -- 入门篇).
如果要学习的童鞋最好下载本 demo 源码, 因为有信息入库功能, BLL,DAL, 数据库就在源码里面.
一般情况下笔记本自带的可见光摄像头就可以进行人脸识别, 但是这种摄像头不能很好的进行活体检测, 可能会被照片和视频骗过,
而且受到光线影响, 太暗或者太亮都不行. 如果要实现更好的人脸识别效果和更高的安全性,
就需要特殊的人脸识别摄像头或者配套宽动态和近红外双摄像头, 既能确保活体, 又能使用光线, 我们这里就使用简单的笔记本自带的摄像头进行讲解,
后续有相关需要的可以讨论讨论.
提示: 下载源码对比观看效果更佳
百度网盘源码下载链接: https://pan.baidu.com/s/1IzJCeF8uTKjZ882BTxI4bw 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 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 = 60000; // 修改超时时间
- var imageType = "BASE64"; //BASE64 URL
- string imgData64 = Request["imgData64"];
- imgData64 = imgData64.Substring(imgData64.IndexOf(",") + 1); // 将','以前的多余字符串删除
- 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() == "0" && 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>80)
- {
- result.info = result2.ToString();
- result.res = true;
- result.startcode = 221;
- 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>0)
- {
- result.res = true;
- result.info = "当前用户已注册过!";
- return JSON(result, JsonRequestBehavior.AllowGet);
- }
- if(new Face_UserInfoBLL().face_userInfoSace(model)>0)
- {
- 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 = 60000; // 修改超时时间
- var imageType = "BASE64"; //BASE64 URL
- string imgData64 = Request["imgData64"];
- imgData64 = imgData64.Substring(imgData64.IndexOf(",") + 1); // 将','以前的多余字符串删除
- 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() == "0" && 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() == "0" && 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> 80)
- {
- result.info = result2.ToString();
- result.res = true;
- result.startcode = 221;
- 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 https://pan.baidu.com/s/1IzJCeF8uTKjZ882BTxI4bw
提取码: p92w
来源: https://www.cnblogs.com/xiongze520/p/10688545.html