หลังจากที่คุณฝึกโมเดลของคุณเองโดยใช้ AutoML Vision Edge ก็นำไปใช้ในแอปเพื่อตรวจจับวัตถุในรูปภาพได้
การผสานรวมโมเดลที่ฝึกจาก AutoML Vision Edge ทำได้ 2 วิธีดังนี้ รวมโมเดลโดยใส่ไว้ในโฟลเดอร์เนื้อหาของแอป หรือจะ ดาวน์โหลดแบบไดนามิกจาก Firebase
ตัวเลือกการรวมกลุ่มโมเดล | |
---|---|
รวมกลุ่มในแอปของคุณ |
|
โฮสต์กับ Firebase |
|
ก่อนเริ่มต้น
หากต้องการดาวน์โหลดโมเดล โปรดตรวจสอบว่า เพิ่ม Firebase ลงในโปรเจ็กต์ Android หากคุณยังไม่ได้ดำเนินการ ทั้งนี้ไม่จำเป็นต้องทำขั้นตอนนี้เมื่อคุณรวมกลุ่มโมเดล
เพิ่มทรัพยากร Dependency สำหรับไลบรารีงาน TensorFlow Lite ลงใน ไฟล์ Gradle ระดับแอป ซึ่งปกติจะเป็น
app/build.gradle
:สำหรับการรวมโมเดลกับแอป ให้ทำดังนี้
dependencies { // ... // Object detection with a bundled Auto ML model implementation 'org.tensorflow:tensorflow-lite-task-vision:0.0.0-nightly-SNAPSHOT' }
เพิ่ม Firebase ML ในการดาวน์โหลดโมเดลแบบไดนามิกจาก Firebase ด้วย การพึ่งพา:
dependencies { // ... // Object detection with an Auto ML model deployed to Firebase implementation platform('com.google.firebase:firebase-bom:26.1.1') implementation 'com.google.firebase:firebase-ml-model-interpreter' implementation 'org.tensorflow:tensorflow-lite-task-vision:0.0.0-nightly' }
1. โหลดโมเดล
กำหนดค่าต้นทางของโมเดลในเครื่อง
วิธีรวมโมเดลกับแอป
- แยกโมเดลจากชุดไฟล์ Zip ที่คุณดาวน์โหลดจาก คอนโซล Google Cloud
- รวมรุ่นของคุณในแพ็กเกจแอปดังนี้
- หากไม่มีโฟลเดอร์ชิ้นงานในโปรเจ็กต์ ให้สร้างโฟลเดอร์โดยคลิกขวาที่โฟลเดอร์
app/
แล้วคลิกใหม่ > โฟลเดอร์ > โฟลเดอร์ชิ้นงาน - คัดลอกไฟล์โมเดล
tflite
ที่มีข้อมูลเมตาที่ฝังไว้ไปยังโฟลเดอร์เนื้อหา
- หากไม่มีโฟลเดอร์ชิ้นงานในโปรเจ็กต์ ให้สร้างโฟลเดอร์โดยคลิกขวาที่โฟลเดอร์
เพิ่มข้อมูลต่อไปนี้ลงในไฟล์
build.gradle
ของแอปเพื่อให้ Gradle ไม่บีบอัดไฟล์โมเดลเมื่อสร้างแอปandroid { // ... aaptOptions { noCompress "tflite" } }
ไฟล์โมเดลจะรวมอยู่ในแพ็กเกจแอปและ เป็นเนื้อหาดิบ
กำหนดค่าแหล่งที่มาของโมเดลที่โฮสต์กับ Firebase
หากต้องการใช้โมเดลที่โฮสต์จากระยะไกล ให้สร้างออบเจ็กต์ RemoteModel
ระบุชื่อที่คุณกำหนดให้กับโมเดลเมื่อเผยแพร่โมเดล:
Java
// Specify the name you assigned when you deployed the model.
FirebaseCustomRemoteModel remoteModel =
new FirebaseCustomRemoteModel.Builder("your_model").build();
Kotlin
// Specify the name you assigned when you deployed the model.
val remoteModel =
FirebaseCustomRemoteModel.Builder("your_model_name").build()
จากนั้นเริ่มงานการดาวน์โหลดโมเดลโดยระบุเงื่อนไขที่คุณต้องการอนุญาตให้ดาวน์โหลด หากไม่มีรุ่นนี้อยู่ในอุปกรณ์ หรือรุ่นที่ใหม่กว่า ของโมเดลพร้อมใช้งาน งานจะดาวน์โหลด จาก Firebase ได้ดังนี้
Java
DownloadConditions downloadConditions = new DownloadConditions.Builder()
.requireWifi()
.build();
RemoteModelManager.getInstance().download(remoteModel, downloadConditions)
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(@NonNull Task<Void> task) {
// Success.
}
});
Kotlin
val downloadConditions = DownloadConditions.Builder()
.requireWifi()
.build()
RemoteModelManager.getInstance().download(remoteModel, downloadConditions)
.addOnSuccessListener {
// Success.
}
แอปจำนวนมากเริ่มงานดาวน์โหลดในโค้ดเริ่มต้น แต่คุณ จากนั้นคุณจะสามารถทำได้ทุกเมื่อก่อนที่จะต้องใช้โมเดลนี้
สร้างตัวตรวจจับวัตถุจากโมเดล
หลังจากกำหนดค่าแหล่งที่มาของโมเดลแล้ว ให้สร้างออบเจ็กต์ ObjectDetector
จาก 1 รายการ
ทั้งหมด
หากคุณมีเพียงโมเดลที่รวมอยู่ในเครื่อง ให้สร้างตัวตรวจจับวัตถุจากไฟล์โมเดลและกำหนดเกณฑ์คะแนนความเชื่อมั่นที่ต้องการ (ดูประเมินโมเดล)
Java
// Initialization
ObjectDetectorOptions options = ObjectDetectorOptions.builder()
.setScoreThreshold(0) // Evaluate your model in the Google Cloud console
// to determine an appropriate value.
.build();
ObjectDetector objectDetector = ObjectDetector.createFromFileAndOptions(context, modelFile, options);
Kotlin
// Initialization
val options = ObjectDetectorOptions.builder()
.setScoreThreshold(0) // Evaluate your model in the Google Cloud console
// to determine an appropriate value.
.build()
val objectDetector = ObjectDetector.createFromFileAndOptions(context, modelFile, options)
หากคุณมีโมเดลที่โฮสต์จากระยะไกล คุณจะต้องตรวจสอบว่ามีการ
ซึ่งดาวน์โหลดมาก่อนที่จะเรียกใช้ คุณตรวจสอบสถานะการดาวน์โหลดโมเดลได้
โดยใช้เมธอด isModelDownloaded()
ของผู้จัดการโมเดล
ถึงแม้ว่าคุณจะต้องยืนยันเรื่องนี้ก่อนที่จะเรียกใช้ตัวตรวจจับวัตถุ แต่ถ้าหาก มีทั้งโมเดลที่โฮสต์จากระยะไกลและโมเดลที่รวมอยู่ภายใน การตรวจสอบนี้เมื่อเริ่มต้นตัวตรวจจับวัตถุ โดยสร้างองค์ประกอบ ตัวตรวจจับวัตถุจากโมเดลระยะไกล หากดาวน์โหลดแล้ว และจากในเครื่อง หากไม่เป็นเช่นนั้น
Java
FirebaseModelManager.getInstance().isModelDownloaded(remoteModel)
.addOnSuccessListener(new OnSuccessListener<Boolean>() {
@Override
public void onSuccess(Boolean isDownloaded) {
}
});
Kotlin
FirebaseModelManager.getInstance().isModelDownloaded(remoteModel)
.addOnSuccessListener { success ->
}
หากมีเพียงโมเดลที่โฮสต์จากระยะไกล คุณควรปิดใช้ฟังก์ชันการทำงานที่เกี่ยวข้องกับโมเดล เช่น ปิดใช้หรือซ่อน UI บางส่วน จนกว่าคุณจะยืนยันว่าดาวน์โหลดโมเดลแล้ว คุณสามารถทำได้โดยการแนบ Listener
ไปยังเมธอด download()
ของตัวจัดการโมเดล
เมื่อทราบว่าดาวน์โหลดโมเดลแล้ว ให้สร้างตัวตรวจจับวัตถุจาก ไฟล์โมเดล:
Java
FirebaseModelManager.getInstance().getLatestModelFile(remoteModel)
.addOnCompleteListener(new OnCompleteListener<File>() {
@Override
public void onComplete(@NonNull Task<File> task) {
File modelFile = task.getResult();
if (modelFile != null) {
ObjectDetectorOptions options = ObjectDetectorOptions.builder()
.setScoreThreshold(0)
.build();
objectDetector = ObjectDetector.createFromFileAndOptions(
getApplicationContext(), modelFile.getPath(), options);
}
}
});
Kotlin
FirebaseModelManager.getInstance().getLatestModelFile(remoteModel)
.addOnSuccessListener { modelFile ->
val options = ObjectDetectorOptions.builder()
.setScoreThreshold(0f)
.build()
objectDetector = ObjectDetector.createFromFileAndOptions(
applicationContext, modelFile.path, options)
}
2. เตรียมรูปภาพอินพุต
จากนั้นสร้างออบเจ็กต์ TensorImage
จาก
รูปภาพ คุณสร้างออบเจ็กต์ TensorImage
จาก Bitmap
ได้โดยใช้เมธอด fromBitmap
ดังนี้
Java
TensorImage image = TensorImage.fromBitmap(bitmap);
Kotlin
val image = TensorImage.fromBitmap(bitmap)
หากข้อมูลรูปภาพไม่อยู่ใน Bitmap
คุณสามารถโหลดอาร์เรย์พิกเซลดังที่แสดงใน
เอกสารของ TensorFlow Lite
3. เรียกใช้ตัวตรวจจับวัตถุ
หากต้องการตรวจจับวัตถุในรูปภาพ ให้ส่งวัตถุ TensorImage
ไปยัง
เมธอด detect()
ของ ObjectDetector
Java
List<Detection> results = objectDetector.detect(image);
Kotlin
val results = objectDetector.detect(image)
4. รับข้อมูลเกี่ยวกับออบเจ็กต์ที่ติดป้ายกำกับ
หากการดำเนินการตรวจจับออบเจ็กต์สำเร็จ ระบบจะแสดงรายการ Detection
ออบเจ็กต์ ออบเจ็กต์ Detection
แต่ละรายการแสดงถึงบางอย่างที่ตรวจพบใน
รูปภาพ คุณจะดูกรอบล้อมรอบของออบเจ็กต์แต่ละรายการและป้ายกำกับของออบเจ็กต์ได้
เช่น
Java
for (Detection result : results) {
RectF bounds = result.getBoundingBox();
List<Category> labels = result.getCategories();
}
Kotlin
for (result in results) {
val bounds = result.getBoundingBox()
val labels = result.getCategories()
}
เคล็ดลับในการปรับปรุงประสิทธิภาพแบบเรียลไทม์
หากต้องการติดป้ายกำกับรูปภาพในแอปพลิเคชันแบบเรียลไทม์ ให้ทำตามดังนี้ เพื่อให้ได้อัตราเฟรมที่ดีที่สุด
- ควบคุมการเรียกไปยังผู้ติดป้ายกำกับรูปภาพ หากเฟรมวิดีโอใหม่กลายเป็น
ว่างในขณะที่เครื่องมือติดป้ายกำกับรูปภาพทำงานอยู่ ให้วางเฟรม ดูตัวอย่างได้จากคลาส
VisionProcessorBase
ในแอปตัวอย่างการเริ่มต้นใช้งาน - ถ้าคุณใช้เอาต์พุตของเครื่องมือติดป้ายกำกับรูปภาพเพื่อวางซ้อนกราฟิก
รูปภาพอินพุต รับผลลัพธ์ก่อน จากนั้นเรนเดอร์
ซ้อนทับในขั้นตอนเดียว การดำเนินการดังกล่าวจะแสดงบนพื้นผิวจอแสดงผล
เพียงครั้งเดียวสำหรับเฟรมอินพุตแต่ละเฟรม โปรดดู
CameraSourcePreview
และGraphicOverlay
คลาสในแอปตัวอย่างการเริ่มต้นอย่างรวดเร็วสำหรับ -
หากคุณใช้ Camera2 API ให้จับภาพใน
ImageFormat.YUV_420_888
หากคุณใช้ Camera API เวอร์ชันเก่า ให้ถ่ายภาพในรูปแบบ
ImageFormat.NV21