人臉識別face++實現搜索相似明星臉

最近比較閑,做了這個功能,用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];
//    }

    
    
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容