अपने ऐप्लिकेशन से Google Cloud API को कॉल करने के लिए, आपको एक इंटरमीडिएट REST API बनाना होगा. यह एपीआई, अनुमति को मैनेज करता है और एपीआई कुंजियों जैसी सीक्रेट वैल्यू को सुरक्षित रखता है. इसके बाद, आपको अपने मोबाइल ऐप्लिकेशन में कोड लिखना होगा, ताकि इस इंटरमीडिएट सेवा से पुष्टि की जा सके और इसके साथ कम्यूनिकेट किया जा सके.
इस REST API को बनाने का एक तरीका है, Firebase Authentication और Functions का इस्तेमाल करना. इससे आपको Google Cloud API के लिए मैनेज किया गया, सर्वरलेस गेटवे मिलता है. यह पुष्टि करने की प्रोसेस को मैनेज करता है और इसे पहले से बने SDK की मदद से, आपके मोबाइल ऐप्लिकेशन से कॉल किया जा सकता है.
इस गाइड में बताया गया है कि इस तकनीक का इस्तेमाल करके, अपने ऐप्लिकेशन से Cloud Vision API को कैसे कॉल करें. इस तरीके से, पुष्टि किए गए सभी उपयोगकर्ता आपके Cloud प्रोजेक्ट के ज़रिए, Cloud Vision की बिल की गई सेवाओं को ऐक्सेस कर पाएंगे. इसलिए, आगे बढ़ने से पहले, यह देख लें कि पुष्टि करने का यह तरीका आपके इस्तेमाल के उदाहरण के लिए सही है या नहीं.
शुरू करने से पहले
अपना प्रोजेक्ट कॉन्फ़िगर करना
अगर आपने पहले से अपने ऐप्लिकेशन में Firebase नहीं जोड़ा है, तो शुरू करने के लिए गाइड में दिए गए चरणों का पालन करके ऐसा करें.Firebase डिपेंडेंसी इंस्टॉल और मैनेज करने के लिए, Swift Package Manager का इस्तेमाल करें.
- Xcode में, अपना ऐप्लिकेशन प्रोजेक्ट खोलें. इसके बाद, File > Add Packages पर जाएं.
- जब आपसे कहा जाए, तब Firebase Apple प्लैटफ़ॉर्म SDK टूल की रिपॉज़िटरी जोड़ें:
- Firebase ML लाइब्रेरी चुनें.
- टारगेट की बिल्ड सेटिंग के Other Linker Flags सेक्शन में
-ObjC
फ़्लैग जोड़ें. - इसके बाद, Xcode आपके पैकेज की डिपेंडेंसी से जुड़ी समस्या को हल करना शुरू कर देगा और उन्हें बैकग्राउंड में डाउनलोड करेगा.
https://github.com/firebase/firebase-ios-sdk.git
इसके बाद, ऐप्लिकेशन में कुछ सेटअप करें:
- अपने ऐप्लिकेशन में, Firebase को इंपोर्ट करें:
Swift
import FirebaseMLModelDownloader
Objective-C
@import FirebaseMLModelDownloader;
कॉन्फ़िगरेशन के कुछ और चरण पूरे करने के बाद, हम इसका इस्तेमाल कर सकते हैं:
-
अगर आपने अपने प्रोजेक्ट के लिए क्लाउड-आधारित एपीआई पहले से चालू नहीं किए हैं, तो अभी ऐसा करें:
- Firebase कंसोल में, Firebase ML एपीआई पेज खोलें.
-
अगर आपने अपने प्रोजेक्ट को इस्तेमाल के हिसाब से पेमेंट करने वाले Blaze प्लान पर अपग्रेड नहीं किया है, तो ऐसा करने के लिए अपग्रेड करें पर क्लिक करें. (आपको अपग्रेड करने के लिए सिर्फ़ तब कहा जाएगा, जब आपका प्रोजेक्ट Blaze प्लान पर नहीं होगा.)
सिर्फ़ ब्लेज़ प्राइसिंग प्लान वाले प्रोजेक्ट, क्लाउड पर आधारित एपीआई का इस्तेमाल कर सकते हैं.
- अगर क्लाउड पर आधारित एपीआई पहले से चालू नहीं हैं, तो क्लाउड पर आधारित एपीआई चालू करें पर क्लिक करें.
- Cloud Vision API का ऐक्सेस बंद करने के लिए, अपनी मौजूदा Firebase एपीआई कुंजियों को कॉन्फ़िगर करें:
- Cloud Console का क्रेडेंशियल पेज खोलें.
- सूची में मौजूद हर एपीआई पासकोड के लिए, बदलाव करने का व्यू खोलें. इसके बाद, पासकोड से जुड़ी पाबंदियां सेक्शन में, सूची में उपलब्ध सभी एपीआई जोड़ें. हालांकि, Cloud Vision API को छोड़ दें.
कॉल किए जा सकने वाले फ़ंक्शन को डिप्लॉय करना
इसके बाद, उस Cloud फ़ंक्शन को डिप्लॉय करें जिसका इस्तेमाल करके, आपको अपने ऐप्लिकेशन और Cloud Vision API के बीच ब्रिज बनाना है. functions-samples
रिपॉज़िटरी में एक उदाहरण दिया गया है. इसका इस्तेमाल किया जा सकता है.
डिफ़ॉल्ट रूप से, इस फ़ंक्शन के ज़रिए Cloud Vision API को ऐक्सेस करने पर, आपके ऐप्लिकेशन के सिर्फ़ उन उपयोगकर्ताओं को Cloud Vision API का ऐक्सेस मिलेगा जिनकी पुष्टि हो चुकी है. अलग-अलग ज़रूरतों के हिसाब से, फ़ंक्शन में बदलाव किया जा सकता है.
फ़ंक्शन को डिप्लॉय करने के लिए:
- functions-samples repo को क्लोन करें या डाउनलोड करें
और
Node-1st-gen/vision-annotate-image
डायरेक्ट्री पर जाएं:git clone https://github.com/firebase/functions-samples
cd Node-1st-gen/vision-annotate-image
- डिपेंडेंसी इंस्टॉल करें:
cd functions
npm install
cd ..
- अगर आपके पास Firebase CLI नहीं है, तो इसे इंस्टॉल करें.
vision-annotate-image
डायरेक्ट्री में Firebase प्रोजेक्ट शुरू करें. जब कहा जाए, तो सूची में से अपना प्रोजेक्ट चुनें.firebase init
- फ़ंक्शन डिप्लॉय करें:
firebase deploy --only functions:annotateImage
अपने ऐप्लिकेशन में Firebase Auth जोड़ना
ऊपर डिप्लॉय किया गया कॉल किया जा सकने वाला फ़ंक्शन, आपके ऐप्लिकेशन के उन उपयोगकर्ताओं के अनुरोधों को अस्वीकार कर देगा जिनकी पुष्टि नहीं हुई है. अगर आपने अब तक ऐसा नहीं किया है, तो आपको अपने ऐप्लिकेशन में Firebase Auth जोड़ना होगा.
अपने ऐप्लिकेशन में ज़रूरी डिपेंडेंसी जोड़ें
Cloud Functions for Firebase लाइब्रेरी इंस्टॉल करने के लिए, Swift Package Manager का इस्तेमाल करें.
1. इनपुट इमेज तैयार करना
Cloud Vision को कॉल करने के लिए, इमेज को base64 एन्कोड की गई स्ट्रिंग के तौर पर फ़ॉर्मैट किया जाना चाहिए.UIImage
को प्रोसेस करने के लिए:
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. लैंडमार्क की पहचान करने के लिए, कॉल किए जा सकने वाले फ़ंक्शन को शुरू करें
किसी इमेज में लैंडमार्क की पहचान करने के लिए, कॉल किए जा सकने वाले फ़ंक्शन को JSON Cloud Vision अनुरोध पास करें.सबसे पहले, Cloud Functions का इंस्टेंस शुरू करें:
Swift
lazy var functions = Functions.functions()
Objective-C
@property(strong, nonatomic) FIRFunctions *functions;
टाइप को
LANDMARK_DETECTION
पर सेट करके अनुरोध बनाएं:Swift
let requestData = [ "image": ["content": base64encodedImage], "features": ["maxResults": 5, "type": "LANDMARK_DETECTION"] ]
Objective-C
NSDictionary *requestData = @{ @"image": @{@"content": base64encodedImage}, @"features": @{@"maxResults": @5, @"type": @"LANDMARK_DETECTION"} };
आखिर में, फ़ंक्शन को लागू करें:
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. पहचाने गए लैंडमार्क के बारे में जानकारी पाना
लैंडमार्क पहचानने की प्रोसेस पूरी होने पर, टास्क के नतीजे में BatchAnnotateImagesResponse का JSON रिस्पॉन्स दिखेगा. landmarkAnnotations
ऐरे में मौजूद हर ऑब्जेक्ट, इमेज में पहचाने गए लैंडमार्क के बारे में बताता है. हर लैंडमार्क के लिए, आपको इनपुट इमेज में उसके बाउंडिंग कोऑर्डिनेट, लैंडमार्क का नाम, उसका अक्षांश और देशांतर, उसका नॉलेज ग्राफ़ एंटिटी आईडी (अगर उपलब्ध हो), और मैच होने का कॉन्फ़िडेंस स्कोर मिल सकता है. उदाहरण के लिए:
Swift
if let labelArray = (result?.data as? [String: Any])?["landmarkAnnotations"] as? [[String:Any]] {
for labelObj in labelArray {
let landmarkName = labelObj["description"]
let entityId = labelObj["mid"]
let score = labelObj["score"]
let bounds = labelObj["boundingPoly"]
// Multiple locations are possible, e.g., the location of the depicted
// landmark and the location the picture was taken.
guard let locations = labelObj["locations"] as? [[String: [String: Any]]] else { continue }
for location in locations {
let latitude = location["latLng"]?["latitude"]
let longitude = location["latLng"]?["longitude"]
}
}
}
Objective-C
NSArray *labelArray = result.data[@"landmarkAnnotations"];
for (NSDictionary *labelObj in labelArray) {
NSString *landmarkName = labelObj[@"description"];
NSString *entityId = labelObj[@"mid"];
NSNumber *score = labelObj[@"score"];
NSArray *bounds = labelObj[@"boundingPoly"];
// Multiple locations are possible, e.g., the location of the depicted
// landmark and the location the picture was taken.
NSArray *locations = labelObj[@"locations"];
for (NSDictionary *location in locations) {
NSNumber *latitude = location[@"latLng"][@"latitude"];
NSNumber *longitude = location[@"latLng"][@"longitude"];
}
}