1. บทนำ

หมายเหตุ: 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 เพื่อระบุดอกไม้

ใบอนุญาต: ใช้ได้ฟรี
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 Studio 4.1 ขึ้นไป
หากยังไม่ได้ติดตั้ง ให้ไปที่ติดตั้ง Android Studio 4.1 ขึ้นไป
เปิดโปรเจ็กต์ด้วย Android Studio
เปิดโปรเจ็กต์ด้วย Android Studio โดยทำตามขั้นตอนต่อไปนี้
- เปิด Android Studio
หลังจากโหลดแล้ว ให้เลือก "เปิดโปรเจ็กต์ที่มีอยู่" จากป๊อปอัปนี้

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

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

- ตอนนี้ให้สิทธิ์ Tensorflow Demo เข้าถึงกล้องของคุณโดยทำดังนี้

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

5. เพิ่ม TensorFlow Lite ลงในแอป Android
- เลือกโมดูล
startในโปรแกรมสำรวจโปรเจ็กต์ทางด้านซ้าย

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

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

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

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

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

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

7. เรียกใช้โมเดลที่กำหนดเองด้วย TensorFlow Lite
- คลิก 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)
...
}
- ภายในเมธอดวิเคราะห์ของ 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))
...
}
- ประมวลผลรูปภาพและดำเนินการต่อไปนี้กับผลลัพธ์
- จัดเรียงผลลัพธ์ตามความน่าจะเป็นภายใต้แอตทริบิวต์
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
...
}
- แปลงผลลัพธ์ที่จัดเรียงและกรองแล้วเป็นออบเจ็กต์ข้อมูล
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))
}
...
}
- ใส่เครื่องหมายแสดงความคิดเห็นหรือลบบรรทัดต่อไปนี้ซึ่งช่วยสร้างผลลัพธ์ปลอมที่เราเห็นก่อนหน้านี้
// 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.
- เรียกใช้แอปในอุปกรณ์จริงโดยเลือก
TFL_Classify.startแล้วกดปุ่มเรียกใช้
บนแถบเครื่องมือ

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

8. ไม่บังคับ: เร่งการอนุมานด้วยตัวแทน GPU
TensorFlow Lite รองรับตัวเร่งฮาร์ดแวร์หลายตัวเพื่อเพิ่มความเร็วในการอนุมานบนอุปกรณ์เคลื่อนที่ GPU เป็นหนึ่งในตัวเร่งที่ TensorFlow Lite ใช้ประโยชน์ได้ผ่านกลไกการมอบสิทธิ์และใช้งานได้ง่าย
- เปิด build.gradle ในโมดูล
startหรือคลิก TODO 5 ในรายการ TODO แล้วเพิ่มการอ้างอิงต่อไปนี้
// TODO 5: Optional GPU Delegates
implementation 'org.tensorflow:tensorflow-lite-gpu:2.3.0'
- กลับไปที่ไฟล์ 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()
}
...
}
- เปลี่ยนตัวเริ่มต้นของโมเดลให้ใช้สิ่งนี้โดยเพิ่ม
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)
}
}
- เรียกใช้แอปในอุปกรณ์จริงโดยเลือก
TFL_Classify.startแล้วกดปุ่มเรียกใช้
บนแถบเครื่องมือ

9. ขั้นตอนถัดไป
ดูข้อมูลเพิ่มเติมได้ที่ลิงก์ต่อไปนี้
- ลองใช้โมเดล TFLite อื่นๆ ที่ใช้ได้กับการเชื่อมโยงโมเดล ML จาก tfhub.dev
- ดูข้อมูลเพิ่มเติมเกี่ยวกับ TFLite ได้จากเอกสารใน tensorflow.org และที่เก็บโค้ด
- ลองใช้โมเดลที่ผ่านการฝึกมาล่วงหน้าของ TFLite อื่นๆ ซึ่งรวมถึงเครื่องตรวจหาคำสั่งเสียงและเวอร์ชันการตอบกลับอัจฉริยะในอุปกรณ์
- ดูข้อมูลเพิ่มเติมเกี่ยวกับ TensorFlow โดยทั่วไปได้ในเอกสารการเริ่มต้นใช้งาน