iOS技术资料iOS开发进阶

人脸识别face++实现搜索相似明星脸

2017-10-16  本文已影响0人  清隐道人

最近比较闲,做了这个功能,用face++,试用账号,自己写着玩,挺好玩的。正式收费,而且很贵,想了解去face++官网看,本文附github ios demo,并沿用了face++demo的人脸分析的功能,但略有不同,并实现了识别物体,很简单,都是postAPI。
效果图:
人脸分析、支持多头像


WechatIMG11.jpeg

匹配明星脸


WechatIMG9.jpeg

辨识物体和场景 不准确辨识度差用来玩可以,项目就不要用了

WechatIMG10.jpeg
face++提供的 1:n 搜索功能,我只是利用这个接口用我的思路实现了下搜索明星脸,还可以实现别的,比如可以找到基本上大部分我们的照片,搜索的时候有个阈值,做个判断,越大越相似,搜相似的时候设的小一点,如果阈值小于设定值,则没有查到数据,搜自己本人的其他照片的时候设的大一点,以保证是本人,而不是相似的别人,不过有个缺陷就是,每调一次,它只会返给一个最相似的facetoken,如果想返回一堆图片比较困难,得对人脸集合进行删除,再查的操作。最后查完后,还得把删除的这些都再加回人脸集合里,为了下次查询可以查到一样的数据。下面介绍下我的demo的思路。
一、创建明星脸库 (三种方式)
1.移动端配合后台实现:也就是说开发的时候,先从自己服务器请求明星数组urls,创建一个唯一标识的人脸集合对象,这个对象在face++那是一个唯一的,类似于数据库的表,urls的每个图片传给face++的人脸集合对象,每添加一个图片,face++给你返一个facetoken,然后你把facetoken和url和名字等信息绑定传给自己服务器储存。
2.完全移动端实现:从网上下载明星脸图片n个,放入项目中,与face++交互类似于1,只不过需要本地储存facetoken和图片和明星名字和图片名字等其他信息绑定,我选择的是plist储存到本地,然后把这个储存好的文件拖到bundle,这个库供第二步搜索显示信息的时候使用,我的demo是完全移动端实现的,缺点是库越大,包越大。
3.服务器实现:和1的行为一样,直接储存即可,接口都一样,都是face++的一个post请求而已。
注意:
1.第一步最好每个图片只添加集合一次,因为你重新跑一遍程序,他就又会添加一次,添加到集合的图片会重复,当然facetoken不唯一,重复也没事,但是一个集合只能创建1000个facetoken。如果是一、1.或一、2,第一步实现一次即可;如果是一、3移动端不用做第一步。
2.face++服务器人脸集合支持增删改查,通过facetoken,一般不出错的情况下,用不到这些方法,在创建明星库的时候,它会先识别图片中的人脸,如果检测失败,它就添加失败了,所以加进去的都是成功的,有的图片是检测不到人脸的,图片有大小要求,不能太大不能太小,人脸太小也可能检测不出来。
二、搜索相似脸
由移动端实现:第一步的行为是自己创建库用的,在正式发布的环境,也就是说真正使用的时候,移动端不调用第一步。
1.移动端配合后台实现第一步的,在第二步里,直接通过第一步设置的那个唯一标识拿到人脸集合对象,调用api,将要搜索的图片以url或file二进制流或base64传给人脸集合,face++会返给你facetoken,你拿上这个facetoken去自己服务器请求图片的那个url,显示明星图片和姓名等信息。
2.完全移动端实现的,在第二步里与face++交互与二、1一样,最后拿facetoken从本地plist文件里取出对应的图片名,明星名称等信息。
3.完全服务器实现第一步的,在第二步里,跟后台要到唯一的人脸集合标识,然后和二、1的实现一样。
三、运行我的demo https://github.com/qingyindaoren/face-SearchStar.git
1.替换自己的appkey、secret,一个试用账号只支持5个设备 1C4972F4-FD1D-4024-A32D-83B9A4D45987.png

2.自己创建一次库,然后才能实现功能。
在SearchFaceViewController里slecteimage方法里仔细看注释。

//选取图片
- (IBAction)selectImage:(UIButton *)sender {
    UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:nil message:@"添加图片" preferredStyle:UIAlertControllerStyleAlert];
    __weak typeof(self) weakSelf = self;

    UIAlertAction *libAction = [UIAlertAction actionWithTitle:@"打开相册" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        UIImagePickerController *picker = [[UIImagePickerController alloc] init];
        picker.delegate = weakSelf;
        picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
        [weakSelf presentViewController:picker animated:YES completion:nil];
    }];
    [alertVC addAction:libAction];

    UIAlertAction *cameraAction = [UIAlertAction actionWithTitle:@"打开相机" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        UIImagePickerController *picker = [[UIImagePickerController alloc] init];
        picker.delegate = weakSelf;
        picker.sourceType = UIImagePickerControllerSourceTypeCamera;
        [weakSelf presentViewController:picker animated:YES completion:nil];
    }];
    [alertVC addAction:cameraAction];

    UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {

    }];
    [alertVC addAction:cancelAction];

    [self presentViewController:alertVC animated:YES completion:nil];
//刚拿到demo把这个方法里下面注释的放开,把上面的注掉
//    //创建明星集合 这个方法只调用一次  添加时打印出face.plist的路径,添加库完毕后,把储存好的那个face.plist移除来,替换左边images文件夹里的那个face.plist。然后把上面的打开,把下面的注掉。
//   NSDictionary *dataDict = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"imagelist" ofType:@"plist"]];
//    NSArray *images = [NSArray arrayWithArray:dataDict[@"starts"]];
//    self.images = images;
//    if (self.faceIndex<72) {
//        UIImage *image = [UIImage imageNamed:images[self.faceIndex]];
//
//        [self addImage: image];
//
//    }else{
//         MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
//        hud.label.text = @"完成";
//        [hud hideAnimated:YES afterDelay:1.5];
//    }

    
    
}
上一篇 下一篇

猜你喜欢

热点阅读