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
请登录后评论
TOP
切换版块
这个参数说明写的很详细呀,很有用,非常感谢楼主
很详细的参数内容
沙发.拜读...等空了玩玩.