Uygulamanızdan bir Google Cloud API'sini çağırmak için yetkilendirmeyi işleyen ve API anahtarları gibi gizli değerleri koruyan bir ara REST API oluşturmanız gerekir. Ardından, bu ara hizmette kimlik doğrulaması yapmak ve iletişim kurmak için mobil uygulamanıza kod yazmanız gerekir.
Bu REST API'yi oluşturmanın bir yolu, size Google Cloud API'lerine yönelik, kimlik doğrulamayı işleyen ve önceden oluşturulmuş SDK'larla mobil uygulamanızdan çağrılabilen, yönetilen, sunucusuz bir ağ geçidi sağlayan Firebase Authentication and Functions'ı kullanmaktır.
Bu kılavuz, uygulamanızdan Cloud Vision API'yi çağırmak için bu tekniğin nasıl kullanılacağını gösterir. Bu yöntem, kimliği doğrulanmış tüm kullanıcıların Bulut projeniz aracılığıyla Cloud Vision faturalı hizmetlere erişmesine izin verecektir; bu nedenle, devam etmeden önce bu kimlik doğrulama mekanizmasının kullanım durumunuz için yeterli olup olmadığını düşünün.
Sen başlamadan önce
Projenizi yapılandırın
Uygulamanıza henüz Firebase'i eklemediyseniz, başlangıç kılavuzundaki adımları izleyerek bunu yapın.Firebase bağımlılıklarını kurmak ve yönetmek için Swift Paket Yöneticisi'ni kullanın.
- Xcode'da, uygulama projeniz açıkken File > Add Packages seçeneğine gidin.
- İstendiğinde, Firebase Apple platformları SDK deposunu ekleyin:
- Firebase ML kitaplığını seçin.
- Bittiğinde, Xcode otomatik olarak bağımlılıklarınızı arka planda çözmeye ve indirmeye başlayacaktır.
https://github.com/firebase/firebase-ios-sdk
Ardından, bazı uygulama içi kurulumları gerçekleştirin:
- Uygulamanızda Firebase'i içe aktarın:
Süratli
import FirebaseMLModelDownloader
Amaç-C
@import FirebaseMLModelDownloader;
Birkaç yapılandırma adımı daha ve başlamaya hazırız:
Projeniz için Bulut tabanlı API'leri henüz etkinleştirmediyseniz, şimdi yapın:
- Firebase konsolunun Firebase ML API'leri sayfasını açın.
Projenizi henüz Blaze fiyatlandırma planına yükseltmediyseniz, bunu yapmak için Yükselt'e tıklayın. (Yalnızca projeniz Blaze planında değilse yükseltme yapmanız istenir.)
Yalnızca Blaze düzeyindeki projeler Bulut tabanlı API'leri kullanabilir.
- Bulut tabanlı API'ler zaten etkinleştirilmemişse Bulut Tabanlı API'leri Etkinleştir 'i tıklayın.
- Cloud Vision API'ye erişime izin vermemek için mevcut Firebase API anahtarlarınızı yapılandırın:
- Bulut konsolunun 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 hariç tüm kullanılabilir API'leri listeye ekleyin.
Çağrılabilir işlevi dağıtın
Ardından, uygulamanız ile Cloud Vision API arasında köprü oluşturmak için kullanacağınız Bulut İşlevini dağıtın. functions-samples
deposu, kullanabileceğiniz bir örnek içerir.
Varsayılan olarak, bu işlev aracılığıyla Cloud Vision API'ye erişmek, yalnızca uygulamanızın kimliği doğrulanmış kullanıcılarının Cloud Vision API'ye erişmesine izin verir. Fonksiyonu farklı gereksinimler için değiştirebilirsiniz.
İşlevi dağıtmak için:
- İşlev örnekleri deposunu klonlayın veya indirin ve
vision-annotate-image
dizinine geçin:git clone https://github.com/firebase/functions-samples
cd vision-annotate-image
- Bağımlılıkları yükleyin:
cd functions
npm install
cd ..
- Firebase CLI'niz yoksa onu kurun .
-
vision-annotate-image
dizininde bir Firebase projesi başlatın. İstendiğinde, listeden projenizi seçin.firebase init
- Şu işlevi dağıtın:
firebase deploy --only functions:annotateImage
Uygulamanıza Firebase Auth'u ekleyin
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 reddedecektir. Henüz yapmadıysanız , uygulamanıza Firebase Auth'u eklemeniz gerekir.
Uygulamanıza gerekli bağımlılıkları ekleyin
Firebase kitaplığı için Cloud Functions'ı yüklemek için Swift Paket Yöneticisi'ni kullanın.
Artık resimlerdeki metni tanımaya başlamaya hazırsınız.
1. Giriş görüntüsünü hazırlayın
Cloud Vision'ı çağırmak için görüntünün base64 ile kodlanmış bir dize olarak biçimlendirilmesi gerekir. BirUIImage
işlemek için:Süratli
guard let imageData = uiImage.jpegData(compressionQuality: 1.0f) else { return } let base64encodedImage = imageData.base64EncodedString()
Amaç-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 yer işaretlerini tanımak için bir JSON Cloud Vision isteği ileterek çağrılabilir işlevi çağırın.İlk olarak, bir Cloud Functions örneğini başlatın:
Süratli
lazy var functions = Functions.functions()
Amaç-C
@property(strong, nonatomic) FIRFunctions *functions;
İsteği oluşturun. Cloud Vision API, iki
TEXT_DETECTION
veDOCUMENT_TEXT_DETECTION
. İki kullanım durumu arasındaki fark için Cloud Vision OCR Belgelerine bakın.Süratli
let requestData = [ "image": ["content": base64encodedImage], "features": ["type": "TEXT_DETECTION"], "imageContext": ["languageHints": ["en"]] ]
Amaç-C
NSDictionary *requestData = @{ @"image": @{@"content": base64encodedImage}, @"features": @{@"type": @"TEXT_DETECTION"}, @"imageContext": @{@"languageHints": @[@"en"]} };
Son olarak, işlevi çağırın:
Süratli
functions.httpsCallable("annotateImage").call(requestData) { (result, error) in 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] } // ... } // Function completed succesfully }
Amaç-C
[[_functions HTTPSCallableWithName:@"annotateImage"] callWithObject:requestData completion:^(FIRHTTPSCallableResult * _Nullable result, NSError * _Nullable error) { if (error) { if (error.domain == FIRFunctionsErrorDomain) { FIRFunctionsErrorCode code = error.code; NSString *message = error.localizedDescription; NSObject *details = error.userInfo[FIRFunctionsErrorDetailsKey]; } // ... } // Function completed succesfully // Get information about labeled objects }];
3. Tanınan metin bloklarından metin ayıklayın
Metin tanıma işlemi başarılı olursa, görevin sonucunda BatchAnnotateImagesResponse JSON yanıtı döndürülür. Metin açıklamaları fullTextAnnotation
nesnesinde bulunabilir.
Tanınan metni text
alanında bir dize olarak alabilirsiniz. Örneğin:
Süratli
guard let annotation = (result?.data as? [String: Any])?["fullTextAnnotation"] as? [String: Any] else { return }
print("%nComplete annotation:")
let text = annotation["text"] as? String ?? ""
print("%n\(text)")
Amaç-C
NSDictionary *annotation = result.data[@"fullTextAnnotation"];
if (!annotation) { return; }
NSLog(@"\nComplete annotation:");
NSLog(@"\n%@", annotation[@"text"]);
Ayrıca görüntünün bölgelerine özel bilgiler de alabilirsiniz. Her block
, paragraph
, word
ve symbol
için bölgede tanınan metni ve bölgenin sınırlayıcı koordinatlarını alabilirsiniz. Örneğin:
Süratli
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
}
Amaç-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];
}
}