DevStore首页 > DEV资源 > 服务评测下载 > 百度媒体云人脸识别iOS版服务评测

百度媒体云人脸识别iOS版服务评测

查看服务>>
DevStore编辑 陈西瑞 | 2015-02-11 11:00    浏览量(9451)    纠错    评论(4)    百度媒体云人脸识别服务详情>>

服务评测作者

  • 12 能力值
  • 0 源码
  • 6 评测
  • 0 资料

评测目录

集成测试

评测环境

3G/WIFI网络下:

测试环境

Mac OS X 10.10.1+Xcode 6.1.1

测试对象

百度媒体云人脸识别服务

测试手机

iPhone 5S

系统版本

iOS 8.1.2

手机网络

3G/WIFI

测试内容

百度媒体云

人脸识别服务(iOS)

测试版本

V1.04

测试时间

2015/1/19 17:00-2015/1/20 16:40

基本参数:

支持平台

Android,iOS,Linux,windows,Mac OS

人脸检测

支持

人脸分析

支持

人脸识别

支持

安装包大小

无(REST API)

支持语言

支持跨平台REST API 的调用

集成过程

客户端集成

1. 百度开发者中心创建工程

工程创建地址: 

http://developer.baidu.com/console#app/project,创建名为的” DevStore_百度媒体云人脸识别_评测Demo"的项目工程

创建工程

工程创建完成,但是现在还不能使用,使用人脸识别需要开通人脸识别服务的权限。

基本信息

申请开通人脸识别服务(没有审核通过是不能使用人脸识别服务的)

申请开通人脸识别服务

申请开通人脸识别服务

申请到通过大概一天左右的时间

申请到通过大概一天左右的时间

下载人脸识别开发文档(百度媒体云人脸识别没有提供客户端使用的SDK,笔者就使用的API,封装了使用简单的client,后面评测会提到

下载人脸识别开发文档

2. 开始集成

获取AccessToken授权

根据百度Oauth的ClientCredentials授权方式获得accessToken,后边调用识别方法会用到accessToken(具体百度Oauth介绍,参见http://developer.baidu.com/wiki/index.php?title=docs/oauth/client)

获取AccessToken授权

其中grant_type 的值固定为 client_credentials,client_id,client_secret分别是在百度开发者中心注册应用得到的Api Key,Secret Key(具体)

获取AccessToken成功如下

获取AccessToken成功

调用识别方法

API接口

API识别接口

https://openapi.baidu.com/rest/2.0/media/v1/face/detect

参数如下

query_string:将要识别的图片URL,get请求需要对这个参数进行URL编码

注:百度媒体云人脸识别不支持图片上传识别,实际使用中可以自行上传到自己服务器返回图片URL进行识别,或者使用第三方云存储服务

调用识别方法

代码集成

初始化,获取accessToken

 
/**
 *  初始化百度媒体云人脸识别获取accessToken
 *
 *  @param apiKey    开发平台申请应用的ApiKey
 *  @param apiSecret 开发平台申请应用的ApiSecret
 */
+(void)initializeWithApiKey: (NSString*)apiKey apiSecret:(NSString*) apiSecret
{
    
    if ([self getAccessToken]) {
        /**
         * accessToken没有过期则不再请求
         */
        if ([self isAccessTokenExpiresIn]) {
            
            return;
        }
    }
 
   
    __block STHTTPRequest *request= [STHTTPRequest requestWithURLString:ACCESS_TOKEN_URL];
    request.POSTDictionary=@{@"grant_type":@"client_credentials",@"client_id":apiKey,@"client_secret":apiSecret};
    
    __weak STHTTPRequest *weakRequest = request;
    __weak typeof(self) weakSelf = self;
    
    request.completionBlock = ^(NSDictionary *headers, NSString *body) {
        
        NSDictionary *tokenInfo=[NSJSONSerialization JSONObjectWithData:weakRequest.responseData options:0 error:NULL];
        NSLog(@"log --%@",tokenInfo);//token信息
        NSLog(@"access_token %@",tokenInfo[@"access_token"]);
        [weakSelf storeAcessToken:tokenInfo[@"access_token"]];//本地保存accessToken信息
        [weakSelf storeExpiresIn:[NSString stringWithFormat:@"%@",tokenInfo[@"expires_in"]]];//保存Token过期时间
        
    };
    /**
     *  请求出错
     */
    request.errorBlock = ^(NSError *error) {
        
        NSLog(@"error log %@",error.description);
    };
    
    [request startAsynchronous];
 
 
 
}
 
/**
 *  本地存储AccessToken
 *
 *  @param token AccessToken
 */
+(void)storeAcessToken:(NSString *)token
{
    NSUserDefaults *userDefault=[NSUserDefaults standardUserDefaults];
    [userDefault setValue:token forKey:@"AccessToken"];
    [userDefault synchronize];
}
 
/**
 *  获取本地存储的AccessToken
 *
 *  @return AccessToken
 */
+(NSString *)getAccessToken
{
 
    NSUserDefaults *userDefaults=[NSUserDefaults standardUserDefaults];
    return  [userDefaults valueForKey:@"AccessToken"];
 
}
 
 
 
/**
 *  存储有效期
 *
 *  @param expiresIn
 */
+(void)storeExpiresIn:(NSString *)expiresIn
{
    
    NSUserDefaults *userDefault=[NSUserDefaults standardUserDefaults];
    [userDefault setValue:[[NSDate date] dateByAddingTimeInterval:[expiresIn floatValue]] forKey:@"ExpiresIn"];
    [userDefault synchronize];
    
    
 
}
 
/**
 *  AccessToken是否还在有效期
 *
 *  @return YES:有效 NO:过期,需重新请求
 */
 
+(BOOL)isAccessTokenExpiresIn{
 
 
    NSUserDefaults *userDefault=[NSUserDefaults standardUserDefaults];
    
    NSDate *expiresInDate=[userDefault valueForKey:@"ExpiresIn"];
    
    NSDate *currentDate=[NSDate date];//当前date
   
    double timeInterenal= [expiresInDate timeIntervalSinceDate:currentDate];
    
    /**
     *  有效
     */
    if (timeInterenal > 0) {
        
        return YES;
    }
    
    
    
    return NO;
}

识别图片操作

#pragma mark -
 
 
/**
 *  图片URL识别图片
 *
 *  @param urlString    图片URL地址
 *  @param completBlock 识别完成
 *  @param error_msg    请求出错
 */
+(void)recognitionByImageURL:(NSString *)urlString complete:(void (^)(NSArray *faceAry, CGFloat img_width,CGFloat img_height))completBlock error:(void(^)(NSString *error_msg))error_msg{
 
 
    __block STHTTPRequest *request= [STHTTPRequest requestWithURLString:DETECT_URL];
    request.POSTDictionary=@{@"access_token":[self getAccessToken],@"url":urlString};
    
    __weak STHTTPRequest *weakRequest = request;
    
    request.completionBlock = ^(NSDictionary *headers, NSString *body) {
        
        NSDictionary *responseDic=[NSJSONSerialization JSONObjectWithData:weakRequest.responseData options:0 error:NULL];
        
        /**
         *  识别出错
         */
        if (responseDic[@"error_msg"]) {
            
            error_msg(responseDic[@"error_msg"]);
            
        }else
        {
            NSMutableArray *faceAry=[NSMutableArray array];
        
            for (NSDictionary *dic in responseDic[@"face"]) {
              
                FaceppPerson *facePerson=[FaceppPerson initWithFaceInfo:dic];
                [faceAry addObject:facePerson];
            
            }
            
            completBlock(faceAry,[responseDic[@"img_width"] floatValue],[responseDic[@"img_height"] floatValue]);
        
        }
        
        NSLog(@"results --- %@",weakRequest.responseString);
    };
    
    request.errorBlock = ^(NSError *error) {
        
        NSLog(@"error log --- %@",error.description);
    };
    
    [request startAsynchronous];
 
 
 
}

主要功能

百度媒体云人脸识别服务,依托百度业界领先的人脸识别算法,提供了人脸检测、五官定位、人脸属性检测等功能。

功能特色

单个人脸识别

单个人脸识别

单个人脸识别

合照多个人脸识别

合照多个人脸识别

合照多个人脸识别

人脸识别调用统计

人脸识别调用统计

DEMO展示

部分DEMO展示:

- (void)viewDidLoad {
    
       [super viewDidLoad];
  
        /* 这里有几个测试图片可以用
         
         http://www.sinaimg.cn/dy/slidenews/4_img/2014_50/704_1502765_436666.jpg
         http://img6.cache.netease.com/photo/0003/2014-12-15/ADGCHADJ00B60003.jpg
         
         //合照
         http://img.sucai.redocn.com/attachments/images/201204/20120406/Redocn_2012040606464958.jpg
         http://zj.sinaimg.cn/2013/1016/U9437P1134DT20131016063350.jpg
 
         */
    
    originalImageView=[[UIImageView alloc] init];
    [self.view addSubview:originalImageView];
    imageUrlString=@"http://img.sucai.redocn.com/attachments/images/201204/20120406/Redocn_2012040606464958.jpg";
    
    [RecognitionClient loadImageWithUrlString:imageUrlString image:^(UIImage *image) {
        
        [originalImageView setFrame:CGRectMake(0, 0, image.size.width/2, image.size.height/2)];
        [originalImageView setImage:image];
        
    }];
 
}
 
/**
 *  识别操作
 */
 
- (IBAction)faceRecognition:(UIButton *)sender {
    
    __weak typeof(self) weakSelf = self;
 
   [RecognitionClient recognitionByImageURL:imageUrlString complete:^(NSArray *faceAry, CGFloat img_width, CGFloat img_height) {
    
       [weakSelf drawFaceWithPosition:faceAry origin_imgWidth:img_width origin_imgHeight:img_height];
       
       } error:^(NSString *error_msg) {
    
           NSLog(@"Error_msg ------------ %@",error_msg);
       }];
    
}
 
/**
 *  根据识别结果画出人脸
 *
 *  @param faceAry    人脸数组
 *  @param img_width  识别图片的宽
 *  @param img_height 识别图片的高
 */
-(void)drawFaceWithPosition:(NSArray *)faceAry origin_imgWidth:(CGFloat)img_width origin_imgHeight:(CGFloat)img_height
{
 
   
    CGFloat inScreen_img_width  = img_width/2;
    CGFloat inScreen_img_height = img_height/2;
    
    for (FaceppPerson *facePerson in faceAry) {
        
        /*
         * 人脸
         */
        UIView *faceView=[[UIView alloc] init];
        faceView.backgroundColor=[UIColor clearColor];
        faceView.layer.borderColor=[UIColor greenColor].CGColor;
        faceView.layer.borderWidth=2.0;
        [originalImageView addSubview:faceView];
 
        
        [faceView setFrame:CGRectMake((facePerson.face_Center_x-facePerson.face_Width/2)*inScreen_img_width,(facePerson.face_Center_y-facePerson.face_Height/2)*inScreen_img_height,facePerson.face_Width*inScreen_img_width,facePerson.face_Height*inScreen_img_height)];
        
        
        
        /**
         *  左眼
         */
        
        UIView *left_Eye_View=[[UIView alloc] init];
        left_Eye_View.backgroundColor=[UIColor greenColor];
        [originalImageView addSubview:left_Eye_View];
        
        left_Eye_View.frame=CGRectMake(facePerson.eye_Left_x*inScreen_img_width, facePerson.eye_Left_y*inScreen_img_height, 3, 3);
        
        
        /**
         *  右眼
         */
        UIView *right_Eye_View=[[UIView alloc] init];
        right_Eye_View.backgroundColor=[UIColor greenColor];
        [originalImageView addSubview:right_Eye_View];
        
        right_Eye_View.frame=CGRectMake(facePerson.eye_Right_x*inScreen_img_width, facePerson.eye_Right_y*inScreen_img_height, 3, 3);
        
        
        /**
         *  嘴巴
         */
        
        UIView *mouthView=[[UIView alloc] initWithFrame:CGRectMake(0, 0, 3, 3)];
        mouthView.backgroundColor=[UIColor greenColor];
        [originalImageView addSubview:mouthView];
        
       [mouthView setCenter:CGPointMake(facePerson.mouth_Center_x*inScreen_img_width, facePerson.mouth_Center_y*inScreen_img_height)];
        
    }
 
 
 
}

测试日志

测试日志

测试日志

遇到问题

识别图片人脸方向如果出现错乱颠倒需要自己调整然后调用识别API。

识别图片分别率过高的话本地处理显示和绘制人脸区域都要进行等比例处理,不然会导致识别区域错位。

上手难易

集成难度一般,开发者需要仔细阅读REST API中识别结果返回的参数,根据返回的数据(百度媒体云人脸识别返回坐标进行了归一化,即0~1,评测demo中有详细绘制步骤可以供参考)坐标进行人脸识别区域的绘制。

开发文档

SDK文档地址http://developer.baidu.com/wiki/index.php?title=docs/cplat/media/face/sdk

百度媒体云人脸识别提供REST API的详细文档


开发文档

开发文档

此服务评测版权归DevStore所有,禁止转载,申请升级为 特约评测员 才可进行测评立即申请

声明:DevStore评测内容都是基于专业评测人员/开发者通过真实的测试之后得出的数据,服务版本实时都在更新,所以评测并不一定是此服务的最新版本,但我们会秉承公正专业精准的态度,对开发者负责,同时欢迎大家监督和建议,如对评测内容有异议,请提交纠错,由专业的评测团队再次评测,我们会尽最大努力为大家提供更贴心的服务。

DevStore_全球首家第三方开发者服务商店,最精准的服务对比、最专业的服务评测、最及时的行业动态,为开发者挑选服务提供最全面的参考和专业分析,加入DevStore,从此告别熬夜加班,你也可以这么帅!搜索微信号:DevStore

评论(4)
Zz

Zz 2015-08-07 10:11:13

可以用来打卡
回复(0) 赞(1) 赞(2)
炽天使

炽天使 2015-05-26 16:58:35

这个能实现人脸登陆吗
回复(1) 赞(0) 赞(1)
 
  • tassel:
    回复@炽天使:这个百度实现的功能比较单一,更多功能的话可以看下Face++
    回复2015-05-27 08:59:00
lynulzy

lynulzy 2015-03-05 11:10:51

主要在什么场景下使用呢?
回复(0) 赞(0) 赞(1)
hengli

hengli 2015-03-02 16:06:56

看起来好厉害
回复(0) 赞(0) 赞(1)