利用华为云FRS+OpenCv共同完成人脸识别场景
【摘要】 人脸识别的场景作为普遍存在的人脸识别,也是分等级使用的,有些场景需要识别是人,具体是谁可以不识别,比如现在疫情期间各个场所的数字哨兵,研究了一下数字哨兵,其实并没有做到精准的人脸识别,否则还要你出示健康码做甚呢?这里的人脸只是识别出来是“人脸”,然后探测到温度作为体温,再就是提醒出示健康码,这里的健康码才知道具体是谁的。但是作为另外一些场景,确实需要核实身份才能通过,就必须知道具体是哪张脸...
人脸识别的场景
作为普遍存在的人脸识别,也是分等级使用的,有些场景需要识别是人,具体是谁可以不识别,比如现在疫情期间各个场所的数字哨兵,研究了一下数字哨兵,其实并没有做到精准的人脸识别,否则还要你出示健康码做甚呢?这里的人脸只是识别出来是“人脸”,然后探测到温度作为体温,再就是提醒出示健康码,这里的健康码才知道具体是谁的。
但是作为另外一些场景,确实需要核实身份才能通过,就必须知道具体是哪张脸,这张脸还需要事前注册过,比如人脸考勤打卡。
有一些考勤机是单机版的。
本案例场景
作为人脸识别场景,如上述考勤机,单个场所单机版是可以的,如果是不固定场所,比如生产一台人脸登陆的售卖机器,同一个人就会出现在不同的场所,必定需要云中心了。
实际考虑的问题
- 云端:华为的云人脸识别服务FRS,是云端的,收费是按照请求次数的,如果设备端只负责抓图片来识别,必定会出现大量的浪费
- 终端:终端识别缺少中心化,不可能每个终端都存储所有人的正确信息
协同互补方案
基于以上问题,考虑到终端和云端互补实现。
- 终端复杂简单识别人脸,只要识别到是人脸信息,不需要详细特征,这一点OpenCv就能免费的帮助实现,通过OpenCv过滤后的人脸照片才有意义。
- 云端作为人脸正式存储和识别,肯定是精准的,每个人脸都有一个唯一Id,而且通过终端过滤了无效图片,也包含了服务器的压力
简单实现
- OpenCv人脸识别见上一篇《 香橙派(OrangePi)上利用OpenCv-Python实现人脸识别》
- 调用华为云人脸识别,我这里用了华为提供的类库,主方法如下
/// <summary>
/// 搜索人脸
/// </summary>
/// <param name="imgbase64"></param>
/// <param name="facesetname"></param>
/// <returns></returns>
public static async Task<(bool Result, string FaceId, string Name)> SearchFaceByBase64Async(string imgbase64, string facesetname = "acow-clock")
{
var config = HttpConfig.GetDefaultConfig();
//config.Timeout = 2000;
config.IgnoreSslVerification = true;
var auth = new BasicCredentials(_AK, _SK, _ProjectID);
var client = FrsAsyncClient.NewBuilder()
.WithCredential(auth)
.WithRegion(FrsRegion.ValueOf("cn-north-4"))
.WithHttpConfig(config)
.WithLogging(Microsoft.Extensions.Logging.LogLevel.Information)
.Build();
var req = new SearchFaceByBase64Request
{
FaceSetName = facesetname,
};
req.Body = new FaceSearchBase64Req()
{
ImageBase64 = imgbase64,
ReturnFields = new List<string> { "name" },
Threshold = 0.9,
TopN = 2
};
SearchFace face = new();
try
{
var resp = await client.SearchFaceByBase64Async(req);
var respStatusCode = resp.HttpStatusCode;
if (resp.Faces != null && resp.Faces.Count > 0)
{
face = resp.Faces.OrderBy(p => p.Similarity).Last();
}
if (face != null)
{
if (face.ExternalFields != null)
{
var dicExtfield = JsonConvert.DeserializeObject<Dictionary<string, string>>(face.ExternalFields.ToString());
if (dicExtfield?.TryGetValue("name", out var name) == true)
return (true, face.FaceId, name);
}
return (true, face.FaceId, face.ExternalImageId);
}
return (true, string.Empty, string.Empty);
}
catch (Exception ex)
{
_logger.Error("SearchFaceByBase64Async", ex);
}
return (false, string.Empty, string.Empty);
}
不同语言可以通过《API Explorer》获得
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)