Apple প্ল্যাটফর্মে Firebase Auth এবং ফাংশন ব্যবহার করে ক্লাউড ভিশনের মাধ্যমে নিরাপদে ল্যান্ডমার্ক চিনুন

আপনার অ্যাপ থেকে একটি Google ক্লাউড API কল করার জন্য, আপনাকে একটি মধ্যবর্তী REST API তৈরি করতে হবে যা অনুমোদন পরিচালনা করে এবং API কীগুলির মতো গোপন মানগুলিকে রক্ষা করে। তারপরে আপনাকে এই মধ্যবর্তী পরিষেবার সাথে প্রমাণীকরণ এবং যোগাযোগ করতে আপনার মোবাইল অ্যাপে কোড লিখতে হবে৷

এই REST API তৈরি করার একটি উপায় হল Firebase প্রমাণীকরণ এবং ফাংশনগুলি ব্যবহার করা, যা আপনাকে Google ক্লাউড API-এর একটি পরিচালিত, সার্ভারহীন গেটওয়ে দেয় যা প্রমাণীকরণ পরিচালনা করে এবং পূর্ব-নির্মিত SDK সহ আপনার মোবাইল অ্যাপ থেকে কল করা যেতে পারে।

আপনার অ্যাপ থেকে ক্লাউড ভিশন API কল করতে এই কৌশলটি কীভাবে ব্যবহার করবেন তা এই নির্দেশিকাটি প্রদর্শন করে৷ এই পদ্ধতিটি সমস্ত প্রমাণীকৃত ব্যবহারকারীদের আপনার ক্লাউড প্রকল্পের মাধ্যমে ক্লাউড ভিশন বিল করা পরিষেবাগুলি অ্যাক্সেস করার অনুমতি দেবে, তাই এগিয়ে যাওয়ার আগে এই প্রমাণীকরণ প্রক্রিয়াটি আপনার ব্যবহারের ক্ষেত্রে যথেষ্ট কিনা তা বিবেচনা করুন।

আপনি শুরু করার আগে

আপনার প্রকল্প কনফিগার করুন

আপনি যদি ইতিমধ্যে আপনার অ্যাপে Firebase যোগ না করে থাকেন, তাহলে শুরু করার নির্দেশিকাতে দেওয়া ধাপগুলি অনুসরণ করে তা করুন৷

ফায়ারবেস নির্ভরতা ইনস্টল এবং পরিচালনা করতে সুইফট প্যাকেজ ম্যানেজার ব্যবহার করুন।

  1. Xcode-এ, আপনার অ্যাপ প্রকল্প খোলার সাথে, ফাইল > প্যাকেজ যোগ করুন- এ নেভিগেট করুন।
  2. অনুরোধ করা হলে, Firebase Apple প্ল্যাটফর্ম SDK সংগ্রহস্থল যোগ করুন:
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. Firebase ML লাইব্রেরি বেছে নিন।
  5. আপনার লক্ষ্যের বিল্ড সেটিংসের অন্যান্য লিঙ্কার ফ্ল্যাগ বিভাগে -ObjC পতাকা যোগ করুন।
  6. শেষ হয়ে গেলে, Xcode স্বয়ংক্রিয়ভাবে পটভূমিতে আপনার নির্ভরতাগুলি সমাধান এবং ডাউনলোড করা শুরু করবে।

এরপরে, কিছু ইন-অ্যাপ সেটআপ সম্পাদন করুন:

  1. আপনার অ্যাপে, Firebase আমদানি করুন:

    সুইফট

    import FirebaseMLModelDownloader

    উদ্দেশ্য-C

    @import FirebaseMLModelDownloader;

আরও কয়েকটি কনফিগারেশন ধাপ, এবং আমরা যেতে প্রস্তুত:

  1. আপনি যদি ইতিমধ্যে আপনার প্রকল্পের জন্য ক্লাউড-ভিত্তিক API সক্ষম না করে থাকেন তবে এখনই তা করুন:

    1. Firebase কনসোলের Firebase ML APIs পৃষ্ঠা খুলুন।
    2. আপনি যদি ইতিমধ্যেই আপনার প্রোজেক্টকে ব্লেজ প্রাইসিং প্ল্যানে আপগ্রেড না করে থাকেন, তা করতে আপগ্রেড এ ক্লিক করুন। (যদি আপনার প্রকল্পটি ব্লেজ প্ল্যানে না থাকে তবেই আপনাকে আপগ্রেড করার জন্য অনুরোধ করা হবে।)

      শুধুমাত্র ব্লেজ-স্তরের প্রকল্পগুলি ক্লাউড-ভিত্তিক API ব্যবহার করতে পারে।

    3. যদি ক্লাউড-ভিত্তিক APIগুলি ইতিমধ্যে সক্ষম না থাকে, তাহলে ক্লাউড-ভিত্তিক APIগুলি সক্ষম করুন ক্লিক করুন৷
  2. ক্লাউড ভিশন API-এ অ্যাক্সেসের অনুমতি না দেওয়ার জন্য আপনার বিদ্যমান Firebase API কীগুলি কনফিগার করুন:
    1. ক্লাউড কনসোলের শংসাপত্র পৃষ্ঠাটি খুলুন।
    2. তালিকার প্রতিটি API কী-এর জন্য, সম্পাদনা দৃশ্য খুলুন এবং কী বিধিনিষেধ বিভাগে, ক্লাউড ভিশন API ছাড়া সমস্ত উপলব্ধ API তালিকায় যোগ করুন।

কলযোগ্য ফাংশন স্থাপন করুন

এরপরে, ক্লাউড ফাংশনটি স্থাপন করুন যা আপনি আপনার অ্যাপ এবং ক্লাউড ভিশন API ব্রিজ করতে ব্যবহার করবেন। functions-samples সংগ্রহস্থলে একটি উদাহরণ রয়েছে যা আপনি ব্যবহার করতে পারেন।

ডিফল্টরূপে, এই ফাংশনের মাধ্যমে ক্লাউড ভিশন API অ্যাক্সেস করা শুধুমাত্র আপনার অ্যাপের প্রমাণীকৃত ব্যবহারকারীদের ক্লাউড ভিশন API-এ অ্যাক্সেসের অনুমতি দেবে। আপনি বিভিন্ন প্রয়োজনীয়তার জন্য ফাংশন পরিবর্তন করতে পারেন.

ফাংশন স্থাপন করতে:

  1. ফাংশন-নমুনা রেপো ক্লোন করুন বা ডাউনলোড করুন এবং Node-1st-gen/vision-annotate-image ডিরেক্টরিতে পরিবর্তন করুন:
    git clone https://github.com/firebase/functions-samples
    cd Node-1st-gen/vision-annotate-image
    
  2. নির্ভরতা ইনস্টল করুন:
    cd functions
    npm install
    cd ..
  3. আপনার কাছে Firebase CLI না থাকলে, এটি ইনস্টল করুন
  4. vision-annotate-image ডিরেক্টরিতে একটি ফায়ারবেস প্রকল্প শুরু করুন। অনুরোধ করা হলে, তালিকায় আপনার প্রকল্প নির্বাচন করুন।
    firebase init
  5. ফাংশন স্থাপন করুন:
    firebase deploy --only functions:annotateImage

আপনার অ্যাপে Firebase Auth যোগ করুন

উপরে স্থাপিত কলযোগ্য ফাংশনটি আপনার অ্যাপের অ-প্রমাণিত ব্যবহারকারীদের যেকোনো অনুরোধ প্রত্যাখ্যান করবে। আপনি যদি ইতিমধ্যে এটি না করে থাকেন, তাহলে আপনাকে আপনার অ্যাপে Firebase Auth যোগ করতে হবে।

আপনার অ্যাপে প্রয়োজনীয় নির্ভরতা যোগ করুন

ফায়ারবেস লাইব্রেরির জন্য ক্লাউড ফাংশন ইনস্টল করতে সুইফট প্যাকেজ ম্যানেজার ব্যবহার করুন।

1. ইনপুট ইমেজ প্রস্তুত করুন

ক্লাউড ভিশন কল করার জন্য, ছবিটি একটি বেস 64-এনকোডেড স্ট্রিং হিসাবে ফর্ম্যাট করা আবশ্যক। একটি UIImage প্রক্রিয়া করতে:

সুইফট

guard let imageData = uiImage.jpegData(compressionQuality: 1.0) else { return }
let base64encodedImage = imageData.base64EncodedString()

উদ্দেশ্য-C

NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f);
NSString *base64encodedImage =
  [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];

2. ল্যান্ডমার্ক চিনতে কলযোগ্য ফাংশনটি চালু করুন

একটি ছবিতে ল্যান্ডমার্ক চিনতে, একটি JSON ক্লাউড ভিশন অনুরোধ পাস করে কলযোগ্য ফাংশনটি চালু করুন।

  1. প্রথমে, ক্লাউড ফাংশনগুলির একটি উদাহরণ শুরু করুন:

    সুইফট

    lazy var functions = Functions.functions()
    

    উদ্দেশ্য-C

    @property(strong, nonatomic) FIRFunctions *functions;
    
  2. LANDMARK_DETECTIONটাইপ সেট করে একটি অনুরোধ তৈরি করুন:

    সুইফট

    let requestData = [
      "image": ["content": base64encodedImage],
      "features": ["maxResults": 5, "type": "LANDMARK_DETECTION"]
    ]
    

    উদ্দেশ্য-C

    NSDictionary *requestData = @{
      @"image": @{@"content": base64encodedImage},
      @"features": @{@"maxResults": @5, @"type": @"LANDMARK_DETECTION"}
    };
    
  3. অবশেষে, ফাংশনটি আহ্বান করুন:

    সুইফট

    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]
        }
        // ...
      }
    }
    

    উদ্দেশ্য-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 অ্যারের প্রতিটি বস্তু একটি ল্যান্ডমার্ক উপস্থাপন করে যা ছবিতে স্বীকৃত হয়েছিল। প্রতিটি ল্যান্ডমার্কের জন্য, আপনি ইনপুট ইমেজে এর আবদ্ধ স্থানাঙ্ক, ল্যান্ডমার্কের নাম, এর অক্ষাংশ এবং দ্রাঘিমাংশ, এর নলেজ গ্রাফ সত্তা আইডি (যদি উপলব্ধ থাকে), এবং ম্যাচের আত্মবিশ্বাসের স্কোর পেতে পারেন। যেমন:

সুইফট

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"]
    }
  }
}

উদ্দেশ্য-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"];
  }
}