Bạn có thể sử dụng Firebase ML để gắn nhãn các đối tượng được nhận dạng trong một hình ảnh. Xem phần tổng quan để biết thông tin về các tính năng của API này.
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 làm như vậy bằng cách làm theo các bước trong hướng dẫn bắt đầu .
- Trong Xcode, khi dự án ứng dụng của bạn đang mở, hãy điều hướng đến File > Add Packages .
- Khi được nhắc, hãy thêm kho lưu trữ SDK nền tảng Apple của Firebase:
- Chọn thư viện Firebase ML.
- Khi hoàn tất, Xcode sẽ tự động bắt đầu giải quyết và tải xuống các phần phụ thuộc của bạn trong nền.
- Trong ứng dụng của bạn, hãy nhập Firebase:
Nhanh
import FirebaseMLModelDownloader
Mục tiêu-C
@import FirebaseMLModelDownloader;
Nếu bạn chưa bật API dựa trên đám mây cho dự án của mình, hãy thực hiện ngay bây giờ:
- Mở trang API Firebase ML 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á Blaze, hãy nhấp vào Nâng cấp để thực hiện việc này. (Bạn sẽ chỉ được nhắc nâng cấp nếu dự án của bạn không có trong gói Blaze.)
Chỉ các dự án cấp Blaze mới có thể sử dụng API dựa trên Đám mây.
- Nếu API dựa trên đám mây chưa được bật, hãy nhấp vào Bật API dựa trên đám mây .
Sử dụng Trình quản lý gói Swift để cài đặt và quản lý các phần phụ thuộc của Firebase.
https://github.com/firebase/firebase-ios-sdk
Tiếp theo, thực hiện một số thiết lập trong ứng dụng:
Bây giờ bạn đã sẵn sàng để gắn nhãn hình ảnh.
1. Chuẩn bị ảnh đầu vào
Tạo đối tượng VisionImage
bằng cách sử dụng UIImage
hoặc CMSampleBufferRef
.
Để sử dụng một UIImage
:
- Nếu cần, hãy xoay hình ảnh sao cho thuộc tính
imageOrientation
của nó là.up
. - Tạo một đối tượng
VisionImage
bằng cách sử dụngUIImage
được xoay chính xác. Không chỉ định bất kỳ siêu dữ liệu xoay nào—giá trị mặc định,.topLeft
, phải được sử dụng.Nhanh
let image = VisionImage(image: uiImage)
Mục tiêu-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];
Để sử dụng CMSampleBufferRef
:
Tạo một đối tượng
VisionImageMetadata
chỉ định hướng của dữ liệu hình ảnh có trong bộ đệmCMSampleBufferRef
.Để có được hướng hình ảnh:
Nhanh
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 } }
Mục tiêu-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 đó, tạo đối tượng siêu dữ liệu:
Nhanh
let cameraPosition = AVCaptureDevice.Position.back // Set to the capture device you used. let metadata = VisionImageMetadata() metadata.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition )
Mục tiêu-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 một đối tượng
VisionImage
bằng cách sử dụng đối tượngCMSampleBufferRef
và siêu dữ liệu xoay vòng:Nhanh
let image = VisionImage(buffer: sampleBuffer) image.metadata = metadata
Mục tiêu-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer]; image.metadata = metadata;
2. Định cấu hình và chạy trình dán nhãn hình ảnh
Để gắn nhãn các đối tượng trong một hình ảnh, hãy chuyển đối tượngVisionImage
cho phương thức processImage()
của VisionImageLabeler
.Đầu tiên, lấy một phiên bản của
VisionImageLabeler
:Nhanh
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)
Mục tiêu-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 đó, chuyển hình ảnh vào phương thức
processImage()
:Nhanh
labeler.process(image) { labels, error in guard error == nil, let labels = labels else { return } // Task succeeded. // ... }
Mục tiêu-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ề các đối tượng được dán nhãn
Nếu ghi nhãn hình ảnh thành công, một mảng các đối tượngVisionImageLabel
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 thông tin về một tính năng được nhận dạng trong ảnh.Ví dụ:
Nhanh
for label in labels {
let labelText = label.text
let entityId = label.entityID
let confidence = label.confidence
}
Mục tiêu-C
for (FIRVisionImageLabel *label in labels) {
NSString *labelText = label.text;
NSString *entityId = label.entityID;
NSNumber *confidence = label.confidence;
}
Bước tiếp theo
- Trước khi bạn triển khai để sản xuất 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 để ngăn chặn và giảm thiểu tác động của việc truy cập API trái phép .