本文主要介绍iOS使用百度AI人脸检测实现简单的人脸年龄和性别检测。
效果图
首先在平台里注册账号
注册app后拥有API Key和Secret Key
获取Access Token
请求URL数据格式
向授权服务地址https://aip.baidubce.com/oauth/2.0/token发送请求(推荐使用POST),并在URL中带上以下参数:
grant_type: 必须参数,固定为client_credentials;
client_id: 必须参数,应用的API Key;
client_secret: 必须参数,应用的Secret Key;
例如:
https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=Va5yQRHlA4Fq5
利用AFNetworking库中POST请求:
//设API Key为123
//设Secret Key为456
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
[manager POST:@"https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=123&client_secret=456" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
AccessModel *accessModel = [[AccessModel alloc] initWithDictionary:responseObject error:nil];
successBlock(accessModel);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
}];
服务器返回的JSON文本参数如下:
access_token: 要获取的Access Token;
expires_in: Access Token的有效期(秒为单位,一般为1个月);
其他参数忽略,暂时不用;
故需要将Access Token取出再将值传给Manager
申请到Access Token后才可以进行人脸数据请求
注意事项:
请求体格式化:Content-Type为application/json,通过json格式化请求体。
Base64编码:请求的图片需经过Base64编码,图片的base64编码指将图片数据编码成一串字符串,使用该字符串代替图像地址。您可以首先得到图片的二进制,然后用Base64格式编码即可。需要注意的是,图片的base64编码是不包含图片头的,如data:image/jpg;base64,
图片格式:现支持PNG、JPG、JPEG、BMP,不支持GIF图片
UIImage *image = [UIImage imageNamed:@"mmm.jpg"];
NSData *data = UIImageJPEGRepresentation(image, 1.0f);
NSString *imageBase64 = [data base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
NSString *imageStr = [imageBase64 mutableCopy];
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//我这里实现了年龄,表情,性别的功能,若还想实现其他功能在 @"face_field"的值里添加即可
NSDictionary *paramDict = @{@"access_token":self.access, @"Content-Type":@"application/json",@"image":imageStr, @"image_type":@"BASE64", @"face_field": @"age,gender,expression"};
[manager POST:@"https://aip.baidubce.com/rest/2.0/face/v3/detect" parameters:paramDict progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
ImageModel *imageModel = [[ImageModel alloc] initWithDictionary:responseObject error:nil];
successBlock(imageModel);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"error == %@", error);
}];