برچسب گذاری ایمن تصاویر با Cloud Vision با استفاده از Firebase Auth و توابع در پلتفرم های اپل

برای فراخوانی یک API گوگل کلود از برنامه خود، باید یک API REST واسط ایجاد کنید که مجوزها را مدیریت کرده و از مقادیر مخفی مانند کلیدهای API محافظت کند. سپس باید در برنامه تلفن همراه خود کدی بنویسید تا احراز هویت شده و با این سرویس واسط ارتباط برقرار کند.

یک راه برای ایجاد این REST API استفاده از Firebase Authentication and Functions است که یک دروازه مدیریت‌شده و بدون سرور به APIهای Google Cloud در اختیار شما قرار می‌دهد که احراز هویت را مدیریت می‌کند و می‌توان آن را از طریق برنامه تلفن همراه شما با SDKهای از پیش ساخته شده فراخوانی کرد.

این راهنما نحوه استفاده از این تکنیک را برای فراخوانی API Cloud Vision از برنامه شما نشان می‌دهد. این روش به همه کاربران احراز هویت شده اجازه می‌دهد تا از طریق پروژه Cloud شما به سرویس‌های دارای صورتحساب Cloud Vision دسترسی پیدا کنند، بنابراین قبل از ادامه، در نظر بگیرید که آیا این مکانیسم احراز هویت برای مورد استفاده شما کافی است یا خیر.

قبل از اینکه شروع کنی

پروژه خود را پیکربندی کنید

اگر هنوز Firebase را به برنامه خود اضافه نکرده‌اید، با دنبال کردن مراحل موجود در راهنمای شروع به کار ، این کار را انجام دهید.

برای نصب و مدیریت وابستگی‌های Firebase از Swift Package Manager استفاده کنید.

  1. در Xcode، با باز کردن پروژه برنامه خود، به File > Add Packages بروید.
  2. وقتی از شما خواسته شد، مخزن SDK پلتفرم‌های اپل فایربیس را اضافه کنید:
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. کتابخانه Firebase ML را انتخاب کنید.
  5. پرچم -ObjC را به بخش Other Linker Flags در تنظیمات ساخت هدف خود اضافه کنید.
  6. پس از اتمام، Xcode به طور خودکار شروع به حل و دانلود وابستگی‌های شما در پس‌زمینه می‌کند.

در مرحله بعد، برخی تنظیمات درون برنامه‌ای را انجام دهید:

  1. در برنامه خود، Firebase را وارد کنید:

    سویفت

    import FirebaseMLModelDownloader

    هدف-سی

    @import FirebaseMLModelDownloader;

چند مرحله پیکربندی دیگر، و ما آماده‌ایم:

  1. اگر هنوز APIهای مبتنی بر ابر را برای پروژه خود فعال نکرده‌اید، اکنون این کار را انجام دهید:

    1. صفحه Firebase ML APIs را در کنسول Firebase باز کنید.
    2. اگر هنوز پروژه خود را به طرح قیمت‌گذاری پرداخت در محل Blaze ارتقا نداده‌اید، برای انجام این کار روی ارتقا کلیک کنید. (فقط در صورتی که پروژه شما در طرح قیمت‌گذاری Blaze نباشد، از شما خواسته می‌شود که آن را ارتقا دهید.)

      فقط پروژه‌های موجود در طرح قیمت‌گذاری Blaze می‌توانند از APIهای مبتنی بر ابر استفاده کنند.

    3. اگر APIهای مبتنی بر ابر از قبل فعال نشده‌اند، روی فعال کردن APIهای مبتنی بر ابر کلیک کنید.
  2. کلیدهای API فایربیس موجود خود را پیکربندی کنید تا دسترسی به API کلود ویژن را غیرفعال کنید:
    1. صفحه اعتبارنامه‌ها (Credentials) کنسول Cloud را باز کنید.
    2. برای هر کلید API موجود در لیست، نمای ویرایش را باز کنید و در بخش محدودیت‌های کلید، تمام APIهای موجود به جز API Cloud Vision را به لیست اضافه کنید.

تابع قابل فراخوانی را مستقر کنید

در مرحله بعد، تابع ابری (Cloud Function) را که برای ایجاد پل بین برنامه خود و API Cloud Vision استفاده خواهید کرد، مستقر کنید. مخزن functions-samples شامل مثالی است که می‌توانید از آن استفاده کنید.

به طور پیش‌فرض، دسترسی به API Cloud Vision از طریق این تابع، فقط به کاربران احراز هویت شده برنامه شما اجازه دسترسی به API Cloud Vision را می‌دهد. می‌توانید این تابع را برای الزامات مختلف تغییر دهید.

برای استقرار تابع:

  1. مخزن functions-samples را کلون یا دانلود کنید و به دایرکتوری 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. یک پروژه Firebase را در دایرکتوری vision-annotate-image راه‌اندازی کنید. در صورت درخواست، پروژه خود را از لیست انتخاب کنید.
    firebase init
  5. تابع را مستقر کنید:
    firebase deploy --only functions:annotateImage

Firebase Auth را به برنامه خود اضافه کنید

تابع فراخوانی‌شده‌ی فوق، هرگونه درخواستی از کاربران احراز هویت نشده‌ی برنامه‌ی شما را رد می‌کند. اگر قبلاً این کار را انجام نداده‌اید، باید Firebase Auth را به برنامه‌ی خود اضافه کنید.

وابستگی‌های لازم را به برنامه خود اضافه کنید

برای نصب کتابخانه Cloud Functions for Firebase از Swift Package Manager استفاده کنید.

حالا آماده‌اید تا تصاویر را برچسب‌گذاری کنید.

۱. تصویر ورودی را آماده کنید

برای فراخوانی Cloud Vision، تصویر باید به صورت یک رشته کدگذاری شده با base64 فرمت شود. برای پردازش یک UIImage :

سویفت

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

هدف-سی

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

۲. تابع قابل فراخوانی را برای برچسب‌گذاری تصویر فراخوانی کنید

برای برچسب‌گذاری اشیاء در یک تصویر، تابع قابل فراخوانی را با ارسال یک درخواست JSON Cloud Vision فراخوانی کنید.

  1. ابتدا، یک نمونه از توابع ابری را مقداردهی اولیه کنید:

    سویفت

    lazy var functions = Functions.functions()
    

    هدف-سی

    @property(strong, nonatomic) FIRFunctions *functions;
    
  2. یک درخواست با نوع تنظیم شده روی LABEL_DETECTION ایجاد کنید:

    سویفت

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

    هدف-سی

    NSDictionary *requestData = @{
      @"image": @{@"content": base64encodedImage},
      @"features": @{@"maxResults": @5, @"type": @"LABEL_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]
        }
        // ...
      }
    }
    

    هدف-سی

    [[_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
    
          }];
    

۳. اطلاعات مربوط به اشیاء برچسب‌گذاری شده را دریافت کنید

اگر عملیات برچسب‌گذاری تصویر با موفقیت انجام شود، یک پاسخ JSON از نوع BatchAnnotateImagesResponse در نتیجه‌ی وظیفه بازگردانده می‌شود. هر شیء در آرایه‌ی labelAnnotations نشان‌دهنده‌ی چیزی است که در تصویر برچسب‌گذاری شده است. برای هر برچسب، می‌توانید توضیحات متنی برچسب، شناسه‌ی موجودیت نمودار دانش آن (در صورت وجود) و امتیاز اطمینان تطابق را دریافت کنید. برای مثال:

سویفت

if let labelArray = (result?.data as? [String: Any])?["labelAnnotations"] as? [[String:Any]] {
  for labelObj in labelArray {
    let text = labelObj["description"]
    let entityId = labelObj["mid"]
    let confidence = labelObj["score"]
  }
}

هدف-سی

NSArray *labelArray = result.data[@"labelAnnotations"];
for (NSDictionary *labelObj in labelArray) {
  NSString *text = labelObj[@"description"];
  NSString *entityId = labelObj[@"mid"];
  NSNumber *confidence = labelObj[@"score"];
}