จดจำดอกไม้ด้วย TensorFlow Lite บน Android

1. บทนำ

657431be3173fa86.png android.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

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

2. ฝึกระบบจดจำดอกไม้โดยใช้ Colab

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

เปิด Colab ซึ่งแสดงวิธีฝึกตัวแยกประเภทด้วย Keras ให้จดจำดอกไม้โดยใช้การเรียนรู้การโอนของ TensorFlow Lite

3. ตั้งค่าไดเรกทอรีที่ใช้งานอยู่

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

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

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

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

cd TFLClassify

4. ตั้งค่าแอป Android Skeleton

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 และกดปุ่มเรียกใช้ 86934b7b01ad7565.png ในแถบเครื่องมือ

60a77ef126c1373d.png

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

b63cba02bb36b7e3.png

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

82c603596afa35f1.png

5. เพิ่ม TensorFlow Lite ลงในแอป Android

  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

6. ไม่บังคับ: กำลังตรวจสอบรายการสิ่งที่ต้องทำทั้งหมด

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

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

5de29b413574f25c.png

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

5d8fe7b102340208.png

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

8d0f14a039995b20.png

7. เรียกใช้โมเดลที่กำหนดเองด้วย TensorFlow Lite

  1. คลิกที่ TODO 1 ในรายการ TODO หรือเปิดไฟล์ MainActivity.kt และค้นหา TODO 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 analyticsr เราจะต้องแปลงอินพุตของกล้อง 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

8. ไม่บังคับ: เร่งการอนุมานด้วยการมอบสิทธิ์ GPU

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

  1. เปิด build.gradle ภายใต้โมดูล start หรือคลิก TODO 5 ใต้รายการสิ่งที่ต้องทำ แล้วเพิ่มทรัพยากร Dependency ต่อไปนี้
// 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. เปลี่ยนตัวเริ่มต้นโมเดลให้ใช้ค่านี้โดยการเพิ่ม 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

9. สิ่งที่ต้องทำต่อไป

โปรดดูข้อมูลเพิ่มเติมที่ลิงก์ต่อไปนี้