คุณสามารถใช้ ML Kit เพื่อติดป้ายกำกับวัตถุที่รู้จักในรูปภาพได้โดยใช้ โมเดลในอุปกรณ์หรือโมเดลระบบคลาวด์ โปรดดู ภาพรวมเพื่อเรียนรู้เกี่ยวกับประโยชน์ของ ในแต่ละแนวทาง
ก่อนเริ่มต้น
- หากยังไม่ได้เพิ่ม Firebase ลงในแอป ให้ดำเนินการดังนี้ ขั้นตอนในคู่มือเริ่มต้นใช้งาน
- รวมไลบรารี ML Kit ไว้ใน Podfile ดังนี้
หลังจากติดตั้งหรืออัปเดตพ็อดของโปรเจ็กต์แล้ว อย่าลืมเปิด Xcode โดยใช้pod 'Firebase/MLVision', '6.25.0'
# If using the on-device API: pod 'Firebase/MLVisionLabelModel', '6.25.0'
.xcworkspace
- ในแอป ให้นำเข้า Firebase ดังนี้
Swift
import Firebase
Objective-C
@import Firebase;
-
หากต้องการใช้โมเดลในระบบคลาวด์โดยที่คุณยังไม่ได้เปิดใช้ API ในระบบคลาวด์สำหรับโปรเจ็กต์ของคุณ โปรดทำตามขั้นตอนต่อไปนี้
- เปิด ML Kit หน้า API ของคอนโซล Firebase
-
หากคุณยังไม่ได้อัปเกรดโปรเจ็กต์เป็นแพ็กเกจราคา Blaze ให้คลิก โปรดอัปเกรดเพื่อดำเนินการ (คุณจะได้รับแจ้งให้อัปเกรดเฉพาะในกรณีต่อไปนี้ ไม่ได้อยู่ในแพ็กเกจ Blaze)
เฉพาะโปรเจ็กต์ระดับ Blaze เท่านั้นที่ใช้ API ในระบบคลาวด์ได้
- หากยังไม่ได้เปิดใช้ API ในระบบคลาวด์ ให้คลิกเปิดใช้ในระบบคลาวด์ API
หากต้องการใช้เฉพาะรุ่นในอุปกรณ์ ให้ข้ามขั้นตอนนี้
ตอนนี้คุณก็พร้อมที่จะติดป้ายกำกับรูปภาพโดยใช้โมเดลในอุปกรณ์หรือ โมเดลในระบบคลาวด์
1. เตรียมรูปภาพอินพุต
สร้างออบเจ็กต์ VisionImage
โดยใช้ UIImage
หรือ
CMSampleBufferRef
วิธีใช้ UIImage
- หากจำเป็น ให้หมุนรูปภาพเพื่อให้
imageOrientation
พร็อพเพอร์ตี้คือ.up
- สร้างออบเจ็กต์
VisionImage
โดยใช้การหมุนที่ถูกต้องUIImage
ไม่ระบุข้อมูลเมตาการหมุนเวียน ซึ่งเป็นค่าเริ่มต้น ต้องใช้ค่า.topLeft
Swift
let image = VisionImage(image: uiImage)
Objective-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];
วิธีใช้ CMSampleBufferRef
-
สร้างออบเจ็กต์
VisionImageMetadata
ที่ระบุ การวางแนวของข้อมูลภาพที่มีอยู่ใน บัฟเฟอร์CMSampleBufferRef
วิธีดูการวางแนวรูปภาพ
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; } }
จากนั้นสร้างออบเจ็กต์ข้อมูลเมตา ดังนี้
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];
- สร้างออบเจ็กต์
VisionImage
โดยใช้ ออบเจ็กต์CMSampleBufferRef
และข้อมูลเมตาการหมุน:Swift
let image = VisionImage(buffer: sampleBuffer) image.metadata = metadata
Objective-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer]; image.metadata = metadata;
2. กำหนดค่าและเรียกใช้เครื่องมือติดป้ายกำกับรูปภาพ
หากต้องการติดป้ายกำกับวัตถุในรูปภาพ ให้ส่งออบเจ็กต์VisionImage
ไปยัง
เมธอด processImage()
ของ VisionImageLabeler
ก่อนอื่น ให้รับอินสแตนซ์
VisionImageLabeler
หากต้องการใช้ตัวติดป้ายกำกับรูปภาพในอุปกรณ์ ให้ทำดังนี้
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];
หากต้องการใช้ตัวติดป้ายกำกับรูปภาพระบบคลาวด์ ให้ทำดังนี้
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];
จากนั้นส่งรูปภาพไปยังเมธอด
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. รับข้อมูลเกี่ยวกับวัตถุที่ติดป้ายกำกับ
หากติดป้ายกำกับรูปภาพสำเร็จ อาร์เรย์ของVisionImageLabel
จะส่งไปยังตัวแฮนเดิลการเสร็จสมบูรณ์ จากออบเจ็กต์แต่ละรายการ คุณจะเห็น
ข้อมูลเกี่ยวกับองค์ประกอบที่รู้จักในรูปภาพ
เช่น
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;
}
เคล็ดลับในการปรับปรุงประสิทธิภาพแบบเรียลไทม์
หากต้องการติดป้ายกำกับรูปภาพในแอปพลิเคชันแบบเรียลไทม์ ให้ทำตามดังนี้ เพื่อให้ได้อัตราเฟรมที่ดีที่สุด
- ควบคุมการเรียกไปยังผู้ติดป้ายกำกับรูปภาพ หากเฟรมวิดีโอใหม่กลายเป็น ว่างในขณะที่เครื่องมือติดป้ายกำกับรูปภาพทำงานอยู่ ให้วางเฟรม
- ถ้าคุณใช้เอาต์พุตของเครื่องมือติดป้ายกำกับรูปภาพเพื่อวางซ้อนกราฟิก รูปภาพอินพุต รับผลลัพธ์จาก ML Kit ก่อน จากนั้นจึงแสดงผลรูปภาพ ซ้อนทับในขั้นตอนเดียว การทำเช่นนี้จะช่วยให้แสดงผลบนพื้นผิวจอแสดงผล เพียงครั้งเดียวสำหรับเฟรมอินพุตแต่ละเฟรม โปรดดู previewOverlayView และ FIRDetectionOverlayView ในตัวอย่างแอป Showcase
ขั้นตอนถัดไป
- ก่อนที่จะทำให้แอปที่ใช้ Cloud API ใช้งานได้จริง คุณควรดำเนินการต่อไปนี้ ขั้นตอนเพิ่มเติมบางส่วนเพื่อป้องกันและบรรเทา ผลกระทบจากการเข้าถึง API ที่ไม่ได้รับอนุญาต