TensorFlow Lite มีให้บริการในรันไทม์ของบริการ Google Play สำหรับอุปกรณ์ Android ทั้งหมดที่ใช้บริการ Play เวอร์ชันปัจจุบัน รันไทม์นี้ช่วยให้คุณเรียกใช้โมเดลแมชชีนเลิร์นนิง (ML) โดยไม่ต้องรวมไลบรารี TensorFlow Lite เข้ากับแอปของคุณ
ด้วย API บริการ Google Play คุณสามารถลดขนาดแอปของคุณและรับประสิทธิภาพที่ดีขึ้นจากไลบรารีเวอร์ชันเสถียรล่าสุด TensorFlow Lite ในบริการ Google Play เป็นวิธีที่แนะนำในการใช้ TensorFlow Lite บน Android
คุณสามารถเริ่มต้นใช้งาน Play services runtime ด้วย Quickstart ซึ่งมีคำแนะนำทีละขั้นตอนในการใช้งานแอปพลิเคชันตัวอย่าง หากคุณใช้ TensorFlow Lite แบบสแตนด์อโลนในแอปของคุณอยู่แล้ว โปรดดูส่วนการ ย้ายจาก TensorFlow Lite แบบสแตนด์อโลน เพื่ออัปเดตแอปที่มีอยู่เพื่อใช้บริการรันไทม์ของ Play สำหรับข้อมูลเพิ่มเติมเกี่ยวกับบริการ Google Play โปรดดูที่เว็บไซต์ บริการ Google Play
การใช้รันไทม์บริการ Play
TensorFlow Lite ในบริการ Google Play มีให้บริการผ่าน TensorFlow Lite Task API และ TensorFlow Lite Interpreter API ไลบรารีงานมีอินเทอร์เฟซโมเดลสำเร็จรูปที่ปรับให้เหมาะสมสำหรับงานการเรียนรู้ของเครื่องทั่วไปโดยใช้ข้อมูลภาพ เสียง และข้อความ TensorFlow Lite Interpreter API ที่จัดเตรียมโดย TensorFlow รันไทม์และไลบรารีสนับสนุน จัดเตรียมอินเทอร์เฟซสำหรับใช้งานทั่วไปมากขึ้นสำหรับการสร้างและรันโมเดล ML
ส่วนต่อไปนี้ให้คำแนะนำเกี่ยวกับวิธีการใช้งาน Interpreter และ Task Library API ในบริการ Google Play แม้ว่าแอปจะใช้ทั้ง Interpreter API และ Task Library API ได้ แต่แอปส่วนใหญ่ควรใช้ API ชุดเดียวเท่านั้น
การใช้ API ไลบรารีงาน
TensorFlow Lite Task API ครอบคลุม Interpreter API และจัดเตรียมอินเทอร์เฟซการเขียนโปรแกรมระดับสูงสำหรับงานการเรียนรู้ของเครื่องทั่วไปที่ใช้ข้อมูลภาพ เสียง และข้อความ คุณควรใช้ API ของงาน หากแอปพลิเคชันของคุณต้องการงานที่ ได้รับการสนับสนุนอย่าง ใดอย่างหนึ่ง
1. เพิ่มการพึ่งพาโครงการ
การพึ่งพาโปรเจ็กต์ของคุณขึ้นอยู่กับกรณีการใช้งานแมชชีนเลิร์นนิงของคุณ Task APIs มีไลบรารีต่อไปนี้:
- ไลบรารีวิสัยทัศน์:
org.tensorflow:tensorflow-lite-task-vision-play-services
- ไลบรารีเสียง:
org.tensorflow:tensorflow-lite-task-audio-play-services
- ไลบรารีข้อความ:
org.tensorflow:tensorflow-lite-task-text-play-services
เพิ่มการอ้างอิงรายการใดรายการหนึ่งลงในโค้ดโปรเจ็กต์แอปของคุณเพื่อเข้าถึง Play services API สำหรับ TensorFlow Lite ตัวอย่างเช่น ใช้สิ่งต่อไปนี้เพื่อใช้งานวิสัยทัศน์:
dependencies {
...
implementation 'org.tensorflow:tensorflow-lite-task-vision-play-services:0.4.2'
...
}
2. เพิ่มการเริ่มต้น TensorFlow Lite
เริ่มต้นส่วนประกอบ TensorFlow Lite ของ API บริการ Google Play ก่อน ใช้ TensorFlow Lite API ตัวอย่างต่อไปนี้เริ่มต้นไลบรารีวิสัยทัศน์:
Kotlin
init { TfLiteVision.initialize(context) } }
3. เรียกใช้การอนุมาน
หลังจากเริ่มต้นองค์ประกอบ TensorFlow Lite ให้เรียกเมธอด detect()
เพื่อสร้างการอนุมาน รหัสที่แน่นอนภายในวิธี detect()
จะแตกต่างกันไปตามไลบรารีและกรณีการใช้งาน ต่อไปนี้มีไว้สำหรับกรณีการใช้งานการตรวจจับวัตถุอย่างง่ายกับไลบรารี TfLiteVision
:
Kotlin
fun detect(...) { if (!TfLiteVision.isInitialized()) { Log.e(TAG, "detect: TfLiteVision is not initialized yet") return } if (objectDetector == null) { setupObjectDetector() } ... }
คุณอาจต้องประมวลผลล่วงหน้าและแปลงข้อมูลของคุณภายในวิธี detect()
ก่อนสร้างการอนุมาน ทั้งนี้ขึ้นอยู่กับรูปแบบข้อมูล ตัวอย่างเช่น ข้อมูลรูปภาพสำหรับตัวตรวจจับวัตถุต้องการสิ่งต่อไปนี้:
val imageProcessor = ImageProcessor.Builder().add(Rot90Op(-imageRotation / 90)).build()
val tensorImage = imageProcessor.process(TensorImage.fromBitmap(image))
val results = objectDetector?.detect(tensorImage)
การใช้ API ล่าม
Interpreter API ให้การควบคุมและความยืดหยุ่นมากกว่า Task Library API คุณควรใช้ Interpreter API หากไลบรารีงานไม่รองรับงานการเรียนรู้ของเครื่อง หรือหากคุณต้องการอินเทอร์เฟซทั่วไปสำหรับการสร้างและใช้งานโมเดล ML
1. เพิ่มการพึ่งพาโครงการ
เพิ่มการพึ่งพาต่อไปนี้ในโค้ดโปรเจ็กต์แอปของคุณเพื่อเข้าถึง Play services API สำหรับ TensorFlow Lite:
dependencies {
...
// Tensorflow Lite dependencies for Google Play services
implementation 'com.google.android.gms:play-services-tflite-java:16.0.1'
// Optional: include Tensorflow Lite Support Library
implementation 'com.google.android.gms:play-services-tflite-support:16.0.1'
...
}
2. เพิ่มการเริ่มต้น TensorFlow Lite
เริ่มต้นองค์ประกอบ TensorFlow Lite ของ API บริการ Google Play ก่อน ใช้ TensorFlow Lite API:
Kotlin
val initializeTask: Task<Void> by lazy { TfLite.initialize(this) }
Java
Task<Void> initializeTask = TfLite.initialize(context);
3. สร้างล่ามและตั้งค่าตัวเลือกรันไทม์
สร้างล่ามโดยใช้ InterpreterApi.create()
และกำหนดค่าให้ใช้รันไทม์ของบริการ Google Play โดยการเรียก InterpreterApi.Options.setRuntime()
ตามที่แสดงในโค้ดตัวอย่างต่อไปนี้:
Kotlin
import org.tensorflow.lite.InterpreterApi import org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime ... private lateinit var interpreter: InterpreterApi ... initializeTask.addOnSuccessListener { val interpreterOption = InterpreterApi.Options().setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY) interpreter = InterpreterApi.create( modelBuffer, interpreterOption )} .addOnFailureListener { e -> Log.e("Interpreter", "Cannot initialize interpreter", e) }
Java
import org.tensorflow.lite.InterpreterApi import org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime ... private InterpreterApi interpreter; ... initializeTask.addOnSuccessListener(a -> { interpreter = InterpreterApi.create(modelBuffer, new InterpreterApi.Options().setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)); }) .addOnFailureListener(e -> { Log.e("Interpreter", String.format("Cannot initialize interpreter: %s", e.getMessage())); });
คุณควรใช้การนำไปใช้ด้านบนเพราะจะหลีกเลี่ยงการบล็อกเธรดส่วนต่อประสานผู้ใช้ Android หากคุณต้องการจัดการการทำงานของเธรดอย่างใกล้ชิดยิ่งขึ้น คุณสามารถเพิ่มการเรียก Tasks.await()
เพื่อสร้างล่าม:
Kotlin
import androidx.lifecycle.lifecycleScope ... lifecycleScope.launchWhenStarted { // uses coroutine initializeTask.await() }
Java
@BackgroundThread InterpreterApi initializeInterpreter() { Tasks.await(initializeTask); return InterpreterApi.create(...); }
4. เรียกใช้การอนุมาน
ใช้อ็อบเจ็กต์ interpreter
ที่คุณสร้างขึ้น เรียกเมธอด run()
เพื่อสร้างการอนุมาน
Kotlin
interpreter.run(inputBuffer, outputBuffer)
Java
interpreter.run(inputBuffer, outputBuffer);
การเร่งฮาร์ดแวร์
TensorFlow Lite ช่วยให้คุณเร่งประสิทธิภาพโมเดลของคุณโดยใช้โปรเซสเซอร์ฮาร์ดแวร์เฉพาะ เช่น หน่วยประมวลผลกราฟิก (GPU) คุณสามารถใช้ประโยชน์จากโปรเซสเซอร์พิเศษเหล่านี้ได้โดยใช้ไดรเวอร์ฮาร์ดแวร์ที่เรียกว่า ผู้รับมอบสิทธิ์ คุณสามารถใช้ตัวแทนการเร่งฮาร์ดแวร์ต่อไปนี้กับ TensorFlow Lite ในบริการ Google Play:
ผู้รับมอบสิทธิ์ GPU (แนะนำ) - ผู้รับมอบสิทธิ์นี้มีให้ผ่านบริการ Google Play และโหลดแบบไดนามิก เช่นเดียวกับ Play Services เวอร์ชันของ Task API และ Interpreter API
ผู้รับมอบสิทธิ์ NNAPI - ผู้รับมอบสิทธิ์นี้พร้อมใช้งานเป็นการพึ่งพาไลบรารีที่รวมอยู่ในโปรเจ็กต์การพัฒนา Android ของคุณและรวมอยู่ในแอปของคุณ
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการเร่งความเร็วฮาร์ดแวร์ด้วย TensorFlow Lite โปรดดูหน้า ผู้แทน TensorFlow Lite
กำลังตรวจสอบความเข้ากันได้ของอุปกรณ์
อุปกรณ์บางตัวไม่รองรับการเร่งฮาร์ดแวร์ GPU ด้วย TFLite เพื่อลดข้อผิดพลาดและข้อขัดข้องที่อาจเกิดขึ้น ให้ใช้วิธี TfLiteGpu.isGpuDelegateAvailable
เพื่อตรวจสอบว่าอุปกรณ์เข้ากันได้กับผู้รับมอบสิทธิ์ GPU หรือไม่
ใช้วิธีนี้เพื่อยืนยันว่าอุปกรณ์เข้ากันได้กับ GPU หรือไม่ และใช้ CPU หรือผู้รับมอบสิทธิ์ NNAPI เป็นทางเลือกเมื่อ GPU ไม่ได้รับการสนับสนุน
useGpuTask = TfLiteGpu.isGpuDelegateAvailable(context)
เมื่อคุณมีตัวแปรอย่าง useGpuTask
แล้ว คุณสามารถใช้ตัวแปรนั้นเพื่อกำหนดว่าอุปกรณ์ต่างๆ ใช้ผู้แทน GPU หรือไม่ ตัวอย่างต่อไปนี้แสดงให้เห็นว่าสามารถทำได้ด้วยทั้ง Task Library และ Interpreter API
ด้วย Task Api
Kotlin
lateinit val optionsTask = useGpuTask.continueWith { task -> val baseOptionsBuilder = BaseOptions.builder() if (task.result) { baseOptionsBuilder.useGpu() } ObjectDetectorOptions.builder() .setBaseOptions(baseOptionsBuilder.build()) .setMaxResults(1) .build() }
Java
Task<ObjectDetectorOptions> optionsTask = useGpuTask.continueWith({ task -> BaseOptions baseOptionsBuilder = BaseOptions.builder(); if (task.getResult()) { baseOptionsBuilder.useGpu(); } return ObjectDetectorOptions.builder() .setBaseOptions(baseOptionsBuilder.build()) .setMaxResults(1) .build() });
กับล่ามApi
Kotlin
val interpreterTask = useGpuTask.continueWith { task -> val interpreterOptions = InterpreterApi.Options() .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY) if (task.result) { interpreterOptions.addDelegateFactory(GpuDelegateFactory()) } InterpreterApi.create(FileUtil.loadMappedFile(context, MODEL_PATH), interpreterOptions) }
Java
Task<InterpreterApi.Options> interpreterOptionsTask = useGpuTask.continueWith({ task -> InterpreterApi.Options options = new InterpreterApi.Options().setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY); if (task.getResult()) { options.addDelegateFactory(new GpuDelegateFactory()); } return options; });
GPU พร้อม API ไลบรารีงาน
ในการใช้ผู้รับมอบสิทธิ์ GPU กับ API ของงาน:
อัปเดตการพึ่งพาโปรเจ็กต์เพื่อใช้ผู้รับมอบสิทธิ์ GPU จากบริการ Play:
implementation 'com.google.android.gms:play-services-tflite-gpu:16.1.0'
เริ่มต้นผู้รับมอบสิทธิ์ GPU ด้วย
setEnableGpuDelegateSupport
ตัวอย่างเช่น คุณสามารถเริ่มต้นผู้รับมอบสิทธิ์ GPU สำหรับTfLiteVision
ด้วยสิ่งต่อไปนี้:Kotlin
TfLiteVision.initialize(context, TfLiteInitializationOptions.builder().setEnableGpuDelegateSupport(true).build())
Java
TfLiteVision.initialize(context, TfLiteInitializationOptions.builder().setEnableGpuDelegateSupport(true).build());
เปิดใช้งานตัวเลือกผู้รับมอบสิทธิ์ GPU ด้วย
BaseOptions
:Kotlin
val baseOptions = BaseOptions.builder().useGpu().build()
Java
BaseOptions baseOptions = BaseOptions.builder().useGpu().build();
กำหนดค่าตัวเลือกโดยใช้ .
.setBaseOptions
ตัวอย่างเช่น คุณสามารถตั้งค่า GPU ในObjectDetector
ได้ดังนี้:Kotlin
val options = ObjectDetectorOptions.builder() .setBaseOptions(baseOptions) .setMaxResults(1) .build()
Java
ObjectDetectorOptions options = ObjectDetectorOptions.builder() .setBaseOptions(baseOptions) .setMaxResults(1) .build();
GPU พร้อมล่าม APIs
ในการใช้ GPU delegate กับ Interpreter APIs:
อัปเดตการพึ่งพาโปรเจ็กต์เพื่อใช้ผู้รับมอบสิทธิ์ GPU จากบริการ Play:
implementation 'com.google.android.gms:play-services-tflite-gpu:16.1.0'
เปิดใช้งานตัวเลือกผู้รับมอบสิทธิ์ GPU ในการเริ่มต้น TFlite:
Kotlin
TfLite.initialize(context, TfLiteInitializationOptions.builder() .setEnableGpuDelegateSupport(true) .build())
Java
TfLite.initialize(context, TfLiteInitializationOptions.builder() .setEnableGpuDelegateSupport(true) .build());
ตั้งค่าผู้รับมอบสิทธิ์ GPU ในตัวเลือกล่ามเพื่อใช้
DelegateFactory
โดยเรียกaddDelegateFactory()
ภายในInterpreterApi.Options()
:Kotlin
val interpreterOption = InterpreterApi.Options() .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY) .addDelegateFactory(GpuDelegateFactory())
Java
Options interpreterOption = InterpreterApi.Options() .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY) .addDelegateFactory(new GpuDelegateFactory());
การย้ายจาก TensorFlow Lite . แบบสแตนด์อโลน
หากคุณกำลังวางแผนที่จะย้ายแอปของคุณจาก TensorFlow Lite แบบสแตนด์อโลนไปยัง Play services API ให้อ่านคำแนะนำเพิ่มเติมต่อไปนี้สำหรับการอัปเดตโค้ดโปรเจ็กต์แอปของคุณ:
- ตรวจสอบส่วน ข้อจำกัด ของหน้านี้เพื่อให้แน่ใจว่ารองรับกรณีการใช้งานของคุณ
- ก่อนอัปเดตโค้ดของคุณ ให้ตรวจสอบประสิทธิภาพและความแม่นยำสำหรับโมเดลของคุณ โดยเฉพาะอย่างยิ่งหากคุณใช้ TensorFlow Lite เวอร์ชันเก่ากว่าเวอร์ชัน 2.1 ดังนั้นคุณจึงมีข้อมูลพื้นฐานในการเปรียบเทียบกับการใช้งานใหม่
- หากคุณได้ย้ายรหัสทั้งหมดของคุณเพื่อใช้บริการ Play services API สำหรับ TensorFlow Lite คุณควรลบการพึ่งพา ไลบรารีรันไทม์ TensorFlow Lite ที่มีอยู่ (รายการที่มี
org.tensorflow: tensorflow-lite :*
) ออกจากไฟล์ build.gradle เพื่อให้คุณ สามารถลดขนาดแอปของคุณได้ - ระบุการเกิด
new Interpreter
ในโค้ดของคุณ และแก้ไขเพื่อให้ใช้การเรียก InterpreterApi.create() API ใหม่นี้เป็นแบบอะซิงโครนัส ซึ่งหมายความว่าโดยส่วนใหญ่ไม่ใช่การแทนที่แบบดรอปอิน และคุณต้องลงทะเบียนฟังเมื่อการโทรเสร็จสิ้น อ้างถึงข้อมูลโค้ดในโค้ด ขั้นตอนที่ 3 - เพิ่ม
import org.tensorflow.lite.InterpreterApi;
และimport org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime;
ไปยังไฟล์ต้นฉบับใดๆ โดยใช้org.tensorflow.lite.Interpreter
หรือorg.tensorflow.lite.InterpreterApi
- หากผลการเรียก
InterpreterApi.create()
มีเพียงอาร์กิวเมนต์เดียว ให้ผนวกnew InterpreterApi.Options()
ต่อท้ายรายการอาร์กิวเมนต์ - ผนวก
.setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)
เข้ากับอาร์กิวเมนต์สุดท้ายของการเรียกInterpreterApi.create()
- แทนที่เหตุการณ์อื่นๆ ทั้งหมดของคลาส
org.tensorflow.lite.Interpreter
ด้วยorg.tensorflow.lite.InterpreterApi
หากคุณต้องการใช้ TensorFlow Lite แบบสแตนด์อโลนและ Play services API เคียงข้างกัน คุณต้องใช้ TensorFlow Lite 2.9 (หรือใหม่กว่า) TensorFlow Lite 2.8 และเวอร์ชันก่อนหน้าเข้ากันไม่ได้กับเวอร์ชัน Play services API
ข้อจำกัด
TensorFlow Lite ในบริการ Google Play มีข้อจำกัดดังต่อไปนี้:
- การสนับสนุนสำหรับผู้รับมอบสิทธิ์การเร่งฮาร์ดแวร์จำกัดเฉพาะผู้รับมอบสิทธิ์ที่ระบุไว้ในส่วน การเร่งฮาร์ดแวร์ ไม่สนับสนุนผู้ได้รับมอบหมายการเร่งความเร็วอื่น ๆ
- ไม่รองรับการเข้าถึง TensorFlow Lite ผ่าน API ดั้งเดิม เฉพาะ TensorFlow Lite Java API เท่านั้นที่มีให้บริการผ่านบริการ Google Play
- ไม่รองรับ TensorFlow Lite API รุ่นทดลองหรือที่เลิกใช้แล้ว รวมถึง ops ที่กำหนดเอง
การสนับสนุนและข้อเสนอแนะ
คุณสามารถให้ข้อเสนอแนะและรับการสนับสนุนผ่าน TensorFlow Issue Tracker โปรดรายงานปัญหาและคำขอสนับสนุนโดยใช้ เทมเพลตปัญหา สำหรับ TensorFlow Lite ในบริการ Google Play
เงื่อนไขการให้บริการ
การใช้ TensorFlow Lite ในบริการ Google Play API จะอยู่ภายใต้ ข้อกำหนดในการให้บริการของ Google APIs
ความเป็นส่วนตัวและการเก็บรวบรวมข้อมูล
เมื่อคุณใช้ TensorFlow Lite ใน API ของบริการ Google Play การประมวลผลข้อมูลที่ป้อน เช่น รูปภาพ วิดีโอ ข้อความ จะเกิดขึ้นบนอุปกรณ์อย่างสมบูรณ์ และ API ของบริการ TensorFlow Lite ใน Google Play จะไม่ส่งข้อมูลนั้นไปยังเซิร์ฟเวอร์ของ Google ด้วยเหตุนี้ คุณสามารถใช้ API ของเราในการประมวลผลข้อมูลที่ไม่ควรออกจากอุปกรณ์
TensorFlow Lite ใน API บริการ Google Play อาจติดต่อกับเซิร์ฟเวอร์ของ Google เป็นครั้งคราวเพื่อรับสิ่งต่างๆ เช่น การแก้ไขข้อผิดพลาด รุ่นที่อัปเดต และข้อมูลความเข้ากันได้ของตัวเร่งฮาร์ดแวร์ API ของบริการ TensorFlow Lite ใน Google Play ยังส่งตัวชี้วัดเกี่ยวกับประสิทธิภาพและการใช้งาน API ในแอปของคุณไปยัง Google Google ใช้ข้อมูลเมตริกนี้เพื่อวัดประสิทธิภาพ ดีบัก บำรุงรักษาและปรับปรุง API และตรวจจับการใช้ในทางที่ผิดหรือการละเมิด ตามที่อธิบายไว้เพิ่มเติมใน นโยบายส่วนบุคคล ของเรา
คุณมีหน้าที่รับผิดชอบในการแจ้งให้ผู้ใช้แอปของคุณทราบเกี่ยวกับการประมวลผลข้อมูลเมตริกของ TensorFlow Lite ของ Google Play ในบริการ Google Play ตามที่กฎหมายที่เกี่ยวข้องกำหนด
ข้อมูลที่เรารวบรวมมีดังต่อไปนี้:
- ข้อมูลอุปกรณ์ (เช่น ผู้ผลิต รุ่น เวอร์ชันระบบปฏิบัติการ และบิลด์) และตัวเร่งฮาร์ดแวร์ ML ที่พร้อมใช้งาน (GPU และ DSP) ใช้สำหรับการวินิจฉัยและการวิเคราะห์การใช้งาน
- ตัวระบุอุปกรณ์ที่ใช้สำหรับการวินิจฉัยและการวิเคราะห์การใช้งาน
- ข้อมูลแอพ (ชื่อแพ็คเกจ เวอร์ชั่นแอพ) ใช้สำหรับการวินิจฉัยและการวิเคราะห์การใช้งาน
- การกำหนดค่า API (เช่น มีการใช้ผู้รับมอบสิทธิ์คนใด) ใช้สำหรับการวินิจฉัยและการวิเคราะห์การใช้งาน
- ประเภทเหตุการณ์ (เช่น การสร้างล่าม การอนุมาน) ใช้สำหรับการวินิจฉัยและการวิเคราะห์การใช้งาน
- รหัสข้อผิดพลาด ใช้สำหรับการวินิจฉัย
- การวัดประสิทธิภาพ. ใช้สำหรับการวินิจฉัย
ขั้นตอนถัดไป
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการนำแมชชีนเลิร์นนิงไปใช้งานในแอปพลิเคชันมือถือของคุณด้วย TensorFlow Lite โปรดดูที่ คู่มือสำหรับนักพัฒนา TensorFlow Lite คุณสามารถค้นหาโมเดล TensorFlow Lite เพิ่มเติมสำหรับการจัดประเภทรูปภาพ การตรวจจับวัตถุ และแอปพลิเคชันอื่นๆ บน TensorFlow Hub