Bạn có thể sử dụng Bộ công cụ học máy để gắn nhãn cho những đối tượng được nhận dạng trong một hình ảnh. Mô hình mặc định đi kèm với Bộ công cụ học máy hỗ trợ hơn 400 nhãn khác nhau.
Dùng thử
- Hãy thử dùng ứng dụng mẫu để xem ví dụ về cách sử dụng API này.
Trước khi bắt đầu
- Đưa các nhóm Bộ công cụ học máy sau đây vào Podfile của bạn:
pod 'GoogleMLKit/ImageLabeling', '3.2.0'
- Sau khi cài đặt hoặc cập nhật Nhóm của dự án, hãy mở dự án Xcode của bạn bằng
.xcworkspace
của dự án. Bộ công cụ học máy được hỗ trợ trong Xcode phiên bản 12.4 trở lên.
Giờ đây, bạn đã sẵn sàng để gắn nhãn cho hình ảnh.
1. Chuẩn bị hình ảnh đầu vào
Tạo đối tượng VisionImage
bằng UIImage
hoặc CMSampleBuffer
.
Nếu bạn sử dụng UIImage
, hãy làm theo các bước sau:
- Tạo đối tượng
VisionImage
bằngUIImage
. Hãy nhớ chỉ định đúng.orientation
.Swift
let image = VisionImage(image: UIImage) visionImage.orientation = image.imageOrientation
Objective-C
MLKVisionImage *visionImage = [[MLKVisionImage alloc] initWithImage:image]; visionImage.orientation = image.imageOrientation;
Nếu bạn sử dụng CMSampleBuffer
, hãy làm theo các bước sau:
-
Chỉ định hướng của dữ liệu hình ảnh có trong
CMSampleBuffer
.Cách tải hướng của hình ảnh:
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; } }
- Tạo đối tượng
VisionImage
bằng cách sử dụng đối tượng và hướngCMSampleBuffer
: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. Định cấu hình và chạy công cụ gắn nhãn hình ảnh
Để gắn nhãn các đối tượng trong một hình ảnh, hãy truyền đối tượngVisionImage
vào phương thức processImage()
của ImageLabeler
.
- Trước tiên, hãy tạo một thực thể của
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];
- Sau đó, truyền hình ảnh này vào phương thức
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. Nhận thông tin về đối tượng được gắn nhãn
Nếu việc gắn nhãn hình ảnh thành công, trình xử lý hoàn thành sẽ nhận được một mảng các đối tượng ImageLabel
. Mỗi đối tượng ImageLabel
đại diện cho một nội dung được gắn nhãn trong hình ảnh. Mô hình cơ sở hỗ trợ hơn 400 nhãn.
Bạn có thể xem nội dung mô tả văn bản của từng nhãn, chỉ mục trong số tất cả các nhãn mà mô hình hỗ trợ và điểm số tin cậy của kết quả trùng khớp. Ví dụ:
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; }
Mẹo cải thiện hiệu suất theo thời gian thực
Nếu bạn muốn gắn nhãn hình ảnh trong một ứng dụng theo thời gian thực, hãy làm theo các nguyên tắc sau để đạt được tốc độ khung hình tốt nhất:
- Để xử lý khung hình video, hãy sử dụng API đồng bộ
results(in:)
của công cụ gắn nhãn hình ảnh. Hãy gọi phương thức này từ hàmcaptureOutput(_, didOutput:from:)
củaAVCaptureVideoDataOutputSampleBufferDelegate
để nhận kết quả đồng bộ từ khung hình video đã cho. GiữalwaysDiscardsLateVideoFrames
củaAVCaptureVideoDataOutput
ở dạngtrue
để điều tiết các lệnh gọi đến công cụ gắn nhãn hình ảnh. Nếu có khung hình video mới trong khi công cụ gắn nhãn hình ảnh đang chạy, thì khung hình đó sẽ bị loại bỏ. - Nếu bạn sử dụng đầu ra của công cụ gắn nhãn hình ảnh để phủ đồ hoạ lên hình ảnh đầu vào, trước tiên, hãy lấy kết quả từ Bộ công cụ học máy, sau đó kết xuất hình ảnh và lớp phủ chỉ qua một bước. Bằng cách này, bạn chỉ kết xuất trên giao diện màn hình một lần cho mỗi khung đầu vào được xử lý. Hãy xem ví dụ về updatePreviewOverlayViewWithLastFrame trong mẫu bắt đầu nhanh của Bộ công cụ học máy.