[人脸识别] API接口
goJhou 发布于2017-11 浏览:11489 回复:3
1
收藏
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using static Jhou.AI.Face.GlobalClass;

namespace Jhou.AI.Face
{
    public static class APIBase
    {
        static private Baidu.Aip.Face.Face client = new Baidu.Aip.Face.Face(AI.GlobalClass.API_KEY,AI.GlobalClass.SECRET_KEY);

        /// 
        /// 人脸检测
        /// 检测请求图片中的人脸,返回人脸位置、72个关键点坐标、及人脸相关属性信息。检测响应速度,与图片中人脸数量相关,人脸数量较多时响应时间会有些许延长。
        /// 
        /// 图片文件路径
        /// 默认只返回人脸框、概率和旋转角度。
        /// 检测人脸数量,默认为1
        /// 
        /// 字段	是否必选	类型	说明
        /// log_id	number	是	日志id
        /// result_num number  是 人脸数目
        ///result array   是 人脸属性对象的集合
        ///+age number  否 年龄。face_fields包含age时返回
        ///+beauty number  否 美丑打分,范围0-100,越大表示越美。face_fields包含beauty时返回
        ///+location object 是   人脸在图片中的位置
        ///++left number  是 人脸区域离左边界的距离
        ///++top number  是 人脸区域离上边界的距离
        ///++width number  是 人脸区域的宽度
        ///++height number  是 人脸区域的高度
        ///+face_probability number  是 人脸置信度,范围0-1
        ///+rotation_angle number  是 人脸框相对于竖直方向的顺时针旋转角,[-180,180]
        ///+yaw number  是 三维旋转之左右旋转角[-90(左), 90(右)]
        ///+pitch number  是 三维旋转之俯仰角度[-90(上), 90(下)]
        ///+roll number  是 平面内旋转角[-180(逆时针), 180(顺时针)]
        ///+expression number  否 表情,0,不笑;1,微笑;2,大笑。face_fields包含expression时返回
        ///+expression_probability number  否 表情置信度,范围0 ~1。face_fields包含expression时返回
        ///+faceshape array   否 脸型置信度。face_fields包含faceshape时返回
        ///++type string 是   脸型:square/triangle/oval/heart/round
        ///++probability number  是 置信度:0~1
        ///+gender string 否   male、female。face_fields包含gender时返回
        ///+gender_probability number  否 性别置信度,范围0 ~1。face_fields包含gender时返回
        ///+glasses number  否 是否带眼镜,0-无眼镜,1-普通眼镜,2-墨镜。face_fields包含glasses时返回
        ///+glasses_probability number  否 眼镜置信度,范围0 ~1。face_fields包含glasses时返回
        ///+landmark array   否	4个关键点位置,左眼中心、右眼中心、鼻尖、嘴中心。face_fields包含landmark时返回
        ///++x number  否 x坐标
        ///++y number  否 y坐标
        ///+landmark72 array   否	72个特征点位置,示例图 。face_fields包含landmark时返回
        ///++x number  否 x坐标
        ///++y number  否 y坐标
        ///+race string 否   yellow、white、black、arabs。face_fields包含race时返回
        ///+race_probability number  否 人种置信度,范围0 ~1。face_fields包含race时返回
        ///+qualities object 否   人脸质量信息。face_fields包含qualities时返回
        ///++occlusion object 是   人脸各部分遮挡的概率,[0, 1],0表示完整,1表示不完整
        ///+++left_eye number  是 左眼
        ///+++right_eye number  是 右眼
        ///+++nose number  是 鼻子
        ///+++mouth number  是 嘴
        ///+++left_cheek number  是 左脸颊
        ///+++right_cheek number  是 右脸颊
        ///+++chin number  是 下巴
        ///++blur number  是 人脸模糊程度,[0, 1]。0表示清晰,1表示模糊
        ///++illumination number  是 取值范围在[0, 255], 表示脸部区域的光照程度
        ///++completeness number  是 人脸完整度,0或1, 0为人脸溢出图像边界,1为人脸都在图像边界内
        ///++type object 是   真实人脸/卡通人脸置信度
        ///+++human number  是 真实人脸置信度,[0, 1]
        ///+++cartoon number  是 卡通人脸置信度,[0, 1]
        ///
        ///
        ///可通过人脸检测接口,基于以下字段和对应阈值,进行质量检测的判断,以保证人脸质量符合后续业务操作要求。
        ///
        ///遮挡范围    
        ///occlusion(0~1),0为无遮挡,1是完全遮挡含有多个具体子字段,表示脸部多个部位通常用作判断头发、墨镜、口罩等遮挡 
        ///left_eye : 0.6, #左眼被遮挡的阈值
        ///right_eye : 0.6, #右眼被遮挡的阈值
        ///nose : 0.7, #鼻子被遮挡的阈值
        ///mouth : 0.7, #嘴巴被遮挡的阈值
        ///left_check : 0.8, #左脸颊被遮挡的阈值
        ///right_check : 0.8, #右脸颊被遮挡的阈值
        ///chin_contour : 0.6, #下巴被遮挡阈值
        ///
        ///模糊度范围   
        ///Blur(0~1),0是最清晰,1是最模糊 
        ///小于0.7
        ///
        ///光照范围 
        ///illumination(0~255)脸部光照的灰度值,0表示光照不好以及对应客户端SDK中,YUV的Y分量 
        ///大于40
        ///
        ///姿态角度
        ///Pitch:三维旋转之俯仰角度[-90(上), 90(下)]
        ///Roll:平面内旋转角[-180(逆时针), 180(顺时针)]
        ///Yaw:三维旋转之左右旋转角[-90(左), 90(右)]
        ///分别小于20度
        ///
        ///人脸完整度 
        ///completeness(0~1),0代表完整,1代表不完整 
        ///小于0.4
        ///
        ///人脸大小 
        ///人脸部分的大小 建议长宽像素值范围:80*80~200*200
        ///人脸部分不小于100*100像素
        /// 
        public static JObject FaceDetect(byte[] ImageByte,List FaceDetectOptions,int max_face_num=1)
        {
            string face_fields_options = "";
            foreach(FaceDetectOptions item in FaceDetectOptions)
            {
                face_fields_options += "," + item.ToString();
            }

            face_fields_options = face_fields_options.Remove(0, 1);

            var options = new Dictionary()
            {
                {"face_fields", face_fields_options},
                {"max_face_num",max_face_num }
            };
            return Execute(client.FaceDetect(ImageByte, options));
        }
        
        /// 
        /// 人脸比对
        /// 该请求用于比对多张图片中的人脸相似度并返回两两比对的得分,可用于判断两张脸是否是同一人的可能性大小。
        /// 
        /// 第一张图数据
        /// 第二张图数据
        /// 是否对所有图片质量检测
        /// 是否对所有图片活体检测 
        /// “faceliveness,faceliveness” 表示对比对的两张图片都做活体检测;
        /// “,faceliveness” 表示对第一张图片不做活体检测、第二张图做活体检测;
        /// “faceliveness,” 表示对第一张图片做活体检测、第二张图不做活体检测
        /// 图片类型
        ///12表示带水印证件照:一般为带水印的小图,如公安网小图
        ///7表示生活照:通常为手机、相机拍摄的人像图片、或从网络获取的人像图片等
        ///13表示证件照片:如拍摄的身份证、工卡、护照、学生证等证件图片
        ///注:需要确保人脸部分不可太小,通常为100px*100px
        /// 
        /// 字段	是否必选	类型	说明
        ///log_id	是	number	请求唯一标识码,随机数
        ///result_num 是   number 返回结果数目,即:result数组中元素个数
        ///result  是 array   结果数据,index和请求图片index对应。数组元素为每张图片的匹配得分数组,top n。 得分[0, 100.0]
        ///+index_i 是   number 比对图片1的index
        ///+index_j 是   number 比对图片2的index
        ///+score 是   number 比对得分
        ///ext_info 否   array 对应参数中的ext_fields
        ///+qualities 否   string 质量相关的信息,无特殊需求可以不使用
        ///+faceliveness 否   string 活体分数,如0.49999。单帧活体检测参考阈值0.834963,超过此分值以上则可认为是活体。
        ///注意:活体检测接口主要用于判断是否为二次翻拍,需要限制用户为当场拍照获取图片
        /// 
        public static JObject FaceMatch(byte[] ImageByte1,byte[] ImageByte2,string ext_fields="qualities",string image_liveness= "faceliveness,faceliveness",string types="7,7")
        {
            var images = new byte[][] { ImageByte1, ImageByte2 };
            var options = new Dictionary()
            {
                {"ext_fields",ext_fields },
                {"image_liveness",image_liveness },
                {"types",types }
            };
            return Execute(client.FaceMatch(images,options));
        }

        /// 
        /// 人脸识别
        /// 用于计算指定组内用户,与上传图像中人脸的相似度。识别前提为您已经创建了一个人脸库。
        /// 
        /// 图片数据
        /// 用户组id(由数字、字母、下划线组成),长度限制128B,可查询多个用户组id
        /// 特殊返回信息,多个用逗号分隔,取值固定: 目前支持faceliveness(活体检测)。注:需要用于判断活体的图片,图片中的人脸像素面积需要不小于100px*100px,人脸长宽与图片长宽比例,不小于1/3
        /// 返回用户top数,默认为1,最多返回5个
        /// 
        /// 字段	是否必选	类型	说明
        /// log_id	是	number	请求唯一标识码,随机数
        /// result_num 是   number 返回结果数目,即:result数组中元素个数
        ///  ext_info    否 array   对应参数中的ext_fields
        ///+faceliveness 否   string 活体分数,如0.49999。单帧活体检测参考阈值0.834963,超过此分值以上则可认为是活体。注意:活体检测接口主要用于判断是否为二次翻拍,需要限制用户为当场拍照获取图片
        ///result  是 array   结果数组
        ///+group_id 是   string 对应的这个用户的group_id
        ///+uid 是   string 匹配到的用户id
        ///+user_info 是   string 注册时的用户信息
        ///+scores 是   array 结果数组,数组元素为匹配得分,top n。得分[0, 100.0]
        /// 
        public static JObject FaceIdentify(byte[] ImageByte, List group_id, List ext_fields,int user_top_num=1)
        {
            return Execute(client.User.Identify(ImageByte, group_id, user_top_num, 1, ext_fields));
        }

        /// 
        /// 人脸认证
        /// 用于识别上传的图片是否为指定用户,即查找前需要先确定要查找的用户在人脸库中的id。
        /// 人脸认证与人脸识别的差别在于:人脸识别需要指定一个待查找的人脸库中的组;而人脸认证需要指定具体的用户id即可,不需要指定具体的人脸库中的组;实际应用中,人脸认证需要用户或系统先输入id,这增加了验证安全度,但也增加了复杂度,具体使用哪个接口需要视您的业务场景判断。
        /// 
        /// 图片数据
        /// 用户id(由数字、字母、下划线组成),长度限制128B
        /// 用逗号分隔,表示从指定的group中查找
        /// 特殊返回信息,多个用逗号分隔,取值固定: 目前支持faceliveness(活体检测)。注:需要用于判断活体的图片,图片中的人脸像素面积需要不小于100px*100px,人脸长宽与图片长宽比例,不小于1/3
        /// 返回匹配得分top数,默认为1
        /// 
        /// 字段	是否必选	类型	说明
        /// log_id	是	number	请求唯一标识码,随机数
        ///result_num 是   number 返回结果数目,即:result数组中元素个数
        ///result  是 array   结果数组,数组元素为匹配得分,top n。 得分范围[0, 100.0]。推荐得分超过80可认为认证成功
        ///ext_info    否 array   对应参数中的ext_fields
        ///+faceliveness 否   string 活体分数,如0.49999。单帧活体检测参考阈值0.834963,超过此分值以上则可认为是活体。活体检测接口主要用于判断是否为二次翻拍,需要限制用户为当场拍照获取图片;推荐配合客户端SDK有动作校验活体使用
        /// 
        public static JObject FaceVerify(byte[] ImageByte, string uid,List group_id, List ext_fields, int user_top_num = 1)
        {
            return Execute(client.User.Verify(ImageByte, uid, group_id, user_top_num, ext_fields));
        }

        /// 
        /// 人脸注册
        /// 用于从人脸库中新增用户,可以设定多个用户所在组,及组内用户的人脸图片,
        /// 
        /// 可通过人脸检测接口,基于以下字段和对应阈值,进行质量检测的判断,以保证人脸质量符合后续业务操作要求。
        /// 
        /// 图片数据
        /// 用户id(由数字、字母、下划线组成),长度限制128B
        /// 用户资料,长度限制256B
        /// 
        /// 用户组id,标识一组用户(由数字、字母、下划线组成),长度限制128B。如果需要将一个uid注册到多个group下,group_id需要用多个逗号分隔,每个group_id长度限制为48个英文字符。注:group无需单独创建,注册用户时则会自动创建group。
        /// 产品建议:根据您的业务需求,可以将需要注册的用户,按照业务划分,分配到不同的group下,例如按照会员手机尾号作为groupid,用于刷脸支付、会员计费消费等,这样可以尽可能控制每个group下的用户数与人脸数,提升检索的准确率
        /// 
        /// 参数包含append、replace。如果为“replace”,则每次注册时进行替换replace(新增或更新)操作,默认为append操作。例如:uid在库中已经存在时,对此uid重复注册时,新注册的图片默认会追加到该uid下,如果手动选择action_type:replace,则会用新图替换库中该uid下所有图片。
        /// 
        /// log_id	是	number	请求标识码,随机数,唯一
        /// 
        public static JObject FaceRegister(byte[] ImageByte,string uid,string userinfo,List group_id, string action_type="append")
        {
            return Execute(client.User.Register(ImageByte, uid, userinfo, group_id, action_type));
        }

        /// 
        /// 人脸更新
        /// 
        /// 用于对人脸库中指定用户,更新其下的人脸图像。
        /// 
        /// 说明:针对一个uid执行更新操作,新上传的人脸图像将覆盖此uid原有所有图像。
        /// 
        /// 图片数据
        /// 用户id(由数字、字母、下划线组成),长度限制128B
        /// 新的user_info信息
        /// 	用户组id(由数字、字母、下划线组成),长度限制48
        /// 执行更新操作,如果该uid不存在时,会返回错误。如果添加了action_type:replace,则不会报错,并自动注册该uid,操作结果等同注册新用户。
        /// 
        public static JObject FaceUpdate(byte[] ImageByte,string uid,string userinfo,string group_id,string action_type="")
        {
            return Execute(client.User.Update(ImageByte, uid, group_id, userinfo, action_type));
        }

        /// 
        /// 人脸删除
        /// 
        /// 用于从人脸库中删除一个用户。
        /// 
        /// 人脸删除注意事项:
        ///删除的内容,包括用户所有图像和身份信息;
        ///如果一个uid存在于多个用户组内且没有指定group_id,将会同时将从各个组中把用户删除
        ///如果指定了group_id,则只删除此group下的uid相关信息
        /// 
        /// 用户id(由数字、字母、下划线组成),长度限制128B
        /// 	删除指定group_id中的uid信息
        /// log_id	是	number	请求标识码,随机数,唯一
        public static JObject FaceDelete(string uid,List group_id)
        {
            if (group_id.Count == 0)
                return Execute(client.User.Delete(uid));
            else
                return Execute(client.User.Delete(uid, group_id));
        }

        /// 
        /// 用户信息查询
        /// 
        /// 用于查询人脸库中某用户的详细信息。
        /// 
        /// 用户id(由数字、字母、下划线组成),长度限制128B
        /// 
        /// 字段	是否必选	类型	说明
        /// log_id	是	number	请求标识码,随机数,唯一
        ///result 是   array 结果数组
        ///+uid 是   string 匹配到的用户id
        ///+user_info 是   string 注册时的用户信息
        ///+groups 是   array 用户所属组列表
        /// 
        public static JObject UserInfo(string uid)
        {
            return Execute(client.User.GetInfo(uid));
        }

        /// 
        /// 组列表查询
        /// 
        /// 用于查询用户组的列表。
        /// 
        /// 默认值0,起始序号
        /// 返回数量,默认值100,最大值1000
        /// 
        /// 字段	是否必选	类型	说明
        ///log_id 是   number 请求标识码,随机数,唯一
        /// result_num  是 number  返回个数
        /// result  是 array   group_id列表
        /// 
        public static JObject GroupList(int start=0,int num=100)
        {
            return Execute(client.Group.GetAllGroups(start, num));
        }

        /// 
        /// 组内用户列表查询
        /// 
        /// 用于查询指定用户组中的用户列表。
        /// 
        /// 用户组id
        /// 默认值0,起始序号
        /// 返回数量,默认值100,最大值1000
        /// 
        /// 字段	是否必选	类型	说明
        ///log_id 是   number 请求标识码,随机数,唯一
        ///result_num  是 number  返回个数
        ///result  是 array   user列表
        ///+uid 是   string 用户id
        ///+user_info 是   string 用户信息
        /// 
        public static JObject GroupUsers(string group_id, int start = 0, int num = 100)
        {
            return Execute(client.Group.GetUsers(group_id, start, num));
        }

        /// 
        /// 组间复制用户
        /// 
        /// 用于将已经存在于人脸库中的用户添加到一个新的组。
        /// 并不是向一个指定组内添加用户,而是直接从其它组复制用户信息
        /// 
        /// 用户id
        /// 从指定group里复制信息
        /// 需要添加信息的组id列表
        /// 
        /// 字段 是否必选    类型 说明
        ///log_id 是   number 请求标识码,随机数,唯一
        /// 
        public static JObject GroupAddUser(string user_id,string from_group_id,List to_group_id)
        {
            return Execute(client.Group.AddUser(to_group_id, user_id, from_group_id));
        }

        /// 
        /// 组内删除用户
        /// 
        /// 用于将用户从某个组中删除,但不会删除用户在其它组的信息。
        /// 
        /// 当用户仅属于单个分组时,本接口将返回错误,请使用人脸删除接口
        /// 
        /// 用户id
        /// 用户组id列表
        /// 
        /// 字段	是否必选	类型	说明
        /// log_id 是   number 请求标识码,随机数,唯一
        /// 
        public static JObject GroupDeleteUser(string user_id,List group_id)
        {
            return Execute(client.Group.DeleteUser(group_id, user_id));
        }

        private static JObject Execute(JObject result)
        {
            if (result.Properties().Any(p => p.Name == "error_code"))
            {
                MessageBox.Show(ErrorDictionary[Convert.ToInt32(result["error_code"])]);
                return result;
            }
            else
                return result;
        }
    }
}

 

快速部署解决方案,请尝试一下我编写的SDK-CLI脚手架。

https://gitee.com/Jack.Zhou/Baidu.AI

收藏
点赞
1
个赞
共3条回复 最后由用户已被禁言回复于2022-04
#4shoranxfyzhy回复于2018-03

这个参数说明写的很详细呀,很有用,非常感谢楼主

0
#3用户已被禁言回复于2017-11

很详细的参数内容

0
#2卡农LLLL回复于2017-11

沙发.拜读...等空了玩玩.

0
TOP
切换版块