หลังจากฝึกโมเดลของคุณเองโดยใช้ AutoML Vision Edge แล้ว คุณจะใช้โมเดลดังกล่าวในแอปเพื่อตรวจจับออบเจ็กต์ในรูปภาพได้
การผสานรวมโมเดลที่ฝึกจาก AutoML Vision Edge ทำได้ 2 วิธี ได้แก่ คุณสามารถรวมโมเดลโดยใส่ไว้ในโฟลเดอร์ชิ้นงานของแอป หรือจะดาวน์โหลดจาก Firebase แบบไดนามิกก็ได้
ตัวเลือกการรวมโมเดล | |
---|---|
รวมไว้ในแอป |
|
โฮสต์ด้วย Firebase |
|
ก่อนเริ่มต้น
หากต้องการดาวน์โหลดโมเดล ให้ตรวจสอบว่าคุณได้ เพิ่ม Firebase ลงในโปรเจ็กต์ Android แล้ว หากยังไม่ได้ดำเนินการ การดำเนินการนี้ไม่จำเป็นเมื่อคุณรวมโมเดล
เพิ่มทรัพยากร Dependency สำหรับไลบรารี TensorFlow Lite Task ลงในไฟล์ 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 แบบไดนามิก ให้เพิ่มการอ้างอิง Firebase ML ด้วย
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
จากแหล่งที่มาใดแหล่งที่มาหนึ่ง
หากมีเพียงโมเดลที่รวมไว้ในเครื่อง ให้สร้างเครื่องตรวจจับออบเจ็กต์จากไฟล์โมเดลและกำหนดค่าเกณฑ์คะแนนความเชื่อมั่นที่คุณต้องการ (ดูประเมินโมเดล) ดังนี้
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()
ของ Model Manager
เมื่อทราบว่าดาวน์โหลดโมเดลแล้ว ให้สร้างเครื่องตรวจจับออบเจ็กต์จาก ไฟล์โมเดลโดยทำดังนี้
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
ในแอปตัวอย่างการเริ่มต้นอย่างรวดเร็วเพื่อดู ตัวอย่าง -
หากใช้ API ของ Camera2 ให้ถ่ายภาพในรูปแบบ
ImageFormat.YUV_420_888
หากใช้ Camera API เวอร์ชันเก่า ให้ถ่ายภาพในรูปแบบ
ImageFormat.NV21