Puoi utilizzare Firebase ML per riconoscere punti di riferimento noti in un'immagine.
Prima di iniziare
-
Se non hai ancora aggiunto Firebase alla tua app, fallo seguendo i passaggi della guida introduttiva.
- In Xcode, con il progetto dell'app aperto, vai a File > Add Packages (File > Aggiungi pacchetti).
- Quando richiesto, aggiungi il repository dell'SDK delle piattaforme Apple di Firebase:
- Scegli la raccolta Firebase ML.
- Aggiungi il flag
-ObjC
alla sezione Altri flag del linker delle impostazioni di build della destinazione. - Al termine, Xcode inizierà automaticamente a risolvere e a scaricare le tue dipendenze in background.
- Nella tua app, importa Firebase:
Swift
import FirebaseMLModelDownloader
Objective-C
@import FirebaseMLModelDownloader;
-
Se non hai ancora abilitato le API basate sul cloud per il tuo progetto, fallo ora:
- Apri la pagina Firebase ML API nella console Firebase.
-
Se non hai ancora eseguito l'upgrade del progetto al piano tariffario Blaze con pagamento a consumo, fai clic su Esegui upgrade. (Ti verrà chiesto di eseguire l'upgrade solo se il tuo progetto non è incluso nel piano tariffario Blaze.)
Solo i progetti con il piano tariffario Blaze possono utilizzare le API basate sul cloud.
- Se le API basate sul cloud non sono già abilitate, fai clic su Abilita API basate sul cloud.
Utilizza Swift Package Manager per installare e gestire le dipendenze di Firebase.
https://github.com/firebase/firebase-ios-sdk.git
Poi, esegui alcune operazioni di configurazione nell'app:
Configurare il rilevatore di punti di riferimento
Per impostazione predefinita, il rilevatore cloud utilizza la versione stabile del modello e
restituisce fino a 10 risultati. Se vuoi modificare una di queste impostazioni,
specificale con un oggetto VisionCloudDetectorOptions
come
nell'esempio seguente:
Swift
let options = VisionCloudDetectorOptions() options.modelType = .latest options.maxResults = 20
Objective-C
FIRVisionCloudDetectorOptions *options = [[FIRVisionCloudDetectorOptions alloc] init]; options.modelType = FIRVisionCloudModelTypeLatest; options.maxResults = 20;
Nel passaggio successivo, passa l'oggetto VisionCloudDetectorOptions
quando crei l'oggetto Cloud detector.
Esegui il rilevatore di punti di riferimento
Per riconoscere i punti di riferimento in un'immagine, trasmetti l'immagine comeUIImage
o CMSampleBufferRef
al metodo detect(in:)
di VisionCloudLandmarkDetector
:
- Ottieni un'istanza di
VisionCloudLandmarkDetector
:Swift
lazy var vision = Vision.vision() let cloudDetector = vision.cloudLandmarkDetector(options: options) // Or, to use the default settings: // let cloudDetector = vision.cloudLandmarkDetector()
Objective-C
FIRVision *vision = [FIRVision vision]; FIRVisionCloudLandmarkDetector *landmarkDetector = [vision cloudLandmarkDetector]; // Or, to change the default settings: // FIRVisionCloudLandmarkDetector *landmarkDetector = // [vision cloudLandmarkDetectorWithOptions:options];
-
Per chiamare Cloud Vision, l'immagine deve essere formattata come stringa con codifica base64. Per elaborare un
UIImage
:Swift
guard let imageData = uiImage.jpegData(compressionQuality: 1.0) else { return } let base64encodedImage = imageData.base64EncodedString()
Objective-C
NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f); NSString *base64encodedImage = [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
-
Quindi, passa l'immagine al metodo
detect(in:)
:Swift
cloudDetector.detect(in: visionImage) { landmarks, error in guard error == nil, let landmarks = landmarks, !landmarks.isEmpty else { // ... return } // Recognized landmarks // ... }
Objective-C
[landmarkDetector detectInImage:image completion:^(NSArray<FIRVisionCloudLandmark *> *landmarks, NSError *error) { if (error != nil) { return; } else if (landmarks != nil) { // Got landmarks } }];
Ricevere informazioni sui punti di riferimento riconosciuti
Se il riconoscimento del punto di riferimento va a buon fine, un array di oggettiVisionCloudLandmark
viene passato al gestore di completamento. Da ogni oggetto puoi ottenere
informazioni su un punto di riferimento riconosciuto nell'immagine.
Ad esempio:
Swift
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 }
Objective-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]; }
Passaggi successivi
- Prima di eseguire il deployment in produzione di un'app che utilizza un'API Cloud, devi adottare alcune misure aggiuntive per prevenire e mitigare l'effetto dell'accesso non autorizzato all'API.