提起AI,想必大家感覺就是神秘莫測,結(jié)合現(xiàn)實(shí)。今天看了一下BaiduOCR的技術(shù)支持,大概實(shí)現(xiàn)了身份證,銀行卡,機(jī)動(dòng)車牌,圖片審核,這幾個(gè)案例的識(shí)別。不得不說百度對圖像的處理還是很強(qiáng)大的。根據(jù)開源出來的接口實(shí)現(xiàn)對以上功能的開發(fā)還是不錯(cuò)的。
廢話不多說,既然那么神秘,我們也可以試著自己做一個(gè)識(shí)別Demo,案例會(huì)在最下方提供
1.點(diǎn)擊鏈接BaiduAI
進(jìn)入控制臺(tái)登陸自己的百度云賬號


2.登陸成功會(huì)進(jìn)入自己的控制臺(tái),默認(rèn)開通的服務(wù)如下

我們以文字識(shí)別為例,點(diǎn)擊文字識(shí)別,

可以看到可用服務(wù)列表,并不是絕對免費(fèi)的。但是程序員拿來裝X應(yīng)該沒問題
3.創(chuàng)建應(yīng)用

圖中信息很明確,根據(jù)自己需要勾選相應(yīng)的功能,當(dāng)然部分功能是收費(fèi)的,具體收費(fèi)標(biāo)準(zhǔn)點(diǎn)這里

因?yàn)槌绦蛘Z言為Object-C 運(yùn)用于ios上,所以這里我直接勾選如上圖,(這里需要注意一點(diǎn),包名綁定這里,必須要綁定自己創(chuàng)建的工程Bundle Identifier。要不等你一切做好之后發(fā)現(xiàn)會(huì)提示不匹配工程)確認(rèn)無誤后點(diǎn)擊立即創(chuàng)建

創(chuàng)建成功,點(diǎn)擊應(yīng)用詳情,進(jìn)入自己創(chuàng)建的應(yīng)用查看詳情

拿到了自己的APPID,APIKey,SecretKey,記得保存一份,等下項(xiàng)目中要想實(shí)現(xiàn)以上功能必須通過這幾個(gè)東西生成BaiduOCR的Token用,才可以。下邊的API列表很詳細(xì)的告訴我們當(dāng)前這個(gè)項(xiàng)目接入的Api同時(shí)收費(fèi)情況一目了然。很清晰。
4.接入服務(wù)
到了這一步,相信你已經(jīng)成為一名合格的百度OCR的開發(fā)者了。下邊開始把OCR服務(wù)接入我們工程
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)服務(wù)地址https://aip.baidubce.com/oauth/2.0/token發(fā)送請求(推薦使用POST),并在URL中帶上以下參數(shù):
grant_type: 必須參數(shù),固定為client_credentials;
client_id: 必須參數(shù),應(yīng)用的API Key;
client_secret: 必須參數(shù),應(yīng)用的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識(shí)別功能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地址進(jìn)行查看
獲取Access Token 成功的話,我們可以根據(jù)AI開放平臺(tái)中的文字識(shí)別API技術(shù)文檔來搞事情了。
以身份證識(shí)別為例

從官方給出的API文檔可以看出,通過POST方法向BaiduAI服務(wù)器發(fā)起請求,重點(diǎn)是鏈接中必須攜帶剛才獲取的Access Token,由此可以看出我們在百度AI平臺(tái)創(chuàng)建應(yīng)用的重要性了。。。
頭部需攜帶一下參數(shù)
Content-Type application/x-www-form-urlencoded
重要的是Body中帶的參數(shù),

可以看出 image是必須攜帶的,并且要求還很多
圖像數(shù)據(jù),base64編碼,要求base64編碼后大小不超過4M,最短邊至少15px,最長邊最大4096px,支持jpg/png/bmp格式
要求一大串,不過沒辦法。想要獲取到數(shù)據(jù),還是要老老實(shí)實(shí)跟著文檔走。這個(gè)提出一個(gè)坑??巳鞗]找到原因(其實(shí)我也沒那么笨啊)
base64編碼,對于這個(gè)東西,真沒細(xì)心理解過。百度給出以下定義
/*
NSDataBase64Encoding64CharacterLineLength其作用是將生成的Base64字符串按照64個(gè)字符長度進(jìn)行等分換行
NSDataBase64Encoding76CharacterLineLength其作用是將生成的Base64字符串按照76個(gè)字符長度進(jìn)行等分換行
NSDataBase64EncodingEndLineWithCarriageReturn其作用是將生成的Base64字符串以回車結(jié)束
NSDataBase64EncodingEndLineWithLineFeed其作用是將生成的Base64字符串以換行結(jié)束。
*/
親測只有使用了NSDataBase64EncodingEndLineWithCarriageReturn這個(gè)枚舉的時(shí)候,圖片識(shí)別才不會(huì)報(bào)圖片格式錯(cuò)誤。具體原因不詳。有知道的麻煩不辭辛苦告知下
請求代碼示例
身份證識(shí)別
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'
到這里,其實(shí)基本功能已經(jīng)實(shí)現(xiàn)。我們正常的通過拍照,或者相冊中獲取過來的圖片,就可以識(shí)別出來了。