التعرف على المعالم باستخدام Firebase ML على نظام التشغيل iOS

يمكنك استخدام Firebase ML للتعرف على المعالم المعروفة في الصورة.

قبل ان تبدأ

    إذا لم تكن قد أضفت Firebase إلى تطبيقك بالفعل، فقم بذلك باتباع الخطوات الواردة في دليل البدء .

    استخدم Swift Package Manager لتثبيت تبعيات Firebase وإدارتها.

    1. في Xcode، مع فتح مشروع التطبيق الخاص بك، انتقل إلى File > Add Packages .
    2. عندما يُطلب منك ذلك، قم بإضافة مستودع Firebase Apple الأساسي لـ SDK:
    3.   https://github.com/firebase/firebase-ios-sdk.git
    4. اختر مكتبة Firebase ML.
    5. أضف علامة -ObjC إلى قسم إشارات الرابط الأخرى في إعدادات إنشاء هدفك.
    6. عند الانتهاء، سيبدأ Xcode تلقائيًا في حل وتنزيل تبعياتك في الخلفية.

    بعد ذلك، قم بإجراء بعض الإعدادات داخل التطبيق:

    1. في تطبيقك، قم باستيراد Firebase:

      سويفت

      import FirebaseMLModelDownloader

      ج موضوعية

      @import FirebaseMLModelDownloader;
  1. إذا لم تكن قد قمت بالفعل بتمكين واجهات برمجة التطبيقات المستندة إلى السحابة لمشروعك، فقم بذلك الآن:

    1. افتح صفحة Firebase ML APIs لوحدة تحكم Firebase.
    2. إذا لم تكن قد قمت بالفعل بترقية مشروعك إلى خطة تسعير Blaze، فانقر فوق ترقية للقيام بذلك. (سيُطلب منك الترقية فقط إذا لم يكن مشروعك مدرجًا في خطة Blaze.)

      يمكن فقط للمشاريع على مستوى Blaze استخدام واجهات برمجة التطبيقات المستندة إلى السحابة.

    3. إذا لم تكن واجهات برمجة التطبيقات المستندة إلى السحابة ممكّنة بالفعل، فانقر على تمكين واجهات برمجة التطبيقات المستندة إلى السحابة .

تكوين كاشف المعالم

افتراضيًا، يستخدم كاشف السحابة الإصدار الثابت من النموذج ويقوم بإرجاع ما يصل إلى 10 نتائج. إذا كنت تريد تغيير أي من هذه الإعدادات، فحددها باستخدام كائن VisionCloudDetectorOptions كما في المثال التالي:

سويفت

let options = VisionCloudDetectorOptions()
options.modelType = .latest
options.maxResults = 20

ج موضوعية

  FIRVisionCloudDetectorOptions *options =
      [[FIRVisionCloudDetectorOptions alloc] init];
  options.modelType = FIRVisionCloudModelTypeLatest;
  options.maxResults = 20;
  

في الخطوة التالية، قم بتمرير كائن VisionCloudDetectorOptions عند إنشاء كائن Cloud Detector.

قم بتشغيل كاشف المعالم

للتعرف على المعالم في صورة ما، قم بتمرير الصورة كـ UIImage أو CMSampleBufferRef إلى طريقة detect(in:) VisionCloudLandmarkDetector :

  1. احصل على مثيل VisionCloudLandmarkDetector :

    سويفت

    lazy var vision = Vision.vision()
    
    let cloudDetector = vision.cloudLandmarkDetector(options: options)
    // Or, to use the default settings:
    // let cloudDetector = vision.cloudLandmarkDetector()
    

    ج موضوعية

    FIRVision *vision = [FIRVision vision];
    FIRVisionCloudLandmarkDetector *landmarkDetector = [vision cloudLandmarkDetector];
    // Or, to change the default settings:
    // FIRVisionCloudLandmarkDetector *landmarkDetector =
    //     [vision cloudLandmarkDetectorWithOptions:options];
    
  2. من أجل الاتصال بـ 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];
  3. ثم قم بتمرير الصورة إلى طريقة detect(in:) :

    سويفت

    cloudDetector.detect(in: visionImage) { landmarks, error in
      guard error == nil, let landmarks = landmarks, !landmarks.isEmpty else {
        // ...
        return
      }
    
      // Recognized landmarks
      // ...
    }
    

    ج موضوعية

    [landmarkDetector detectInImage:image
                         completion:^(NSArray<FIRVisionCloudLandmark *> *landmarks,
                                      NSError *error) {
      if (error != nil) {
        return;
      } else if (landmarks != nil) {
        // Got landmarks
      }
    }];
    

الحصول على معلومات حول المعالم المعترف بها

إذا نجح التعرف على المعالم، فسيتم تمرير مصفوفة من كائنات VisionCloudLandmark إلى معالج الإكمال. من كل كائن، يمكنك الحصول على معلومات حول معلم معروف في الصورة.

على سبيل المثال:

سويفت

for landmark in landmarks {
  let landmarkDesc = landmark.landmark
  let boundingPoly = landmark.frame
  let entityId = landmark.entityId

  // A landmark can have multiple locations: for example, the location the image
  // was taken, and the location of the landmark depicted.
  for location in landmark.locations {
    let latitude = location.latitude
    let longitude = location.longitude
  }

  let confidence = landmark.confidence
}

ج موضوعية

for (FIRVisionCloudLandmark *landmark in landmarks) {
   NSString *landmarkDesc = landmark.landmark;
   CGRect frame = landmark.frame;
   NSString *entityId = landmark.entityId;

   // A landmark can have multiple locations: for example, the location the image
   // was taken, and the location of the landmark depicted.
   for (FIRVisionLatitudeLongitude *location in landmark.locations) {
     double latitude = [location.latitude doubleValue];
     double longitude = [location.longitude doubleValue];
   }

   float confidence = [landmark.confidence floatValue];
}

الخطوات التالية