Uygulamanızdan bir Google Cloud API'yi çağırmak için yetkilendirmeyi yapan ve API anahtarları gibi gizli değerleri koruyan bir ara REST API oluşturmanız gerekir. Ardından, bu ara hizmetle kimlik doğrulama yapmak ve iletişim kurmak için mobil uygulamanızda kod yazmanız gerekir.
Bu REST API'yi oluşturmanın bir yolu, Firebase Authentication ve Functions'ı kullanmaktır. Bu yöntem, kimlik doğrulamayı yöneten ve önceden oluşturulmuş SDK'larla mobil uygulamanızdan çağrılabilecek Google Cloud API'leri için yönetilen, sunucusuz bir ağ geçidi sağlar.
Bu kılavuzda, uygulamanızdan Cloud Vision API'yi çağırmak için bu tekniğin nasıl kullanılacağı gösterilmektedir. Bu yöntem, kimliği doğrulanmış tüm kullanıcıların Cloud projeniz aracılığıyla Cloud Vision'un faturalandırılan hizmetlerine erişmesine olanak tanır. Bu nedenle, devam etmeden önce bu kimlik doğrulama mekanizmasının kullanım alanınız için yeterli olup olmadığını düşünün.
Başlamadan önce
Projenizi yapılandırın
Firebase'i uygulamanıza henüz eklemediyseniz başlangıç kılavuzundaki adımları uygulayarak ekleyin.Firebase bağımlılarını yüklemek ve yönetmek için Swift Package Manager'ı kullanın.
Firebase SDK'larını Apple projenize eklemenin farklı yolları (ör. doğrudan çerçeveleri içe aktarma ve CocoaPods kullanma) hakkında bilgi edinmek için- Xcode'da, uygulamanız açıkken Dosya > Paket Ekle'ye gidin.
- İstendiğinde Firebase Apple platformları SDK deposunu ekleyin:
- Firebase ML kitaplığını seçin.
-ObjC
işaretini, hedefinizin derleme ayarlarının Diğer Bağlantı Oluşturucu İşaretleri bölümüne ekleyin.- İşlem tamamlandığında Xcode, arka planda bağımlılarınızı otomatik olarak çözümlemeye ve indirmeye başlar.
https://github.com/firebase/firebase-ios-sdk.git
Ardından, uygulama içi bazı ayarları yapın:
- Uygulamanızda Firebase'i içe aktarın:
Swift
import FirebaseMLModelDownloader
Objective-C
@import FirebaseMLModelDownloader;
Birkaç yapılandırma adımı daha uyguladıktan sonra hazır oluruz:
-
Projeniz için bulut tabanlı API'leri henüz etkinleştirmediyseniz şimdi etkinleştirin:
- Firebase konsolunun Firebase ML API'leri sayfasını açın.
-
Projenizi Blaze fiyatlandırma planına henüz yükseltmediyseniz bunu yapmak için Yükselt'i tıklayın. (Yükseltme işlemini yalnızca projeniz Blaze planında değilse yapmanız istenir.)
Cloud tabanlı API'ler yalnızca Blaze düzeyindeki projelerde kullanılabilir.
- Bulut tabanlı API'ler etkinleştirilmemişse Bulut tabanlı API'leri etkinleştir'i tıklayın.
- Mevcut Firebase API anahtarlarınızı Cloud Vision API'ye erişime izin vermeyecek şekilde yapılandırın:
- Cloud Console'un Kimlik bilgileri sayfasını açın.
- Listedeki her API anahtarı için düzenleme görünümünü açın ve Anahtar Kısıtlamaları bölümünde, Cloud Vision API'si hariç mevcut API'lerin tümünü listeye ekleyin.
Çağırılabilir işlevi dağıtma
Ardından, uygulamanız ile Cloud Vision API arasında köprü oluşturmak için kullanacağınız Cloud Functions işlevini dağıtın. functions-samples
deposunda kullanabileceğiniz bir örnek bulunmaktadır.
Varsayılan olarak, bu işlev aracılığıyla Cloud Vision API'ye erişmek yalnızca uygulamanızda kimliği doğrulanmış kullanıcıların Cloud Vision API'ye erişmesine olanak tanır. İşlevi farklı gereksinimlere göre değiştirebilirsiniz.
İşlevi dağıtmak için:
- functions-samples deposunu kopyalayın veya indirin ve
Node-1st-gen/vision-annotate-image
dizinine geçin:git clone https://github.com/firebase/functions-samples
cd Node-1st-gen/vision-annotate-image
- Bağımlılıkları yükleyin:
cd functions
npm install
cd ..
- Firebase CLI'niz yoksa yükleyin.
vision-annotate-image
dizininde bir Firebase projesi başlatın. İstendiğinde listeden projenizi seçin.firebase init
- İşlevi dağıtın:
firebase deploy --only functions:annotateImage
Firebase Auth'u uygulamanıza ekleme
Yukarıda dağıtılan çağrılabilir işlev, uygulamanızın kimliği doğrulanmamış kullanıcılarından gelen tüm istekleri reddeder. Henüz yapmadıysanız Firebase Auth'u uygulamanıza eklemeniz gerekir.
Uygulamanıza gerekli bağımlılıkları ekleme
Cloud Functions for Firebase kitaplığını yüklemek için Swift Package Manager'ı kullanın.
Artık resimlerdeki metinleri tanımaya hazırsınız.
1. Giriş resmini hazırlama
Cloud Vision'u çağırmak için görüntünün base64 kodlu bir dize olarak biçimlendirilmesi gerekir.UIImage
dosyasını işlemek için:
Swift
guard let imageData = uiImage.jpegData(compressionQuality: 1.0) else { return } let base64encodedImage = imageData.base64EncodedString()
Objective-C
NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f); NSString *base64encodedImage = [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
2. Metni tanımak için çağrılabilir işlevi çağırma
Bir resimdeki önemli yerleri tanımak için JSON Cloud Vision isteği ile çağırılabilir işlevi çağırın.Öncelikle bir Cloud Functions örneğini başlatın:
Swift
lazy var functions = Functions.functions()
Objective-C
@property(strong, nonatomic) FIRFunctions *functions;
İsteği oluşturun. Cloud Vision API, metin algılama için iki tür destekler:
TEXT_DETECTION
veDOCUMENT_TEXT_DETECTION
. İki kullanım alanı arasındaki fark için Cloud Vision OCR belgelerine bakın.Swift
let requestData = [ "image": ["content": base64encodedImage], "features": ["type": "TEXT_DETECTION"], "imageContext": ["languageHints": ["en"]] ]
Objective-C
NSDictionary *requestData = @{ @"image": @{@"content": base64encodedImage}, @"features": @{@"type": @"TEXT_DETECTION"}, @"imageContext": @{@"languageHints": @[@"en"]} };
Son olarak işlevi çağırın:
Swift
do { let result = try await functions.httpsCallable("annotateImage").call(requestData) print(result) } catch { if let error = error as NSError? { if error.domain == FunctionsErrorDomain { let code = FunctionsErrorCode(rawValue: error.code) let message = error.localizedDescription let details = error.userInfo[FunctionsErrorDetailsKey] } // ... } }
Objective-C
[[_functions HTTPSCallableWithName:@"annotateImage"] callWithObject:requestData completion:^(FIRHTTPSCallableResult * _Nullable result, NSError * _Nullable error) { if (error) { if ([error.domain isEqualToString:@"com.firebase.functions"]) { FIRFunctionsErrorCode code = error.code; NSString *message = error.localizedDescription; NSObject *details = error.userInfo[@"details"]; } // ... } // Function completed succesfully // Get information about labeled objects }];
3. Tanınan metin bloklarından metin ayıklama
Metin tanıma işlemi başarılı olursa görev sonucunda BatchAnnotateImagesResponse biçiminde bir JSON yanıtı döndürülür. Metin ek açıklamaları fullTextAnnotation
nesnesinde bulunabilir.
Tanınan metni text
alanında dize olarak alabilirsiniz. Örneğin:
Swift
let annotation = result.flatMap { $0.data as? [String: Any] }
.flatMap { $0["fullTextAnnotation"] }
.flatMap { $0 as? [String: Any] }
guard let annotation = annotation else { return }
if let text = annotation["text"] as? String {
print("Complete annotation: \(text)")
}
Objective-C
NSDictionary *annotation = result.data[@"fullTextAnnotation"];
if (!annotation) { return; }
NSLog(@"\nComplete annotation:");
NSLog(@"\n%@", annotation[@"text"]);
Resmin bölgelerine özgü bilgiler de alabilirsiniz. Her block
, paragraph
, word
ve symbol
için bölgede tanınan metni ve bölgenin sınır koordinatlarını alabilirsiniz. Örneğin:
Swift
guard let pages = annotation["pages"] as? [[String: Any]] else { return }
for page in pages {
var pageText = ""
guard let blocks = page["blocks"] as? [[String: Any]] else { continue }
for block in blocks {
var blockText = ""
guard let paragraphs = block["paragraphs"] as? [[String: Any]] else { continue }
for paragraph in paragraphs {
var paragraphText = ""
guard let words = paragraph["words"] as? [[String: Any]] else { continue }
for word in words {
var wordText = ""
guard let symbols = word["symbols"] as? [[String: Any]] else { continue }
for symbol in symbols {
let text = symbol["text"] as? String ?? ""
let confidence = symbol["confidence"] as? Float ?? 0.0
wordText += text
print("Symbol text: \(text) (confidence: \(confidence)%n")
}
let confidence = word["confidence"] as? Float ?? 0.0
print("Word text: \(wordText) (confidence: \(confidence)%n%n")
let boundingBox = word["boundingBox"] as? [Float] ?? [0.0, 0.0, 0.0, 0.0]
print("Word bounding box: \(boundingBox.description)%n")
paragraphText += wordText
}
print("%nParagraph: %n\(paragraphText)%n")
let boundingBox = paragraph["boundingBox"] as? [Float] ?? [0.0, 0.0, 0.0, 0.0]
print("Paragraph bounding box: \(boundingBox)%n")
let confidence = paragraph["confidence"] as? Float ?? 0.0
print("Paragraph Confidence: \(confidence)%n")
blockText += paragraphText
}
pageText += blockText
}
}
Objective-C
for (NSDictionary *page in annotation[@"pages"]) {
NSMutableString *pageText = [NSMutableString new];
for (NSDictionary *block in page[@"blocks"]) {
NSMutableString *blockText = [NSMutableString new];
for (NSDictionary *paragraph in block[@"paragraphs"]) {
NSMutableString *paragraphText = [NSMutableString new];
for (NSDictionary *word in paragraph[@"words"]) {
NSMutableString *wordText = [NSMutableString new];
for (NSDictionary *symbol in word[@"symbols"]) {
NSString *text = symbol[@"text"];
[wordText appendString:text];
NSLog(@"Symbol text: %@ (confidence: %@\n", text, symbol[@"confidence"]);
}
NSLog(@"Word text: %@ (confidence: %@\n\n", wordText, word[@"confidence"]);
NSLog(@"Word bounding box: %@\n", word[@"boundingBox"]);
[paragraphText appendString:wordText];
}
NSLog(@"\nParagraph: \n%@\n", paragraphText);
NSLog(@"Paragraph bounding box: %@\n", paragraph[@"boundingBox"]);
NSLog(@"Paragraph Confidence: %@\n", paragraph[@"confidence"]);
[blockText appendString:paragraphText];
}
[pageText appendString:blockText];
}
}