Bạn có thể dùng Bộ công cụ học máy để gắn nhãn các đối tượng nhận dạng được trong hình ảnh bằng cách sử dụng mô hình trên thiết bị hoặc mô hình trên đám mây. Xem Overview (Tổng quan) để tìm hiểu về các lợi ích của mỗi phương pháp tiếp cận.
Trước khi bắt đầu
- Nếu bạn chưa thêm Firebase vào ứng dụng của mình, hãy thực hiện bằng cách làm theo hướng dẫn các bước trong hướng dẫn bắt đầu sử dụng.
- Thêm các thư viện Bộ công cụ học máy vào Podfile của bạn:
Sau khi cài đặt hoặc cập nhật Nhóm của dự án, hãy nhớ mở Xcode dự án bằngpod 'Firebase/MLVision', '6.25.0'
# If using the on-device API: pod 'Firebase/MLVisionLabelModel', '6.25.0'
.xcworkspace
của nó. - Trong ứng dụng của bạn, hãy nhập Firebase:
Swift
import Firebase
Objective-C
@import Firebase;
-
Nếu bạn muốn sử dụng mô hình trên đám mây và chưa bật các API trên đám mây cho dự án của bạn, hãy thực hiện ngay bây giờ:
- Mở Bộ công cụ học máy trang API của bảng điều khiển Firebase.
-
Nếu bạn chưa nâng cấp dự án của mình lên Gói giá linh hoạt, hãy nhấp vào Hãy nâng cấp để làm điều này. (Bạn sẽ chỉ được nhắc nâng cấp nếu không có trong Kế hoạch linh hoạt.)
Chỉ các dự án cấp Blaze mới có thể sử dụng API trên đám mây.
- Nếu bạn chưa bật API trên đám mây, hãy nhấp vào Bật API dựa trên đám mây API.
Nếu chỉ muốn sử dụng mẫu trên thiết bị, bạn có thể bỏ qua bước này.
Giờ đây, bạn đã sẵn sàng để gắn nhãn cho hình ảnh bằng mô hình trên thiết bị hoặc dựa trên đám mây.
1. Chuẩn bị hình ảnh đầu vào
Tạo đối tượng VisionImage
bằng UIImage
hoặc
CMSampleBufferRef
.
Cách sử dụng UIImage
:
- Nếu cần, hãy xoay hình ảnh để
imageOrientation
là.up
. - Tạo đối tượng
VisionImage
bằng chế độ xoay chính xácUIImage
Không chỉ định bất kỳ siêu dữ liệu xoay vòng nào—mặc định bạn phải sử dụng giá trị.topLeft
.Swift
let image = VisionImage(image: uiImage)
Objective-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];
Cách sử dụng CMSampleBufferRef
:
-
Tạo đối tượng
VisionImageMetadata
chỉ định của dữ liệu hình ảnh chứa trong Vùng đệmCMSampleBufferRef
.Cách lấy hướng ảnh:
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; } }
Sau đó, hãy tạo đối tượng siêu dữ liệu:
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];
- Tạo đối tượng
VisionImage
bằng Đối tượngCMSampleBufferRef
và siêu dữ liệu xoay:Swift
let image = VisionImage(buffer: sampleBuffer) image.metadata = metadata
Objective-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer]; image.metadata = metadata;
2. Định cấu hình và chạy công cụ gắn nhãn hình ảnh
Để gắn nhãn cho các đối tượng trong hình ảnh, hãy truyền đối tượngVisionImage
vào phương thức
Phương thức processImage()
của VisionImageLabeler
.
Trước tiên, hãy lấy một thực thể của
VisionImageLabeler
.Nếu bạn muốn sử dụng công cụ gắn nhãn hình ảnh trên thiết bị:
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];
Nếu bạn muốn sử dụng công cụ gắn nhãn hình ảnh trên đám mây, hãy làm như sau:
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];
Sau đó, hãy truyền hình ảnh đó 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<FIRVisionImageLabel *> *_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 gắn nhãn hình ảnh thành công, một mảngVisionImageLabel
các đối tượng này sẽ được chuyển đến trình xử lý hoàn thành. Từ mỗi đối tượng, bạn có thể lấy được
thông tin về đối tượng nhận diện được trong hình ảnh.
Ví dụ:
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;
}
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 cho hình ảnh trong một ứng dụng theo thời gian thực, hãy làm theo các bước sau để đạt được tốc độ khung hình tốt nhất:
- Điều tiết các lệnh gọi đến công cụ gắn nhãn hình ảnh. Nếu một khung video mới khi trình gắn nhãn hình ảnh đang chạy, hãy thả khung.
- Nếu bạn đang 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à phủ lên trên trong một bước duy nhất. Khi làm vậy, bạn sẽ kết xuất lên giao diện màn hình một lần cho mỗi khung đầu vào. Xem previewOverlayView và FIRDetectionOverlayView trong ứng dụng mẫu Showcase.
Các bước tiếp theo
- Trước khi triển khai phát hành công khai một ứng dụng sử dụng Cloud API, bạn nên thực hiện một số bước bổ sung nhằm ngăn chặn và giảm thiểu ảnh hưởng của việc truy cập trái phép API.