לאחר שתאמן את הדגם שלך באמצעות AutoML Vision Edge , תוכל להשתמש בו באפליקציה שלך כדי לזהות אובייקטים בתמונות.
ישנן שתי דרכים לשלב מודלים מאומנים מ-AutoML Vision Edge: אתה יכול לאגד את המודל על ידי הכנסתו לתיקיית הנכסים של האפליקציה שלך, או שאתה יכול להוריד אותו באופן דינמי מ-Firebase.
אפשרויות חבילת דגמים | |
---|---|
מאגד באפליקציה שלך |
|
מתארח עם Firebase |
|
לפני שאתה מתחיל
אם ברצונך להוריד דגם , הקפד להוסיף את Firebase לפרויקט האנדרואיד שלך , אם עדיין לא עשית זאת. זה לא נדרש כאשר אתה מצרף את הדגם.
הוסף את התלות של ספריית המשימות TensorFlow Lite לקובץ Gradle ברמת האפליקציה שלך, שהוא בדרך כלל
app/build.gradle
:לאגד דגם עם האפליקציה שלך:
dependencies { // ... // Object detection with a bundled Auto ML model implementation 'org.tensorflow:tensorflow-lite-task-vision:0.0.0-nightly-SNAPSHOT' }
להורדה דינמית של מודל מ-Firebase, הוסף גם את התלות של Firebase ML:
dependencies { // ... // Object detection with an Auto ML model deployed to Firebase implementation platform('com.google.firebase:firebase-bom:26.1.1') implementation 'com.google.firebase:firebase-ml-model-interpreter' implementation 'org.tensorflow:tensorflow-lite-task-vision:0.0.0-nightly' }
1. טען את הדגם
הגדר מקור דגם מקומי
כדי לאגד את הדגם עם האפליקציה שלך:
- חלץ את הדגם מארכיון ה-zip שהורדת ממסוף Google Cloud.
- כלול את הדגם שלך בחבילת האפליקציה שלך:
- אם אין לך תיקיית נכסים בפרויקט שלך, צור אחת על ידי לחיצה ימנית על
app/
תיקיה ולאחר מכן לחיצה על חדש > תיקיה > תיקיית נכסים . - העתק את קובץ המודל
tflite
שלך עם מטא נתונים משובצים לתיקיית הנכסים.
- אם אין לך תיקיית נכסים בפרויקט שלך, צור אחת על ידי לחיצה ימנית על
הוסף את הדברים הבאים לקובץ
build.gradle
של האפליקציה שלך כדי להבטיח ש-Gradle לא ידחוס את קובץ הדגם בעת בניית האפליקציה:android { // ... aaptOptions { noCompress "tflite" } }
קובץ הדגם ייכלל בחבילת האפליקציה וזמין כנכס גולמי.
הגדר מקור מודל שמתארח ב-Firebase
כדי להשתמש במודל המתארח מרחוק, צור אובייקט RemoteModel
, תוך ציון השם שהקצית למודל כשפרסמת אותו:
Java
// Specify the name you assigned when you deployed the model.
FirebaseCustomRemoteModel remoteModel =
new FirebaseCustomRemoteModel.Builder("your_model").build();
קוטלין
// Specify the name you assigned when you deployed the model.
val remoteModel =
FirebaseCustomRemoteModel.Builder("your_model_name").build()
לאחר מכן, התחל את משימת הורדת הדגם, תוך ציון התנאים שבהם ברצונך לאפשר הורדה. אם הדגם אינו במכשיר, או אם זמינה גרסה חדשה יותר של הדגם, המשימה תוריד את הדגם באופן אסינכרוני מ-Firebase:
Java
DownloadConditions downloadConditions = new DownloadConditions.Builder()
.requireWifi()
.build();
RemoteModelManager.getInstance().download(remoteModel, downloadConditions)
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(@NonNull Task<Void> task) {
// Success.
}
});
קוטלין
val downloadConditions = DownloadConditions.Builder()
.requireWifi()
.build()
RemoteModelManager.getInstance().download(remoteModel, downloadConditions)
.addOnSuccessListener {
// Success.
}
אפליקציות רבות מתחילות את משימת ההורדה בקוד האתחול שלהן, אך תוכל לעשות זאת בכל שלב לפני שתצטרך להשתמש במודל.
צור גלאי אובייקטים מהדגם שלך
לאחר שתגדיר את מקורות המודל שלך, צור אובייקט ObjectDetector
מאחד מהם.
אם יש לך רק מודל מצורף מקומית, פשוט צור גלאי אובייקטים מקובץ המודל שלך והגדר את סף ציון הביטחון שאתה רוצה לדרוש (ראה הערכת המודל שלך ):
Java
// Initialization
ObjectDetectorOptions options = ObjectDetectorOptions.builder()
.setScoreThreshold(0) // Evaluate your model in the Google Cloud console
// to determine an appropriate value.
.build();
ObjectDetector objectDetector = ObjectDetector.createFromFileAndOptions(context, modelFile, options);
קוטלין
// Initialization
val options = ObjectDetectorOptions.builder()
.setScoreThreshold(0) // Evaluate your model in the Google Cloud console
// to determine an appropriate value.
.build()
val objectDetector = ObjectDetector.createFromFileAndOptions(context, modelFile, options)
אם יש לך דגם שמתארח מרחוק, תצטרך לבדוק שהוא הורד לפני שתפעיל אותו. אתה יכול לבדוק את המצב של משימת הורדת המודל באמצעות שיטת isModelDownloaded()
של מנהל המודלים.
למרות שעליך לאשר זאת רק לפני הפעלת גלאי האובייקטים, אם יש לך גם מודל שמתארח מרחוק וגם מודל עם חבילה מקומית, ייתכן שיהיה הגיוני לבצע בדיקה זו בעת הפעלת גלאי האובייקטים: צור גלאי אובייקטים מהשלט. דגם אם הורד, ובדרך אחרת מהדגם המקומי.
Java
FirebaseModelManager.getInstance().isModelDownloaded(remoteModel)
.addOnSuccessListener(new OnSuccessListener<Boolean>() {
@Override
public void onSuccess(Boolean isDownloaded) {
}
});
קוטלין
FirebaseModelManager.getInstance().isModelDownloaded(remoteModel)
.addOnSuccessListener { success ->
}
אם יש לך רק דגם שמתארח מרחוק, עליך להשבית את הפונקציונליות הקשורה לדגם - לדוגמה, לאפור או להסתיר חלק מהממשק שלך - עד שתאשר שהדגם הורד. אתה יכול לעשות זאת על ידי חיבור מאזין לשיטת download()
של מנהל המודלים.
ברגע שאתה יודע שהמודל שלך הורד, צור גלאי אובייקטים מקובץ המודל:
Java
FirebaseModelManager.getInstance().getLatestModelFile(remoteModel)
.addOnCompleteListener(new OnCompleteListener<File>() {
@Override
public void onComplete(@NonNull Task<File> task) {
File modelFile = task.getResult();
if (modelFile != null) {
ObjectDetectorOptions options = ObjectDetectorOptions.builder()
.setScoreThreshold(0)
.build();
objectDetector = ObjectDetector.createFromFileAndOptions(
getApplicationContext(), modelFile.getPath(), options);
}
}
});
קוטלין
FirebaseModelManager.getInstance().getLatestModelFile(remoteModel)
.addOnSuccessListener { modelFile ->
val options = ObjectDetectorOptions.builder()
.setScoreThreshold(0f)
.build()
objectDetector = ObjectDetector.createFromFileAndOptions(
applicationContext, modelFile.path, options)
}
2. הכן את תמונת הקלט
לאחר מכן, עבור כל תמונה שברצונך לסמן, צור אובייקט TensorImage
מהתמונה שלך. אתה יכול ליצור אובייקט TensorImage
ממפת סיביות באמצעות fromBitmap
Bitmap
Java
TensorImage image = TensorImage.fromBitmap(bitmap);
קוטלין
val image = TensorImage.fromBitmap(bitmap)
אם נתוני התמונה שלך אינם במפת Bitmap
, אתה יכול לטעון מערך פיקסלים כפי שמוצג במסמכי TensorFlow Lite .
3. הפעל את גלאי האובייקטים
כדי לזהות אובייקטים בתמונה, העבר את האובייקט TensorImage
לשיטת detect()
של ObjectDetector
.
Java
List<Detection> results = objectDetector.detect(image);
קוטלין
val results = objectDetector.detect(image)
4. קבל מידע על אובייקטים מסומנים
אם פעולת זיהוי האובייקטים מצליחה, היא מחזירה רשימה של Detection
. כל אובייקט Detection
מייצג משהו שזוהה בתמונה. אתה יכול לקבל את התיבה התוחמת של כל אובייקט והתוויות שלו.
לדוגמה:
Java
for (Detection result : results) {
RectF bounds = result.getBoundingBox();
List<Category> labels = result.getCategories();
}
קוטלין
for (result in results) {
val bounds = result.getBoundingBox()
val labels = result.getCategories()
}
טיפים לשיפור הביצועים בזמן אמת
אם ברצונך לסמן תמונות ביישום בזמן אמת, פעל לפי ההנחיות הבאות כדי להשיג את קצבי המסגרות הטובים ביותר:
- קריאות מצערת לתיוג התמונה. אם מסגרת וידאו חדשה הופכת לזמינה בזמן שמתווית התמונה פועלת, שחרר את המסגרת. ראה את המחלקה
VisionProcessorBase
באפליקציה לדוגמה להתחלה מהירה לדוגמא. - אם אתה משתמש בפלט של מתווית התמונה כדי לשכב גרפיקה על תמונת הקלט, תחילה קבל את התוצאה, ולאחר מכן עבד את התמונה ואת שכבת העל בשלב אחד. על ידי כך, אתה מעבד למשטח התצוגה רק פעם אחת עבור כל מסגרת קלט. ראה את המחלקות
CameraSourcePreview
ו-GraphicOverlay
באפליקציה לדוגמה להתחלה מהירה לדוגמא. אם אתה משתמש בממשק ה-API של Camera2, צלם תמונות בפורמט
ImageFormat.YUV_420_888
.אם אתה משתמש ב-Camera API הישן יותר, צלם תמונות בפורמט
ImageFormat.NV21
.