Za pomocą pakietu ML Kit możesz oznaczać obiekty rozpoznane na obrazie za pomocą: na urządzeniu czy w chmurze. Zobacz omówienie, aby poznać zalety z każdego podejścia.
Zanim zaczniesz
- Jeśli nie masz jeszcze w aplikacji dodanej Firebase, wykonaj czynności podane w przewodniku dla początkujących.
- Umieść biblioteki ML Kit w pliku Podfile:
Po zainstalowaniu lub zaktualizowaniu podów projektu otwórz Xcode projektu korzystającego z:pod 'Firebase/MLVision', '6.25.0'
# If using the on-device API: pod 'Firebase/MLVisionLabelModel', '6.25.0'
.xcworkspace. - W aplikacji zaimportuj Firebase:
Swift
import Firebase
Objective-C
@import Firebase;
-
Jeśli chcesz używać modelu działającego w chmurze, który nie został jeszcze włączony interfejsów API działających w chmurze w Twoim projekcie, zrób to teraz:
- Otwórz ML Kit Strona interfejsów API w konsoli Firebase.
-
Jeśli w swoim projekcie nie korzystasz jeszcze z abonamentu Blaze, kliknij Aby to zrobić, przejdź na wyższą wersję. (Prośba o uaktualnienie wyświetli się tylko wtedy, gdy projekt nie jest objęty abonamentem Blaze).
Tylko projekty na poziomie Blaze mogą korzystać z interfejsów API działających w chmurze.
- Jeśli interfejsy API działające w chmurze nie są włączone, kliknij Włącz działające w chmurze interfejsów API.
Jeśli chcesz używać tylko modelu na urządzeniu, możesz pominąć ten krok.
Teraz możesz oznaczać obrazy etykietami za pomocą modelu na urządzeniu lub i model działający w chmurze.
1. Przygotowywanie obrazu wejściowego
Utwórz obiekt VisionImage za pomocą UIImage lub
CMSampleBufferRef.
Aby użyć karty UIImage:
- W razie potrzeby obróć zdjęcie, tak by jego
imageOrientationwłaściwość to.up. - Utwórz obiekt
VisionImageprzy użyciu prawidłowo wykonanej rotacjiUIImageNie określaj żadnych metadanych rotacji – są to metadane domyślne..topLeft.Swift
let image = VisionImage(image: uiImage)
Objective-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];
Aby użyć karty CMSampleBufferRef:
-
Utwórz obiekt
VisionImageMetadata, który określa orientacji danych zdjęć zawartych w BuforCMSampleBufferRef.Aby sprawdzić orientację obrazu:
Swift
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 } }
Objective-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; } }
Następnie utwórz obiekt metadanych:
Swift
let cameraPosition = AVCaptureDevice.Position.back // Set to the capture device you used. let metadata = VisionImageMetadata() metadata.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition )
Objective-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];
- Utwórz obiekt
VisionImageza pomocą ObiektCMSampleBufferRefi metadane rotacji:Swift
let image = VisionImage(buffer: sampleBuffer) image.metadata = metadata
Objective-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer]; image.metadata = metadata;
2. Skonfiguruj i uruchom osobę oznaczającą obrazy
Aby oznaczyć etykietami obiekty na obrazie, przekaż obiektVisionImage do funkcji
Metoda processImage() użytkownika VisionImageLabeler.
Najpierw pobierz instancję
VisionImageLabeler.Jeśli chcesz użyć narzędzia do oznaczania obrazów etykietami na urządzeniu:
Swift
let labeler = Vision.vision().onDeviceImageLabeler() // Or, to set the minimum confidence required: // let options = VisionOnDeviceImageLabelerOptions() // options.confidenceThreshold = 0.7 // let labeler = Vision.vision().onDeviceImageLabeler(options: options)Objective-C
FIRVisionImageLabeler *labeler = [[FIRVision vision] onDeviceImageLabeler]; // Or, to set the minimum confidence required: // FIRVisionOnDeviceImageLabelerOptions *options = // [[FIRVisionOnDeviceImageLabelerOptions alloc] init]; // options.confidenceThreshold = 0.7; // FIRVisionImageLabeler *labeler = // [[FIRVision vision] onDeviceImageLabelerWithOptions:options];Jeśli chcesz użyć narzędzia do oznaczania obrazów w chmurze:
Swift
let labeler = Vision.vision().cloudImageLabeler() // Or, to set the minimum confidence required: // let options = VisionCloudImageLabelerOptions() // options.confidenceThreshold = 0.7 // let labeler = Vision.vision().cloudImageLabeler(options: options)Objective-C
FIRVisionImageLabeler *labeler = [[FIRVision vision] cloudImageLabeler]; // Or, to set the minimum confidence required: // FIRVisionCloudImageLabelerOptions *options = // [[FIRVisionCloudImageLabelerOptions alloc] init]; // options.confidenceThreshold = 0.7; // FIRVisionImageLabeler *labeler = // [[FIRVision vision] cloudImageLabelerWithOptions:options];Następnie przekaż obraz do metody
processImage():Swift
labeler.process(image) { labels, error in guard error == nil, let labels = labels else { return } // Task succeeded. // ... }Objective-C
[labeler processImage:image completion:^(NSArray<FIRVisionImageLabel *> *_Nullable labels, NSError *_Nullable error) { if (error != nil) { return; } // Task succeeded. // ... }];
3. Uzyskiwanie informacji o obiektach oznaczonych etykietami
Jeśli można oznaczyć obrazy etykietami, tablicaVisionImageLabel
są przekazywane do modułu obsługi uzupełniania. Z każdego obiektu możesz uzyskać
informacje o obiekcie rozpoznanym na zdjęciu.
Przykład:
Swift
for label in labels {
let labelText = label.text
let entityId = label.entityID
let confidence = label.confidence
}
Objective-C
for (FIRVisionImageLabel *label in labels) {
NSString *labelText = label.text;
NSString *entityId = label.entityID;
NSNumber *confidence = label.confidence;
}
Wskazówki dotyczące poprawy skuteczności w czasie rzeczywistym
Jeśli chcesz oznaczać obrazy w aplikacji działającej w czasie rzeczywistym, postępuj zgodnie z tymi instrukcjami wytycznych dotyczących uzyskiwania najlepszej liczby klatek na sekundę:
- Ogranicz wywołania do osoby oznaczającej obrazy. Jeśli nowa klatka wideo dostępne podczas działania narzędzia do etykietowania obrazów, upuść ramkę.
- Jeśli używasz danych wyjściowych osoby oznaczającej obrazy do nakładania grafiki na obrazu wejściowego, najpierw pobierz wynik z ML Kit, a następnie wyrenderuj obraz i nakładanie nakładek w jednym kroku. W ten sposób renderowanie na powierzchni tylko raz na każdą ramkę wejściową. Zobacz previewOverlayView. i FIRDetectionOverlayView w aplikacji z funkcją prezentacji.
Dalsze kroki
- Przed wdrożeniem w środowisku produkcyjnym aplikacji korzystającej z interfejsu Cloud API wykonaj dodatkowe kroki, które zapobiegają i ograniczają efekt nieautoryzowanego dostępu do interfejsu API.