利用华为云FRS+OpenCv共同完成人脸识别场景

举报
神龙居市 发表于 2022/11/30 09:49:57 2022/11/30
【摘要】 人脸识别的场景作为普遍存在的人脸识别,也是分等级使用的,有些场景需要识别是人,具体是谁可以不识别,比如现在疫情期间各个场所的数字哨兵,研究了一下数字哨兵,其实并没有做到精准的人脸识别,否则还要你出示健康码做甚呢?这里的人脸只是识别出来是“人脸”,然后探测到温度作为体温,再就是提醒出示健康码,这里的健康码才知道具体是谁的。但是作为另外一些场景,确实需要核实身份才能通过,就必须知道具体是哪张脸...

人脸识别的场景

作为普遍存在的人脸识别,也是分等级使用的,有些场景需要识别是人,具体是谁可以不识别,比如现在疫情期间各个场所的数字哨兵,研究了一下数字哨兵,其实并没有做到精准的人脸识别,否则还要你出示健康码做甚呢?这里的人脸只是识别出来是“人脸”,然后探测到温度作为体温,再就是提醒出示健康码,这里的健康码才知道具体是谁的。
但是作为另外一些场景,确实需要核实身份才能通过,就必须知道具体是哪张脸,这张脸还需要事前注册过,比如人脸考勤打卡。
有一些考勤机是单机版的。

本案例场景

作为人脸识别场景,如上述考勤机,单个场所单机版是可以的,如果是不固定场所,比如生产一台人脸登陆的售卖机器,同一个人就会出现在不同的场所,必定需要云中心了。

实际考虑的问题

  1. 云端:华为的云人脸识别服务FRS,是云端的,收费是按照请求次数的,如果设备端只负责抓图片来识别,必定会出现大量的浪费
  2. 终端:终端识别缺少中心化,不可能每个终端都存储所有人的正确信息

协同互补方案

基于以上问题,考虑到终端和云端互补实现。

  1. 终端复杂简单识别人脸,只要识别到是人脸信息,不需要详细特征,这一点OpenCv就能免费的帮助实现,通过OpenCv过滤后的人脸照片才有意义。
  2. 云端作为人脸正式存储和识别,肯定是精准的,每个人脸都有一个唯一Id,而且通过终端过滤了无效图片,也包含了服务器的压力
    image.png

简单实现

  1. OpenCv人脸识别见上一篇《 香橙派(OrangePi)上利用OpenCv-Python实现人脸识别
  2. 调用华为云人脸识别,我这里用了华为提供的类库,主方法如下
        /// <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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。