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
-ObjCalla sezione Altri flag del linker delle impostazioni di build del target. - 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 per farlo. (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 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 configurazioni in-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 ha esito positivo, un array di oggettiVisionCloudLandmark
verrà passato al gestore del 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.