รู้จักดอกไม้ด้วย TensorFlow Lite บน Android

657431be3173fa86.pngandroid.png

หมายเหตุ: codelab นี้ต้องใช้อุปกรณ์จริงในการทดสอบ

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

codelab นี้ใช้ TensorFlow Lite เพื่อเรียกใช้รูปแบบการจดจำภาพบนอุปกรณ์ Android

ติดตั้ง Android Studio 4.1 ขึ้นไป

หากคุณยังไม่ได้ติดตั้งให้ไป ดาวน์โหลดและติดตั้ง AndroidStudio 4.1 ขึ้นไป ในขณะที่คุณกำลังฝึกรุ่น TensorFlow Lite

สิ่งที่คุณจะได้เรียนรู้

  • วิธีฝึกลักษณนามภาพที่คุณกำหนดเองโดยใช้ TensorFlow Lite Model Maker
  • วิธีใช้ Android Studio เพื่อนำเข้าโมเดล TensorFlow Lite เพื่อรวมโมเดลที่กำหนดเองในแอพ Android โดยใช้ CameraX
  • วิธีใช้ GPU บนโทรศัพท์เพื่อเร่งโมเดลของคุณ

สิ่งที่คุณจะสร้าง

แอพกล้องง่ายๆที่รันโปรแกรมจดจำภาพ TensorFlow เพื่อระบุดอกไม้

f11c2821f2c8311d.png

ใบอนุญาต: ใช้งานได้ฟรี

ก่อนเริ่มการฝึกโมเดลให้เริ่มดาวน์โหลดและติดตั้ง Android Studio 4.1 ขึ้น ไป

เปิดColab ซึ่งแสดงวิธีการฝึกลักษณนามด้วย Keras เพื่อจดจำดอกไม้โดยใช้การเรียนรู้การถ่ายโอน TensorFlow Lite

โคลนที่เก็บ Git

คำสั่งต่อไปนี้จะโคลนที่เก็บ Git ที่มีไฟล์ที่จำเป็นสำหรับ codelab นี้:

git clone https://github.com/hoitab/TFLClassify.git

จากนั้นไปที่ไดเร็กทอรีที่คุณเพิ่งโคลนที่เก็บ นี่คือที่ที่คุณจะดำเนินการกับส่วนที่เหลือของ codelab นี้:

cd TFLClassify

android.png

ติดตั้ง Android Studio 4.1 ขึ้นไป

หากคุณยังไม่ได้ติดตั้งให้ไป ติดตั้ง AndroidStudio 4.1 ขึ้น ไป

เปิดโปรเจ็กต์ด้วย Android Studio

เปิดโปรเจ็กต์ด้วย Android Studio โดยทำตามขั้นตอนต่อไปนี้:

  1. เปิด Android Studio 7f2480ded53a193b.png . หลังจากโหลดแล้วให้เลือก "เปิดโครงการที่มีอยู่" จากป๊อปอัปนี้:

f3b8bea7e3b39376.png

  1. ในตัวเลือกไฟล์ให้เลือก TFLClassify/build.gradle จากไดเร็กทอรีการทำงานของคุณ
  1. คุณจะได้รับป๊อปอัป "Gradle Sync" ในครั้งแรกที่คุณเปิดโปรเจ็กต์โดยถามเกี่ยวกับการใช้ Gradle Wrapper คลิก "ตกลง"

d68b4d7189e6c1e4.png

  1. เปิดใช้งานโมเดลนักพัฒนาและการแก้จุดบกพร่อง USB บนโทรศัพท์ของคุณหากคุณยังไม่ได้ทำ นี่คือการตั้งค่าเพียงครั้งเดียว ปฏิบัติตาม คำแนะนำเหล่านี้
  2. เมื่อทั้งโปรเจ็กต์และโทรศัพท์ของคุณพร้อมแล้วคุณสามารถรันบนอุปกรณ์จริงได้โดยเลือก TFL_Classify.start แล้วกดปุ่ม run 86934b7b01ad7565.png บนแถบเครื่องมือ:

60a77ef126c1373d.png

  1. ตอนนี้อนุญาตให้ Tensorflow Demo เข้าถึงกล้องของคุณ:

b63cba02bb36b7e3.png

  1. คุณจะเห็นหน้าจอต่อไปนี้บนโทรศัพท์ของคุณพร้อมตัวเลขสุ่มที่แสดงผลจริง

82c603596afa35f1.png

  1. เลือกโมดูล start ในตัวสำรวจโครงการทางด้านซ้ายมือ:

cede7f2b8b23c1a7.png

  1. คลิกขวาที่โมดูล start หรือคลิกที่ File จากนั้น New > Other > TensorFlow Lite Model

bf243d9fdd27e20a.png

  1. เลือกตำแหน่งโมเดลที่คุณดาวน์โหลด FlowerModel.tflite ได้รับการฝึกฝนมาก่อนหน้านี้

cfee18cc6674a408.png

  1. คลิก Finish
  2. คุณจะเห็นสิ่งต่อไปนี้ในตอนท้าย นำเข้า FlowerModel.tflite สำเร็จแล้วและจะแสดงข้อมูลระดับสูงเกี่ยวกับโมเดลรวมถึงอินพุต / เอาต์พุตตลอดจนโค้ดตัวอย่างเพื่อให้คุณเริ่มต้น

82840065f0d59def.png

รายการสิ่งที่ต้องทำทำให้ง่ายต่อการนำทางไปยังตำแหน่งที่แน่นอนที่คุณต้องการอัปเดต codelab คุณยังสามารถใช้ในโครงการ Android เพื่อเตือนตัวเองถึงงานในอนาคต คุณสามารถเพิ่มรายการสิ่งที่ต้องทำโดยใช้ความคิดเห็นของโค้ดและพิมพ์คำสำคัญ TODO ในการเข้าถึงรายการสิ่งที่ต้องทำคุณสามารถ:

  1. วิธีที่ดีในการดูสิ่งที่เรากำลังจะทำคือดูรายการสิ่งที่ต้องทำ ในการทำเช่นนั้นให้เลือกจากแถบเมนูด้านบน View > Tool Windows > TODO

5de29b413574f25c.png

  1. โดยค่าเริ่มต้นจะแสดงรายการสิ่งที่ต้องทำทั้งหมดในโมดูลทั้งหมดซึ่งทำให้สับสนเล็กน้อย เราสามารถจัดเรียงเฉพาะสิ่งที่ต้องทำเริ่มต้นได้โดยคลิกที่ปุ่มกลุ่มตามด้านข้างของแผงสิ่งที่ต้องทำและเลือก Modules

5d8fe7b102340208.png

  1. ขยายรายการทั้งหมดภายใต้โมดูลเริ่มต้น:

8d0f14a039995b20.png

  1. คลิกที่สิ่งที่ต้องทำ 1 ในรายการสิ่งที่ต้องทำหรือเปิดไฟล์ MainActivity.kt และค้นหาสิ่งที่ต้องทำ 1 เริ่มต้นโมเดลโดยการเพิ่มบรรทัดนี้:
private class ImageAnalyzer(ctx: Context, private val listener: RecognitionListener) :
        ImageAnalysis.Analyzer {

  ...
  // TODO 1: Add class variable TensorFlow Lite Model
  private val flowerModel = FlowerModel.newInstance(ctx)

  ...
}
  1. ภายในวิธีการวิเคราะห์สำหรับ CameraX Analyzer เราจำเป็นต้องแปลงอินพุตของกล้อง ImageProxy เป็น Bitmap และสร้างวัตถุ TensorImage สำหรับกระบวนการอนุมาน
override fun analyze(imageProxy: ImageProxy) {
  ...
  // TODO 2: Convert Image to Bitmap then to TensorImage
  val tfImage = TensorImage.fromBitmap(toBitmap(imageProxy))
  ...
}

  1. ประมวลผลภาพและดำเนินการต่อไปนี้กับผลลัพธ์:
  • เรียงลำดับผลลัพธ์จากมากไปหาน้อยตามความน่าจะเป็นภายใต้ score แอตทริบิวต์ที่มีความน่าจะเป็นสูงสุดก่อน
  • รับผลลัพธ์ k อันดับสูงสุดตามที่กำหนดโดยค่าคงที่ MAX_RESULT_DISPLAY คุณสามารถเลือกเปลี่ยนค่าของตัวแปรนี้เพื่อให้ได้ผลลัพธ์มากหรือน้อย
override fun analyze(imageProxy: ImageProxy) {
  ...
  // TODO 3: Process the image using the trained model, sort and pick out the top results
  val outputs = flowerModel.process(tfImage)
      .probabilityAsCategoryList.apply {
          sortByDescending { it.score } // Sort with highest confidence first
      }.take(MAX_RESULT_DISPLAY) // take the top results

  ...
}
  1. แปลงผลลัพธ์ที่เรียงลำดับและกรองเป็นอ็อบเจ็กต์ข้อมูล Recognition พร้อมที่จะใช้โดย RecyclerView ผ่าน การเชื่อมข้อมูล :
override fun analyze(imageProxy: ImageProxy) {
  ...
  // TODO 4: Converting the top probability items into a list of recognitions
  for (output in outputs) {
      items.add(Recognition(output.label, output.score))
  }
  ...
}
  1. แสดงความคิดเห็นหรือลบบรรทัดต่อไปนี้ซึ่งช่วยสร้างผลลัพธ์ปลอมที่เราเห็นมาก่อน:
// START - Placeholder code at the start of the codelab. Comment this block of code out.
for (i in 0..MAX_RESULT_DISPLAY-1){
    items.add(Recognition("Fake label $i", Random.nextFloat()))
}
// END - Placeholder code at the start of the codelab. Comment this block of code out.
  1. เรียกใช้แอปบนอุปกรณ์จริงโดยเลือก TFL_Classify.start แล้วกดปุ่มเรียกใช้ 86934b7b01ad7565.png บนแถบเครื่องมือ:

60a77ef126c1373d.png

  1. คุณจะเห็นหน้าจอต่อไปนี้บนโทรศัพท์ของคุณพร้อมตัวเลขสุ่มที่แสดงผลลัพธ์จริง:

f11c2821f2c8311d.png

TensorFlow Lite รองรับตัวเร่งฮาร์ดแวร์หลายตัวเพื่อเร่งการอนุมานบนอุปกรณ์มือถือของคุณ GPU เป็นหนึ่งในตัวเร่งความเร็วที่ TensorFlow Lite สามารถใช้ประโยชน์จากกลไกการมอบสิทธิ์และใช้งานได้ค่อนข้างง่าย

  1. เปิด build.gradle ใต้โมดูล start หรือคุณสามารถคลิกที่สิ่งที่ต้องทำ 5 ภายใต้รายการสิ่งที่ต้องทำและเพิ่มการอ้างอิงต่อไปนี้:
// TODO 5: Optional GPU Delegates    
implementation 'org.tensorflow:tensorflow-lite-gpu:2.3.0'
  1. กลับไปที่ไฟล์ MainActivity.kt หรือคลิกที่สิ่งที่ต้องทำ 6 ในรายการสิ่งที่ต้องทำ แทนที่การเริ่มต้นอย่างง่ายของ flowerModel ด้วยสิ่งต่อไปนี้: รับอินสแตนซ์ของรายการความเข้ากันได้ของ GPU และเริ่มต้น GPU โดยขึ้นอยู่กับว่าเป็น GPU ที่เข้ากันได้ในรายการใดรายการหนึ่งหรือไม่ มิฉะนั้นให้เริ่มเธรด CPU 4 เธรดเพื่อรันโมเดลแทน:
private class ImageAnalyzer(ctx: Context, private val listener: RecognitionListener) :
        ImageAnalysis.Analyzer {
  ...

  // TODO 1: Add class variable TensorFlow Lite Model
  // Initializing the flowerModel by lazy so that it runs in the same thread when the process
  // method is called.
  private val flowerModel: FlowerModel by lazy{

    // TODO 6. Optional GPU acceleration
    val compatList = CompatibilityList()

    val options = if(compatList.isDelegateSupportedOnThisDevice){
        Log.d(TAG, "This device is GPU Compatible ")
        Model.Options.Builder().setDevice(Model.Device.GPU).build()
    } else {
        Log.d(TAG, "This device is GPU Incompatible ")
        Model.Options.Builder().setNumThreads(4).build()
    }

  ...
}
  1. เปลี่ยน model initializer เพื่อใช้สิ่งนี้โดยการเพิ่ม options ให้กับอินพุตเมธอด:
private class ImageAnalyzer(ctx: Context, private val listener: RecognitionListener) :
        ImageAnalysis.Analyzer {

  private val flowerModel: FlowerModel by lazy{

    ...

    // Initialize the Flower Model
    FlowerModel.newInstance(ctx, options)
  }
}

  1. เรียกใช้แอปบนอุปกรณ์จริงโดยเลือก TFL_Classify.start แล้วกดปุ่มเรียกใช้ 86934b7b01ad7565.png บนแถบเครื่องมือ:

60a77ef126c1373d.png

ลิงค์สำหรับข้อมูลเพิ่มเติมมีดังต่อไปนี้: