2022년 10월 18일에 오프라인과 온라인으로 진행될 Firebase Summit에 참여하세요. Firebase로 앱을 빠르게 개발하고 안심하고 앱을 출시하며 손쉽게 확장하는 방법을 알아보세요. 지금 등록하기

iOS에서 Firebase ML로 랜드마크 인식

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

Firebase ML을 사용하여 이미지에서 잘 알려진 랜드마크를 인식할 수 있습니다.

시작하기 전에

    아직 앱에 Firebase를 추가하지 않았다면 시작하기 가이드 의 단계에 따라 추가하세요.

    Swift 패키지 관리자를 사용하여 Firebase 종속 항목을 설치하고 관리합니다.

    1. Xcode에서 앱 프로젝트를 연 상태에서 파일 > 패키지 추가 로 이동합니다.
    2. 메시지가 표시되면 Firebase Apple 플랫폼 SDK 저장소를 추가합니다.
    3.   https://github.com/firebase/firebase-ios-sdk
    4. Firebase ML 라이브러리를 선택합니다.
    5. 완료되면 Xcode는 백그라운드에서 종속성을 자동으로 해결하고 다운로드하기 시작합니다.

    다음으로 몇 가지 인앱 설정을 수행합니다.

    1. 앱에서 Firebase를 가져옵니다.

      빠른

      import FirebaseMLModelDownloader

      오브젝티브-C

      @import FirebaseMLModelDownloader;
  1. 프로젝트에 클라우드 기반 API를 아직 활성화하지 않았다면 지금 활성화하십시오.

    1. Firebase 콘솔의 Firebase ML API 페이지 를 엽니다.
    2. 아직 프로젝트를 Blaze 요금제로 업그레이드하지 않은 경우 업그레이드 를 클릭하여 업그레이드하십시오. (프로젝트가 Blaze 요금제에 없는 경우에만 업그레이드하라는 메시지가 표시됩니다.)

      Blaze 수준 프로젝트만 클라우드 기반 API를 사용할 수 있습니다.

    3. 클라우드 기반 API가 아직 활성화되지 않은 경우 클라우드 기반 API 활성화 를 클릭합니다.

랜드마크 감지기 구성

기본적으로 Cloud 감지기는 안정적인 버전의 모델을 사용하고 최대 10개의 결과를 반환합니다. 이러한 설정 중 하나를 변경하려면 다음 예제와 같이 VisionCloudDetectorOptions 객체를 사용하여 지정합니다.

빠른

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

오브젝티브-C

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

다음 단계에서 Cloud 감지기 객체를 생성할 때 VisionCloudDetectorOptions 객체를 전달합니다.

랜드마크 감지기 실행

이미지의 랜드마크를 인식하려면 이미지를 UIImage 또는 CMSampleBufferRefVisionCloudLandmarkDetectordetect(in:) 메서드에 전달합니다.

  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. Cloud Vision을 호출하려면 이미지 형식이 base64로 인코딩된 문자열이어야 합니다. UIImage 를 처리하려면:

    빠른

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

    오브젝티브-C

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

    오브젝티브-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];
}

다음 단계