Uygulamanızdan Google Cloud API çağırmak için bir ara uygulama oluşturmanız gerekir Yetkilendirme işleyen ve API anahtarları gibi gizli değerleri koruyan REST API. Daha sonra yapmanız gerekenler bu ara hizmetle kimlik doğrulaması yapmak ve bu hizmetle iletişim kurmak için mobil uygulamanızda kod yazmanızı öneririz.
Bu REST API'yi oluşturmanın bir yolu da Firebase Authentication and Functions'ı kullanmaktır. Bu da size yönetilen, sunucusuz bir ağ geçidi Kimlik doğrulama yapan ve mobil uygulamanızdan çağrılabilen Google Cloud API'leri SDK'ları kullanabilirsiniz.
Bu kılavuzda, Cloud Vision API'yi uygulamanızdan ç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 üzerinden Cloud Vision'da faturalandırılan hizmetlere erişmesine olanak tanır. Devam etmeden önce bu kimlik doğrulama mekanizmasının kullanım alanınız için yeterli olup olmadığını değerlendirin.
ziyaret edin.Başlamadan önce
Projenizi yapılandırın
Firebase'i uygulamanıza henüz eklemediyseniz başlangıç kılavuzundaki adımlara bakın.Firebase bağımlılıklarını yükleyip yönetmek için Swift Package Manager'ı kullanın.
- Xcode'da, uygulamanız açıkken Dosya > Paket Ekle'yi tıklayın.
- İstendiğinde Firebase Apple platformlar SDK deposunu ekleyin:
- Firebase ML kitaplığını seçin.
-ObjC
işaretini, hedefinizin derleme ayarlarındaki Diğer Bağlayıcı İşaretleri bölümüne ekleyin.- İşlemi tamamladığınızda, Xcode otomatik olarak arka planda tutmalarını sağlayabilirsiniz.
https://github.com/firebase/firebase-ios-sdk.git
Sonra, bazı uygulama içi kurulum işlemleri gerçekleştirin:
- Uygulamanızda Firebase'i içe aktarın:
Swift
import FirebaseMLModelDownloader
Objective-C
@import FirebaseMLModelDownloader;
Birkaç yapılandırma adımı daha tamamladıktan sonra başlamaya hazırız:
-
Projeniz için Cloud tabanlı API'leri henüz etkinleştirmediyseniz etkinleştirin şimdi:
- Firebase ML Firebase konsolunun API'ler sayfası.
-
Projenizi daha önce Blaze fiyatlandırma planına yükseltmediyseniz Bunun için yeni sürüme geçin. (Yalnızca emin olun.)
Bulut tabanlı API'ler yalnızca Blaze düzeyindeki projelerde kullanılabilir.
- Cloud tabanlı API'ler henüz etkinleştirilmemişse Bulut tabanlı API'leri etkinleştir'i tıklayın. API'ler.
- Cloud'a erişimi engellemek için mevcut Firebase API anahtarlarınızı yapılandırın
Vision API:
- 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 haricindeki tüm mevcut API'leri ekleyin. API'yi ekleyin.
Çağrılabilir işlevi dağıtma
Ardından, uygulamanız ile Cloud arasında köprü kurmak için kullanacağınız Cloud Functions işlevini dağıtın
Vision API. functions-samples
deposu, örnek içeriyor
kullanabilirsiniz.
Varsayılan olarak, Cloud Vision API'ye bu işlev üzerinden erişmek yalnızca uygulamanızın kimliği doğrulanmış kullanıcılarının Cloud Vision API'ye erişmesini sağlayın. Şunları yapabilirsiniz: işlevi farklı gereksinimlere göre değiştirebilir.
İşlevi dağıtmak için:
- functions-samples deposunu klonlama veya indirme
ve
Node-1st-gen/vision-annotate-image
dizinine geçiş yapın: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'ınız yoksa yükleyin.
vision-annotate-image
içinde bir Firebase projesi başlatın dizin. İstendiğinde listeden projenizi seçin.firebase init
- İşlevi dağıtın:
firebase deploy --only functions:annotateImage
Firebase Auth'u uygulamanıza ekleyin
Yukarıda dağıtılan çağrılabilir işlev, kimliği doğrulanmamıştan gelen tüm istekleri reddeder en iyi uygulamaları paylaşacağız. Henüz yapmadıysanız Firebase'i Uygulamanız için kimlik doğrulama.
Gerekli bağımlılıkları uygulamanıza ekleyin
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'ı çağırmak için görüntünün base64 kodlu dize. BirUIImage
öğesini 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ğırın
Bir görüntüdeki önemli noktaları tanımak için JSON Cloud Vision isteği.Ö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 iki Tür'ü destekler
TEXT_DETECTION
veDOCUMENT_TEXT_DETECTION
. Cloud Vision OCR Belgelerini inceleyin. .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ındaki metni ayıkla
Metin tanıma işlemi başarılı olursa
BatchAnnotateImagesResponse
değeri, görevin sonucunda döndürülür. Metin ek açıklamaları şurada bulunabilir:
fullTextAnnotation
nesnesini tanımlayın.
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 belirli bölgelerine özel bilgileri de alabilirsiniz. Her block
için
paragraph
, word
ve symbol
, metnin bölgede tanınmasını sağlayabilirsiniz
ve bölgeyi sınırlayan koordinatlarıyla birlikte çalışır. Ö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];
}
}