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

1. บทนำ

657431be3173fa86.png android.png

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

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

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

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

หากยังไม่ได้ติดตั้ง ให้ไปดาวน์โหลดและติดตั้ง Android Studio 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

android.png

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

หากยังไม่ได้ติดตั้ง ให้ไปที่ติดตั้ง Android Studio 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 ในรายการสิ่งที่ต้องทำ หรือเปิดไฟล์ 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 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

8. ไม่บังคับ: เร่งการอนุมานด้วยตัวแทน GPU

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

  1. เปิด build.gradle ในโมดูล start หรือคลิก TODO 5 ในรายการ TODO แล้วเพิ่มการอ้างอิงต่อไปนี้
// TODO 5: Optional GPU Delegates    
implementation 'org.tensorflow:tensorflow-lite-gpu:2.3.0'
  1. กลับไปที่ไฟล์ MainActivity.kt หรือคลิก TODO 6 ในรายการ TODO แทนที่การเริ่มต้น flowerModel อย่างง่ายด้วยโค้ดต่อไปนี้ รับอินสแตนซ์ของรายการความเข้ากันได้ของ GPU และเริ่มต้น GPU โดยขึ้นอยู่กับว่า GPU นั้นเป็นหนึ่งใน GPU ที่เข้ากันได้ที่ระบุไว้หรือไม่ ไม่เช่นนั้น ให้เริ่มใช้ 4 เธรด CPU เพื่อเรียกใช้โมเดลแทน
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. ขั้นตอนถัดไป

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