Bạn có thể sử dụng Firebase ML để gắn nhãn các đối tượng được nhận dạng trong 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 Firebase của Apple:
- Chọn thư viện Firebase ML.
- Thêm cờ
-ObjC
vào phần Cờ liên kết khác trong cài đặt bản dựng của mục tiêu của bạn. - Khi hoàn tất, Xcode sẽ tự động bắt đầu phân giải và tải xuống các phần phụ thuộc của bạn ở chế độ 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 kích hoạ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. (Bạn sẽ chỉ được nhắc nâng cấp nếu dự án của bạn không nằm 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.git
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 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 CMSampleBufferRef
.
Để sử dụng 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:Nhanh
let image = VisionImage(buffer: sampleBuffer) image.metadata = metadata
Mục tiêu-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer]; image.metadata = metadata;
2. Cấu hình và chạy trình gắn nhãn ảnh
Để gắn nhãn các đối tượng trong một hình ảnh, hãy chuyển đối tượngVisionImage
tới 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 tới 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ề đối tượng được dán nhãn
Nếu việc gắn nhãn hình ảnh thành công, một mảng đố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 đặc điểm đượ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 triển khai để sản xuất một ứng dụng sử dụng API đám mây, 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 .