คุณใช้ Firebase ML เพื่อติดป้ายกำกับวัตถุที่ระบบจดจำได้ในรูปภาพ ดูข้อมูลเกี่ยวกับฟีเจอร์ของ API นี้ได้ที่ ภาพรวม
ก่อนเริ่มต้น
-
หากยังไม่ได้เพิ่ม Firebase ลงในแอป ให้เพิ่มโดยทำตาม
ขั้นตอนในคู่มือเริ่มต้นใช้งาน
- เปิดโปรเจ็กต์แอปใน Xcode แล้วไปที่File > Add Packages
- เมื่อได้รับข้อความแจ้ง ให้เพิ่มที่เก็บ SDK ของแพลตฟอร์ม Apple ของ Firebase ดังนี้
- เลือกFirebase ML คลัง
- เพิ่มแฟล็ก
-ObjC
ลงในส่วนแฟล็ก Linker อื่นๆ ของการตั้งค่าบิลด์ของเป้าหมาย - เมื่อเสร็จแล้ว Xcode จะเริ่มจับคู่ข้อมูลและดาวน์โหลดทรัพยากร Dependency ในเบื้องหลังโดยอัตโนมัติ
- ในแอป ให้นำเข้า Firebase ดังนี้
Swift
import FirebaseMLModelDownloader
Objective-C
@import FirebaseMLModelDownloader;
-
หากยังไม่ได้เปิดใช้ API บนระบบคลาวด์สำหรับโปรเจ็กต์ ให้ทำดังนี้ ตอนนี้
- เปิดFirebase ML หน้า API ในคอนโซล Firebase
-
หากยังไม่ได้อัปเกรดโปรเจ็กต์เป็นแพ็กเกจราคา Blaze แบบจ่ายตามการใช้งาน ให้คลิกอัปเกรดเพื่อดำเนินการ (ระบบจะแจ้งให้คุณอัปเกรดก็ต่อเมื่อโปรเจ็กต์ไม่ได้ใช้แพ็กเกจราคา Blaze)
เฉพาะโปรเจ็กต์ในแพ็กเกจการเรียกเก็บเงิน Blaze เท่านั้นที่ใช้ API บนระบบคลาวด์ได้
- หากยังไม่ได้เปิดใช้ API บนระบบคลาวด์ ให้คลิก เปิดใช้ API บนระบบคลาวด์
ใช้ Swift Package Manager เพื่อติดตั้งและจัดการทรัพยากร Dependency ของ Firebase
https://github.com/firebase/firebase-ios-sdk.git
จากนั้นทำการตั้งค่าในแอปดังนี้
ตอนนี้คุณก็พร้อมติดป้ายกำกับรูปภาพแล้ว
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().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
ออบเจ็กต์ไปยัง Completion Handler จากออบเจ็กต์แต่ละรายการ คุณจะได้รับ
ข้อมูลเกี่ยวกับฟีเจอร์ที่ระบบจดจำในรูปภาพ
เช่น
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;
}
ขั้นตอนถัดไป
- ก่อนที่จะนำแอปที่ใช้ Cloud API ไปใช้งานจริง คุณควรดำเนินการเพิ่มเติมเพื่อป้องกันและลดผลกระทบจากการเข้าถึง API ที่ไม่ได้รับอนุญาต