提起AI,想必大家感覺就是神秘莫測数苫,結(jié)合現(xiàn)實聪舒。今天看了一下BaiduOCR的技術支持,大概實現(xiàn)了身份證虐急,銀行卡箱残,機動車牌,圖片審核止吁,這幾個案例的識別被辑。不得不說百度對圖像的處理還是很強大的。根據(jù)開源出來的接口實現(xiàn)對以上功能的開發(fā)還是不錯的敬惦。
廢話不多說盼理,既然那么神秘,我們也可以試著自己做一個識別Demo俄删,案例會在最下方提供
1.點擊鏈接BaiduAI
進入控制臺登陸自己的百度云賬號
2.登陸成功會進入自己的控制臺宏怔,默認開通的服務如下
我們以文字識別為例,點擊文字識別畴椰,
可以看到可用服務列表臊诊,并不是絕對免費的。但是程序員拿來裝X應該沒問題
3.創(chuàng)建應用
圖中信息很明確斜脂,根據(jù)自己需要勾選相應的功能抓艳,當然部分功能是收費的,具體收費標準點這里
因為程序語言為Object-C 運用于ios上秽褒,所以這里我直接勾選如上圖壶硅,(這里需要注意一點威兜,包名綁定這里销斟,必須要綁定自己創(chuàng)建的工程Bundle Identifier。要不等你一切做好之后發(fā)現(xiàn)會提示不匹配工程)確認無誤后點擊立即創(chuàng)建
創(chuàng)建成功椒舵,點擊應用詳情蚂踊,進入自己創(chuàng)建的應用查看詳情
拿到了自己的APPID,APIKey笔宿,SecretKey犁钟,記得保存一份棱诱,等下項目中要想實現(xiàn)以上功能必須通過這幾個東西生成BaiduOCR的Token用,才可以涝动。下邊的API列表很詳細的告訴我們當前這個項目接入的Api同時收費情況一目了然迈勋。很清晰。
4.接入服務
到了這一步醋粟,相信你已經(jīng)成為一名合格的百度OCR的開發(fā)者了靡菇。下邊開始把OCR服務接入我們工程
1.獲取百度OCR Access Token
根據(jù)官方文檔獲取Access Token并保存到本地(注意token有效期為30天,過期需要重新獲取接口保存token)
static NSString * const BaiduAppID = @"9991413";
static NSString * const BaiduApiKey = @"E2jIt1TZqt1EVYGVdH3L1Tb3";
static NSString * const BaiduSecretKey = @"kIf9V9BktenQCFG8EpmlWChvlTz6GKbl";
static NSString * const BaiduAccess_tokenUrl = @"https://aip.baidubce.com/oauth/2.0/token";
#pragma mark - 獲取百度AIAccess Token米愿。有效期為30天
- (void)getBaiduAIAccessToken{
/*
請求URL數(shù)據(jù)格式
向授權(quán)服務地址https://aip.baidubce.com/oauth/2.0/token發(fā)送請求(推薦使用POST)厦凤,并在URL中帶上以下參數(shù):
grant_type: 必須參數(shù),固定為client_credentials育苟;
client_id: 必須參數(shù)较鼓,應用的API Key;
client_secret: 必須參數(shù)违柏,應用的Secret Key博烂;
https://aip.baidubce.com/oauth/2.0/token?
grant_type=client_credentials&
client_id=Va5yQRHlA4Fq4eR3LT0vuXV4&
client_secret= 0rDSjzQ20XUj5itV7WRtznPQSzr5pVw2&
*/
// [[AipOcrService shardService] authWithAK:@"sLdWP9rGQ7iu63Pi4hvUP3qw" andSK:@"WF2fWKb8lQ2bfGB5MAAsixIGXCUzWipX"];
NSMutableDictionary * dictionary = [[NSMutableDictionary alloc]init];
[dictionary setObject:@"client_credentials" forKey:@"grant_type"];
[dictionary setObject:BaiduApiKey forKey:@"client_id"];
[dictionary setObject:BaiduSecretKey forKey:@"client_secret"];
[NetWorkTool postNetWorkWithURL:BaiduAccess_tokenUrl paramaters:dictionary success:^(id object) {
NSLog(@"%@",object);
NSString * access_token = [object objectForKey:@"access_token"];
NSString * expiresHaveTime = [NSString stringWithFormat:@"%@",[object objectForKey:@"expires_in"]];
[[NSUserDefaults standardUserDefaults] setObject:access_token forKey:AccessTokenKey];
[[NSUserDefaults standardUserDefaults] setObject:expiresHaveTime forKey:TokenValidity];
[[NSUserDefaults standardUserDefaults] synchronize];
NSInteger validityTime = [expiresHaveTime integerValue];
if (validityTime <=0 || !validityTime) {
UIAlertController * alertC = [UIAlertController alertControllerWithTitle:@"Warring" message:@"您使用的百度AI識別功能Access_Token已失效,請重新獲取" preferredStyle:UIAlertControllerStyleActionSheet];
UIAlertAction * confirmAction = [UIAlertAction actionWithTitle:@"確定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
[self.window.rootViewController dismissViewControllerAnimated:YES completion:^{
}];
}];
[alertC addAction:confirmAction];
[self.window.rootViewController presentViewController:alertC animated:YES completion:nil];
}
} failure:^(id failure) {
NSLog(@"%@",failure);
}];
}
這里請求數(shù)據(jù)用到了自己對AFNetworking的簡單封裝漱竖,有興趣可以到文章最后Demo地址進行查看
獲取Access Token 成功的話脖母,我們可以根據(jù)AI開放平臺中的文字識別API技術文檔來搞事情了。
以身份證識別為例
從官方給出的API文檔可以看出闲孤,通過POST方法向BaiduAI服務器發(fā)起請求谆级,重點是鏈接中必須攜帶剛才獲取的Access Token,由此可以看出我們在百度AI平臺創(chuàng)建應用的重要性了讼积。肥照。。
頭部需攜帶一下參數(shù)
Content-Type application/x-www-form-urlencoded
重要的是Body中帶的參數(shù)勤众,
可以看出 image是必須攜帶的舆绎,并且要求還很多
圖像數(shù)據(jù),base64編碼们颜,要求base64編碼后大小不超過4M吕朵,最短邊至少15px,最長邊最大4096px,支持jpg/png/bmp格式
要求一大串窥突,不過沒辦法努溃。想要獲取到數(shù)據(jù),還是要老老實實跟著文檔走阻问。這個提出一個坑梧税。卡了三天沒找到原因(其實我也沒那么笨啊)
base64編碼,對于這個東西第队,真沒細心理解過哮塞。百度給出以下定義
/*
NSDataBase64Encoding64CharacterLineLength其作用是將生成的Base64字符串按照64個字符長度進行等分換行
NSDataBase64Encoding76CharacterLineLength其作用是將生成的Base64字符串按照76個字符長度進行等分換行
NSDataBase64EncodingEndLineWithCarriageReturn其作用是將生成的Base64字符串以回車結(jié)束
NSDataBase64EncodingEndLineWithLineFeed其作用是將生成的Base64字符串以換行結(jié)束。
*/
親測只有使用了NSDataBase64EncodingEndLineWithCarriageReturn這個枚舉的時候凳谦,圖片識別才不會報圖片格式錯誤忆畅。具體原因不詳。有知道的麻煩不辭辛苦告知下
請求代碼示例
身份證識別
curl -i -k 'https://aip.baidubce.com/rest/2.0/ocr/v1/idcard?access_token=24.f2c915b857ee62189abb7f92df0e8453.2592000.1499493935.282335-9395294' --data 'id_card_side=front&image=【圖片Base64編碼尸执,需UrlEncode】' -H 'Content-Type:application/x-www-form-urlencoded'
到這里邻眷,其實基本功能已經(jīng)實現(xiàn)。我們正常的通過拍照剔交,或者相冊中獲取過來的圖片肆饶,就可以識別出來了。