ตรวจจับวัตถุในรูปภาพด้วยโมเดลที่ได้รับการฝึกด้วย AutoML บน Android

หลังจากที่คุณ ฝึกรูปแบบของคุณเองโดยใช้ AutoML วิสัยทัศน์ขอบ คุณสามารถใช้มันใน app ของคุณในการตรวจสอบวัตถุในภาพ

มีสองวิธีในการผสานรวมโมเดลที่ฝึกจาก AutoML Vision Edge: คุณสามารถรวมโมเดลโดยใส่ไว้ในโฟลเดอร์แอสเซทของแอป หรือดาวน์โหลดแบบไดนามิกจาก Firebase

ตัวเลือกการรวมโมเดล
รวมอยู่ในแอพของคุณ
  • โมเดลนี้เป็นส่วนหนึ่งของ APK . ของแอปของคุณ
  • รุ่นพร้อมใช้งานทันทีแม้ในขณะที่อุปกรณ์ Android ออฟไลน์
  • ไม่จำเป็นต้องมีโปรเจ็กต์ Firebase
โฮสต์กับ Firebase
  • เป็นเจ้าภาพจัดรูปแบบโดยการอัปโหลดไปยัง Firebase เครื่องการเรียนรู้
  • ลดขนาด APK
  • ดาวน์โหลดแบบจำลองได้ตามต้องการ
  • ผลักดันการอัปเดตโมเดลโดยไม่ต้องเผยแพร่แอปของคุณซ้ำ
  • ง่าย A / B ทดสอบกับ Firebase ระยะไกล Config
  • ต้องใช้โปรเจ็กต์ Firebase

ก่อนจะเริ่ม

  1. หากคุณต้องการดาวน์โหลดแบบให้แน่ใจว่าคุณ เพิ่ม Firebase กับโครงการ Android ของคุณ ถ้าคุณยังไม่ได้ดำเนินการ ไม่จำเป็นเมื่อคุณรวมโมเดล

  2. เพิ่มการอ้างอิงสำหรับห้องสมุด 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 ให้เพิ่มการพึ่งพา 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. โหลดโมเดล

กำหนดค่าแหล่งที่มาของโมเดลในพื้นที่

วิธีรวมโมเดลกับแอปของคุณ:

  1. แยกโมเดลจากไฟล์ zip ที่คุณดาวน์โหลดจาก Google Cloud Console
  2. รวมโมเดลของคุณในแพ็คเกจแอพของคุณ:
    1. หากคุณไม่ได้มีทรัพย์สินโฟลเดอร์ในโครงการของคุณสร้างหนึ่งโดยการคลิกขวาที่ app/ โฟลเดอร์แล้วคลิกใหม่> โฟลเดอร์> สินทรัพย์โฟลเดอร์
    2. คัดลอก tflite ไฟล์รูปแบบกับเมตาดาต้าที่ฝังตัวไปยังโฟลเดอร์สินทรัพย์
  3. เพิ่มต่อไปนี้เพื่อของแอป build.gradle ไฟล์เพื่อให้แน่ใจว่า Gradle ไม่บีบอัดไฟล์รูปแบบเมื่อมีการสร้าง app:

    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 ของคุณ จนกว่าคุณจะยืนยันว่าได้ดาวน์โหลดโมเดลแล้ว คุณสามารถทำได้โดยการแนบฟังกับผู้จัดการรูปแบบของ 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 วัตถุไป ObjectDetector 's detect() วิธีการ

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 ชั้นในแอปตัวอย่าง QuickStart เช่น
  • หากคุณกำลังใช้เอาต์พุตของตัวติดป้ายกำกับรูปภาพเพื่อซ้อนทับกราฟิกบนรูปภาพอินพุต ขั้นแรกให้รับผลลัพธ์ จากนั้นแสดงรูปภาพและโอเวอร์เลย์ในขั้นตอนเดียว เมื่อทำเช่นนั้น คุณจะแสดงผลไปยังพื้นผิวการแสดงผลเพียงครั้งเดียวสำหรับแต่ละเฟรมอินพุต ดู CameraSourcePreview และ GraphicOverlay ชั้นเรียนในแอปพลิเคตัวอย่าง QuickStart เช่น
  • ถ้าคุณใช้ API Camera2 จับภาพใน ImageFormat.YUV_420_888 รูปแบบ

    ถ้าคุณใช้กล้อง API เก่าจับภาพใน ImageFormat.NV21 รูปแบบ