با ML Kit در iOS نقاط دیدنی را بشناسید

می‌توانید از کیت ML برای تشخیص نشانه‌های شناخته شده در یک تصویر استفاده کنید.

قبل از شروع

  1. اگر قبلاً Firebase را به برنامه خود اضافه نکرده اید، این کار را با دنبال کردن مراحل راهنمای شروع کار انجام دهید.
  2. کتابخانه های ML Kit را در پادفایل خود قرار دهید:
    pod 'Firebase/MLVision', '6.25.0'
    
    پس از نصب یا به‌روزرسانی Pods پروژه، حتماً پروژه Xcode خود را با استفاده از .xcworkspace آن باز کنید.
  3. در برنامه خود، Firebase را وارد کنید:

    سویفت

    import Firebase

    هدف-C

    @import Firebase;
  4. اگر قبلاً API های مبتنی بر Cloud را برای پروژه خود فعال نکرده اید، اکنون این کار را انجام دهید:

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

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

    3. اگر APIهای مبتنی بر Cloud قبلاً فعال نشده‌اند، روی Enable Cloud-based APIs کلیک کنید.

آشکارساز نقطه عطف را پیکربندی کنید

به طور پیش فرض، آشکارساز ابر از نسخه پایدار مدل استفاده می کند و حداکثر 10 نتیجه را برمی گرداند. اگر می خواهید یکی از این تنظیمات را تغییر دهید، آنها را با یک شی VisionCloudDetectorOptions مانند مثال زیر مشخص کنید:

سویفت

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

هدف-C

  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()

    هدف-C

    FIRVision *vision = [FIRVision vision];
    FIRVisionCloudLandmarkDetector *landmarkDetector = [vision cloudLandmarkDetector];
    // Or, to change the default settings:
    // FIRVisionCloudLandmarkDetector *landmarkDetector =
    //     [vision cloudLandmarkDetectorWithOptions:options];
  2. یک شی VisionImage با استفاده از UIImage یا CMSampleBufferRef ایجاد کنید.

    برای استفاده از UIImage :

    1. در صورت لزوم، تصویر را بچرخانید تا ویژگی imageOrientation آن .up باشد.
    2. یک شی VisionImage با استفاده از UIImage با چرخش صحیح ایجاد کنید. هیچ ابرداده چرخشی را مشخص نکنید—مقدار پیش‌فرض، .topLeft باید استفاده شود.

      سویفت

      let image = VisionImage(image: uiImage)

      هدف-C

      FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];

    برای استفاده از CMSampleBufferRef :

    1. یک شی VisionImageMetadata ایجاد کنید که جهت داده های تصویر موجود در بافر CMSampleBufferRef را مشخص می کند.

      برای دریافت جهت تصویر:

      سویفت

      func imageOrientation(
          deviceOrientation: UIDeviceOrientation,
          cameraPosition: AVCaptureDevice.Position
          ) -> VisionDetectorImageOrientation {
          switch deviceOrientation {
          case .portrait:
              return cameraPosition == .front ? .leftTop : .rightTop
          case .landscapeLeft:
              return cameraPosition == .front ? .bottomLeft : .topLeft
          case .portraitUpsideDown:
              return cameraPosition == .front ? .rightBottom : .leftBottom
          case .landscapeRight:
              return cameraPosition == .front ? .topRight : .bottomRight
          case .faceDown, .faceUp, .unknown:
              return .leftTop
          }
      }

      هدف-C

      - (FIRVisionDetectorImageOrientation)
          imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation
                                 cameraPosition:(AVCaptureDevicePosition)cameraPosition {
        switch (deviceOrientation) {
          case UIDeviceOrientationPortrait:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationLeftTop;
            } else {
              return FIRVisionDetectorImageOrientationRightTop;
            }
          case UIDeviceOrientationLandscapeLeft:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationBottomLeft;
            } else {
              return FIRVisionDetectorImageOrientationTopLeft;
            }
          case UIDeviceOrientationPortraitUpsideDown:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationRightBottom;
            } else {
              return FIRVisionDetectorImageOrientationLeftBottom;
            }
          case UIDeviceOrientationLandscapeRight:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationTopRight;
            } else {
              return FIRVisionDetectorImageOrientationBottomRight;
            }
          default:
            return FIRVisionDetectorImageOrientationTopLeft;
        }
      }

      سپس، شی فوق داده را ایجاد کنید:

      سویفت

      let cameraPosition = AVCaptureDevice.Position.back  // Set to the capture device you used.
      let metadata = VisionImageMetadata()
      metadata.orientation = imageOrientation(
          deviceOrientation: UIDevice.current.orientation,
          cameraPosition: cameraPosition
      )

      هدف-C

      FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init];
      AVCaptureDevicePosition cameraPosition =
          AVCaptureDevicePositionBack;  // Set to the capture device you used.
      metadata.orientation =
          [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation
                                       cameraPosition:cameraPosition];
    2. یک شی VisionImage با استفاده از شی CMSampleBufferRef و ابرداده چرخش ایجاد کنید:

      سویفت

      let image = VisionImage(buffer: sampleBuffer)
      image.metadata = metadata

      هدف-C

      FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer];
      image.metadata = metadata;
  3. سپس تصویر را به متد detect(in:) منتقل کنید:

    سویفت

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

    هدف-C

    [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
}

هدف-C

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

مراحل بعدی