Anda dapat menggunakan ML Kit untuk memberi label pada objek yang dikenali dalam gambar. Model default yang disediakan dengan ML Kit mendukung 400+ label berbeda.
Cobalah
- Cobalah aplikasi contoh untuk melihat contoh penggunaan API ini.
Sebelum memulai
- Sertakan pod ML Kit berikut di Podfile Anda:
pod 'GoogleMLKit/ImageLabeling', '8.0.0'
- Setelah Anda menginstal atau mengupdate Pod project, buka project Xcode menggunakan
.xcworkspace. ML Kit didukung di Xcode versi 12.4 atau yang lebih baru.
Sekarang Anda siap memberi label pada gambar.
1. Menyiapkan gambar input
Buat objek VisionImage menggunakan UIImage atau objek
CMSampleBuffer.
Jika Anda menggunakan UIImage, ikuti langkah-langkah berikut:
- Buat objek
VisionImagedenganUIImage. Pastikan untuk menentukan.orientationyang benar.Swift
let image = VisionImage(image: UIImage) visionImage.orientation = image.imageOrientation
Objective-C
MLKVisionImage *visionImage = [[MLKVisionImage alloc] initWithImage:image]; visionImage.orientation = image.imageOrientation;
Jika Anda menggunakan CMSampleBuffer, ikuti langkah-langkah berikut:
-
Tentukan orientasi data gambar yang terdapat dalam
CMSampleBuffer.Untuk mendapatkan orientasi gambar:
Swift
func imageOrientation( deviceOrientation: UIDeviceOrientation, cameraPosition: AVCaptureDevice.Position ) -> UIImage.Orientation { switch deviceOrientation { case .portrait: return cameraPosition == .front ? .leftMirrored : .right case .landscapeLeft: return cameraPosition == .front ? .downMirrored : .up case .portraitUpsideDown: return cameraPosition == .front ? .rightMirrored : .left case .landscapeRight: return cameraPosition == .front ? .upMirrored : .down case .faceDown, .faceUp, .unknown: return .up } }
Objective-C
- (UIImageOrientation) imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation cameraPosition:(AVCaptureDevicePosition)cameraPosition { switch (deviceOrientation) { case UIDeviceOrientationPortrait: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationLeftMirrored : UIImageOrientationRight; case UIDeviceOrientationLandscapeLeft: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationDownMirrored : UIImageOrientationUp; case UIDeviceOrientationPortraitUpsideDown: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationRightMirrored : UIImageOrientationLeft; case UIDeviceOrientationLandscapeRight: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationUpMirrored : UIImageOrientationDown; case UIDeviceOrientationUnknown: case UIDeviceOrientationFaceUp: case UIDeviceOrientationFaceDown: return UIImageOrientationUp; } }
- Buat objek
VisionImagemenggunakan Objek dan orientasiCMSampleBuffer:Swift
let image = VisionImage(buffer: sampleBuffer) image.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition)
Objective-C
MLKVisionImage *image = [[MLKVisionImage alloc] initWithBuffer:sampleBuffer]; image.orientation = [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation cameraPosition:cameraPosition];
2. Mengonfigurasi dan menjalankan pemberi label pada gambar
Untuk memberi label pada objek dalam gambar, teruskan objekVisionImage ke elemen
Metode processImage() ImageLabeler.
- Pertama, dapatkan instance
ImageLabeler.
Swift
let labeler = ImageLabeler.imageLabeler() // Or, to set the minimum confidence required: // let options = ImageLabelerOptions() // options.confidenceThreshold = 0.7 // let labeler = ImageLabeler.imageLabeler(options: options)
Objective-C
MLKImageLabeler *labeler = [MLKImageLabeler imageLabeler]; // Or, to set the minimum confidence required: // MLKImageLabelerOptions *options = // [[MLKImageLabelerOptions alloc] init]; // options.confidenceThreshold = 0.7; // MLKImageLabeler *labeler = // [MLKImageLabeler imageLabelerWithOptions:options];
- Lalu, teruskan gambar ke metode
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*_Nullable labels, NSError *_Nullable error) { if (error != nil) { return; } // Task succeeded. // ... }];
3. Mendapatkan informasi tentang objek berlabel
Jika pelabelan gambar berhasil, handler penyelesaian menerima array
Objek ImageLabel. Setiap objek ImageLabel mewakili sesuatu yang
yang diberi label dalam gambar. Model dasar mendukung 400+ label yang berbeda.
Anda dapat memperoleh deskripsi teks setiap label, indeks di antara semua label yang didukung oleh
model, dan skor keyakinan kecocokannya. Contoh:
Swift
for label in labels { let labelText = label.text let confidence = label.confidence let index = label.index }
Objective-C
for (MLKImageLabel *label in labels) { NSString *labelText = label.text; float confidence = label.confidence; NSInteger index = label.index; }
Tips untuk meningkatkan performa real-time
Jika Anda ingin memberikan label pada gambar dalam aplikasi real-time, ikuti panduan untuk mencapai kecepatan frame terbaik:
- Untuk memproses frame video, gunakan API sinkron
results(in:)dari pemberi label gambar. Telepon metode ini dari classAVCaptureVideoDataOutputSampleBufferDelegatecaptureOutput(_, didOutput:from:)untuk mendapatkan hasil dari video yang diberikan secara sinkron {i>frame<i}. SimpanAVCaptureVideoDataOutputalwaysDiscardsLateVideoFramessebagaitrueuntuk men-throttle panggilan ke pemberi label gambar. Jika frame video tersedia saat pemberi label gambar sedang berjalan, dan frame tersebut akan dihapus. - Jika Anda menggunakan output pemberi label gambar untuk menempatkan grafis pada gambar input, pertama-tama dapatkan hasilnya dari ML Kit, lalu render gambar dan overlay dalam satu langkah. Dengan demikian, Anda merender ke permukaan tampilan hanya sekali untuk setiap {i> frame<i} input yang diproses. Lihat updatePreviewOverlayViewWithLastFrame dalam contoh panduan memulai ML Kit sebagai contoh.