Bạn có thể sử dụng ML Kit để phát hiện và theo dõi các đối tượng trên các khung hình của video.
Khi bạn chuyển các hình ảnh ML Kit, ML Kit trả về, đối với mỗi hình ảnh, một danh sách gồm tối đa năm đối tượng được phát hiện và vị trí của chúng trong hình ảnh. Khi phát hiện các đối tượng trong luồng video, mọi đối tượng đều có một ID mà bạn có thể sử dụng để theo dõi đối tượng trên các hình ảnh. Bạn cũng có thể tùy chọn bật phân loại đối tượng thô, tính năng này gắn nhãn các đối tượng với mô tả danh mục rộng.
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 .
- Bao gồm các thư viện ML Kit trong Podfile của bạn:
pod 'Firebase/MLVision', '6.25.0' pod 'Firebase/MLVisionObjectDetection', '6.25.0'
Sau khi bạn cài đặt hoặc cập nhật Pods của dự án, hãy nhớ mở dự án Xcode của bạn bằng cách sử dụng.xcworkspace
của nó. - Trong ứng dụng của bạn, hãy nhập Firebase:
Nhanh
import Firebase
Objective-C
@import Firebase;
1. Định cấu hình máy dò đối tượng
Để bắt đầu phát hiện và theo dõi các đối tượng, trước tiên hãy tạo một phiên bản của VisionObjectDetector
, tùy chọn chỉ định bất kỳ cài đặt phát hiện nào bạn muốn thay đổi so với mặc định.
Định cấu hình bộ phát hiện đối tượng cho trường hợp sử dụng của bạn với đối tượng
VisionObjectDetectorOptions
. Bạn có thể thay đổi các cài đặt sau:Cài đặt máy dò đối tượng Chế độ phát hiện .stream
(mặc định) |.singleImage
Ở chế độ luồng (mặc định), trình phát hiện đối tượng chạy với độ trễ rất thấp, nhưng có thể tạo ra kết quả không đầy đủ (chẳng hạn như các hộp hoặc danh mục giới hạn không xác định) trong một vài lần gọi đầu tiên của trình phát hiện. Ngoài ra, ở chế độ phát trực tiếp, máy dò chỉ định ID theo dõi cho các đối tượng, bạn có thể sử dụng ID này để theo dõi các đối tượng trên các khung hình. Sử dụng chế độ này khi bạn muốn theo dõi các đối tượng hoặc khi độ trễ thấp là quan trọng, chẳng hạn như khi xử lý luồng video trong thời gian thực.
Ở chế độ hình ảnh đơn lẻ, bộ phát hiện đối tượng đợi cho đến khi hộp giới hạn của đối tượng được phát hiện và danh mục (nếu bạn đã bật phân loại) khả dụng trước khi trả về kết quả. Do đó, độ trễ phát hiện có thể cao hơn. Ngoài ra, ở chế độ hình ảnh duy nhất, ID theo dõi không được chỉ định. Sử dụng chế độ này nếu độ trễ không quan trọng và bạn không muốn đối phó với kết quả từng phần.
Phát hiện và theo dõi nhiều đối tượng false
(mặc định) |true
Có phát hiện và theo dõi tối đa năm đối tượng hay chỉ đối tượng nổi bật nhất (mặc định).
Phân loại đối tượng false
(mặc định) |true
Có hay không phân loại đối tượng phát hiện vào loại thô. Khi được kích hoạt, bộ phát hiện đối tượng sẽ phân loại các đối tượng thành các danh mục sau: hàng thời trang, thực phẩm, hàng gia dụng, địa điểm, thực vật và không xác định.
API theo dõi và phát hiện đối tượng được tối ưu hóa cho hai trường hợp sử dụng cốt lõi sau:
- Phát hiện và theo dõi trực tiếp đối tượng nổi bật nhất trong kính ngắm máy ảnh
- Phát hiện nhiều đối tượng trong một hình ảnh tĩnh
Để định cấu hình API cho các trường hợp sử dụng này:
Nhanh
// Live detection and tracking let options = VisionObjectDetectorOptions() options.detectorMode = .stream options.shouldEnableMultipleObjects = false options.shouldEnableClassification = true // Optional // Multiple object detection in static images let options = VisionObjectDetectorOptions() options.detectorMode = .singleImage options.shouldEnableMultipleObjects = true options.shouldEnableClassification = true // Optional
Objective-C
// Live detection and tracking FIRVisionObjectDetectorOptions *options = [[FIRVisionObjectDetectorOptions alloc] init]; options.detectorMode = FIRVisionObjectDetectorModeStream; options.shouldEnableMultipleObjects = NO; options.shouldEnableClassification = YES; // Optional // Multiple object detection in static images FIRVisionObjectDetectorOptions *options = [[FIRVisionObjectDetectorOptions alloc] init]; options.detectorMode = FIRVisionObjectDetectorModeSingleImage; options.shouldEnableMultipleObjects = YES; options.shouldEnableClassification = YES; // Optional
Nhận một phiên bản của
FirebaseVisionObjectDetector
:Nhanh
let objectDetector = Vision.vision().objectDetector() // Or, to change the default settings: let objectDetector = Vision.vision().objectDetector(options: options)
Objective-C
FIRVisionObjectDetector *objectDetector = [[FIRVision vision] objectDetector]; // Or, to change the default settings: FIRVisionObjectDetector *objectDetector = [[FIRVision vision] objectDetectorWithOptions:options];
2. Chạy máy dò đối tượng
Để phát hiện và theo dõi các đối tượng, hãy làm như sau cho từng hình ảnh hoặc khung hình của video. Nếu bạn đã bật chế độ phát trực tiếp, bạn phải tạo đối tượng VisionImage
từ CMSampleBufferRef
s.
Tạo đối tượng
VisionImage
bằngUIImage
hoặcCMSampleBufferRef
.Để sử dụng
UIImage
:- Nếu cần, hãy xoay hình ảnh để 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 vòng nào — phải sử dụng giá trị mặc định,.topLeft
.Nhanh
let image = VisionImage(image: uiImage)
Objective-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 } }
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 đó, 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 )
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:Nhanh
let image = VisionImage(buffer: sampleBuffer) image.metadata = metadata
Objective-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer]; image.metadata = metadata;
- Nếu cần, hãy xoay hình ảnh để thuộc tính
VisionImage
đến một trong các phương pháp xử lý hình ảnh của máy dò đối tượng. Bạn có thể sử dụng phương thứcprocess(image:)
hoặc phương thứcresults()
.Để phát hiện các đối tượng không đồng bộ:
Nhanh
objectDetector.process(image) { detectedObjects, error in guard error == nil else { // Error. return } guard let detectedObjects = detectedObjects, !detectedObjects.isEmpty else { // No objects detected. return } // Success. Get object info here. // ... }
Objective-C
[objectDetector processImage:image completion:^(NSArray<FIRVisionObject *> * _Nullable objects, NSError * _Nullable error) { if (error == nil) { return; } if (objects == nil | objects.count == 0) { // No objects detected. return; } // Success. Get object info here. // ... }];
Để phát hiện các đối tượng một cách đồng bộ:
Nhanh
var results: [VisionObject]? = nil do { results = try objectDetector.results(in: image) } catch let error { print("Failed to detect object with error: \(error.localizedDescription).") return } guard let detectedObjects = results, !detectedObjects.isEmpty else { print("Object detector returned no results.") return } // ...
Objective-C
NSError *error; NSArray<FIRVisionObject *> *objects = [objectDetector resultsInImage:image error:&error]; if (error == nil) { return; } if (objects == nil | objects.count == 0) { // No objects detected. return; } // Success. Get object info here. // ...
Nếu lệnh gọi đến bộ xử lý hình ảnh thành công, nó sẽ chuyển một danh sách các
VisionObject
đến bộ xử lý hoàn thành hoặc trả về danh sách, tùy thuộc vào việc bạn đã gọi phương thức không đồng bộ hay đồng bộ.Mỗi
VisionObject
chứa các thuộc tính sau:frame
CGRect
chỉ ra vị trí của đối tượng trong hình ảnh.trackingID
Một số nguyên xác định đối tượng trên các hình ảnh. Nil ở chế độ hình ảnh đơn. classificationCategory
Phạm trù thô của đối tượng. Nếu trình phát hiện đối tượng không được bật phân loại, thì đây luôn là .unknown
.confidence
Giá trị tin cậy của đối tượng classificaton. Nếu bộ phát hiện đối tượng không bật phân loại hoặc đối tượng được phân loại là không xác định, thì điều này là nil
.Nhanh
// detectedObjects contains one item if multiple object detection wasn't enabled. for obj in detectedObjects { let bounds = obj.frame let id = obj.trackingID // If classification was enabled: let category = obj.classificationCategory let confidence = obj.confidence }
Objective-C
// The list of detected objects contains one item if multiple // object detection wasn't enabled. for (FIRVisionObject *obj in objects) { CGRect bounds = obj.frame; if (obj.trackingID) { NSInteger id = obj.trackingID.integerValue; } // If classification was enabled: FIRVisionObjectCategory category = obj.classificationCategory; float confidence = obj.confidence.floatValue; }
Cải thiện khả năng sử dụng và hiệu suất
Để có trải nghiệm người dùng tốt nhất, hãy làm theo các nguyên tắc sau trong ứng dụng của bạn:
- Việc phát hiện đối tượng thành công phụ thuộc vào độ phức tạp trực quan của đối tượng. Các đối tượng có một số đặc điểm hình ảnh nhỏ có thể cần phải chiếm một phần lớn hơn của hình ảnh để được phát hiện. Bạn nên cung cấp cho người dùng hướng dẫn về cách thu thập dữ liệu đầu vào hoạt động tốt với loại đối tượng bạn muốn phát hiện.
- Khi sử dụng phân loại, nếu bạn muốn phát hiện các đối tượng không nằm trong danh mục được hỗ trợ, hãy thực hiện xử lý đặc biệt đối với các đối tượng không xác định.
Ngoài ra, hãy xem [ứng dụng trưng bày Thiết kế Vật liệu ML Kit] [showcase-link] {: .external} và Mẫu thiết kế Vật liệu cho bộ sưu tập các tính năng được hỗ trợ bởi máy học .
Khi sử dụng chế độ phát trực tuyến trong ứng dụng 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:
Không sử dụng tính năng phát hiện nhiều đối tượng trong chế độ phát trực tuyến, vì hầu hết các thiết bị sẽ không thể tạo ra tốc độ khung hình phù hợp.
Tắt phân loại nếu bạn không cần.
- Các cuộc gọi từ bướm ga đến máy dò. Nếu có một khung video mới trong khi trình dò đang chạy, hãy thả khung đó xuống.
- Nếu bạn đang sử dụng đầu ra của máy dò để phủ đồ họa lên hình ảnh đầu vào, trước tiên hãy lấy kết quả từ Bộ công cụ ML, sau đó hiển thị hình ảnh và lớp phủ trong một bước duy nhất. Bằng cách đó, bạn chỉ hiển thị trên bề mặt hiển thị một lần cho mỗi khung hình đầu vào. Xem các lớp previewOverlayView và FIRDetectionOverlayView trong ứng dụng mẫu trưng bày để làm ví dụ.