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