1. לפני שמתחילים
ב-Codelab הקודם יצרתם אפליקציה בסיסית לסיווג אודיו.
מה קורה אם רוצים להתאים אישית את מודל סיווג האודיו כדי לזהות אודיו מכיתות שונות שלא קיימות במודל שהוכן מראש? לחלופין, אם תרצו להתאים אישית את המודל באמצעות הנתונים שלכם?
ב-Codelab הזה, תבצע התאמה אישית של מודל אימון קולי מראש כדי לזהות קולות של ציפורים. אפשר לשכפל את אותה שיטה באמצעות הנתונים שלכם.
דרישות מוקדמות
Codelab זה מיועד למפתחים מנוסים בתחום הנייד שרוצים להתנסות בלמידה חישובית. כדאי שתכירו את:
- פיתוח מכשירי Android באמצעות Kotlin ו-Android Studio
- תחביר בסיסי של Python
מה תלמדו
- איך מעבירים את למידת הדומיין של האודיו
- איך יוצרים נתונים משלכם
- איך לפרוס את המודל שלכם באפליקציה ל-Android
מה תצטרך להכין
- גרסה עדכנית של Android Studio (גרסה 4.1.2 ומעלה)
- מכשיר Android פיזי עם גרסת Android ב-API 23 (Android 6.0)
- הקוד לדוגמה
- ידע בסיסי על פיתוח Android בקוטלין
2. מערך הנתונים של ציפורים
צריך להשתמש במערך נתונים של שכבר מוכן כדי להתחיל להשתמש בו. כל קובצי האודיו מגיעים מאתר Xeno-canto.
מערך הנתונים הזה מכיל שירים של:
שם: דרור הבית | קוד: houspa |
שם: אדומות | קוד: Redcro |
שם: עץ עץ עם חזה לבן | קוד: wbwwre1 |
שם: אנטפיטה בכתר ערמונים | קוד: chcant2 |
שם: Azara's Spintail | קוד: azaspi1 |
מערך הנתונים הזה נמצא בקובץ ZIP והתוכן שלו:
metadata.csv
שכולל את כל המידע על כל קובץ אודיו, למשל מי הקלטת את האודיו, איפה הוא הוקלט, רישיון שימוש ושם הציפור.- תיקיית רכבות ובדיקות.
- בתוך התיקיות של הרכבת/בדיקה יש תיקייה לכל קוד ציפורים. בתוך כל אחד מהם יש את כל קובצי ה-wav עבור הציפור הזו.
כל קובצי האודיו הם בפורמט wav ופועלים לפי המפרט הזה:
- קצב דגימה של 16,000 Hz
- ערוץ אודיו אחד (מונו)
- 16 קצב העברת הנתונים
המפרט הזה חשוב, כי עליך להשתמש במודל בסיסי שמצפה לנתונים בפורמט הזה. מידע נוסף בנושא זמין בפוסט בבלוג.
כדי להקל על כל התהליך, אין צורך להוריד את מערך הנתונים במחשב. השתמשו בו ב-Google Colab (בהמשך של המדריך).
אם רוצים להשתמש בנתונים משלכם, כל קובצי האודיו צריכים להיות גם בפורמט הספציפי הזה.
3. קבלת הקוד לדוגמה
להורדת הקוד
כדי להוריד את כל הקוד של Lablab זה, צריך ללחוץ על הקישור הבא:
אפשר גם לשכפל את המאגר:
git clone https://github.com/googlecodelabs/odml-pathways.git
פותחים את הקובץ הדחוס. פעולה זו תשחרר תיקיית בסיס (odml-pathways
) עם כל המשאבים הדרושים לך. עבור קוד Lab זה תצטרכו את המקורות רק בספריית המשנה audio_classification/codelab2/android
.
ספריית המשנה android
במאגר audio_classification/codelab2/android
מכילה שתי ספריות:
- התחלה — קוד בסיס שעליו תבססו על מעבדת קוד זו.
- סופי – הושלם הקוד לאפליקציה לדוגמה שהושלמה.
ייבוא אפליקציית ההתחלה
בשלב הראשון, מייבאים את האפליקציה למתחילים ל-Android Studio:
- פותחים את Android Studio ובוחרים באפשרות ייבוא פרויקט (גראדל, Eclipse ADT וכו')
- יש לפתוח את התיקייה
starter
(audio_classification/codelab2/android/starter
) מקוד המקור שהורדת קודם.
כדי לוודא שכל התלות תלויות באפליקציה, צריך לסנכרן את הפרויקט ב-Drive עם ציונים אחרי שתהליך הייבוא יסתיים.
- בוחרים באפשרות סנכרון פרויקט עם קובצי Gradle ( ) מסרגל הכלים ב-Android Studio.
4. הסבר על האפליקציה למתחילים
האפליקציה הזו זהה לזו שנוצרה ב-codelab הראשון לסיווג אודיו: יצירת אפליקציה בסיסית לסיווג אודיו.
כדי להבין טוב יותר את הקוד, מומלץ לבצע את שיעור הקוד הזה לפני שממשיכים.
כל הקוד מופיע בMainActivity
(כדי לפשט ככל האפשר).
בקצרה, הקוד חורג מהמשימות הבאות:
- טעינת המודל מתבצעת
val classifier = AudioClassifier.createFromFile(this, modelPath)
- מתבצעת יצירה של הקלטת האודיו והתחלת ההקלטה
val tensor = classifier.createInputTensorAudio()
val format = classifier.requiredTensorAudioFormat
val recorderSpecs = "Number Of Channels: ${format.channels}\n" +
"Sample Rate: ${format.sampleRate}"
recorderSpecsTextView.text = recorderSpecs
val record = classifier.createAudioRecord()
record.startRecording()
- המערכת יוצרת שרשור טיימר כדי להריץ מסקנות. הפרמטרים לשיטה
scheduleAtFixedRate
הם כמה זמן הם יתחילו להתחיל בביצוע והזמן בין ביצוע המשימה העוקבת. בקוד שמוצג בהמשך, הוא יתחיל בעוד אלפית שנייה ויפעל שוב כל 500 אלפיות השנייה.
Timer().scheduleAtFixedRate(1, 500) {
...
}
- המערכת מסיקה את המסקנות מהאודיו שנקלט
val numberOfSamples = tensor.load(record)
val output = classifier.classify(tensor)
- סינון מסננים לציונים נמוכים
val filteredModelOutput = output[0].categories.filter {
it.score > probabilityThreshold
}
- הצגת התוצאות במסך
val outputStr = filteredModelOutput.map { "${it.label} -> ${it.score} " }
.joinToString(separator = "\n")
runOnUiThread {
textView.text = outputStr
}
עכשיו אפשר להריץ את האפליקציה ולשחק בה כמו שהיא. עם זאת, חשוב לזכור שהיא משתמשת במודל גנרי יותר, שנערך מראש.
5. אימון מודל מותאם אישית לסיווג אודיו באמצעות 'יוצר המודלים'
בשלב הקודם, הורדתם אפליקציה שמשתמשת בדגם מאומן מראש כדי לסווג אירועי אודיו. לפעמים עליך להתאים אישית את המודל הזה לאירועים של אודיו שמעניינים אותך או להפוך אותו לגרסה מיוחדת יותר.
כפי שצוין קודם, אתה מתמחה במודלים לצלילי ציפורים. זהו מערך נתונים עם אודיו של ציפורים, שנאסף מהאתר של Xeno-canto.
Colaboratory
בשלב הבא, עוברים ל-Google Colab כדי לאמן את המודל המותאם אישית.
האימון של המודל המותאם אישית יימשך כ-30 דקות.
אם אתם רוצים לדלג על השלב הזה, תוכלו להוריד את המודל שלמדתם עליו יחד עם מערך הנתונים שסופק לכם ולהמשיך לשלב הבא.
6. הוספת דגם TFLite בהתאמה אישית לאפליקציית Android
עכשיו, אחרי שתרגלתם את המודל שלכם לסיווג אודיו ושמרתם אותו באופן מקומי, אתם צריכים למקם אותו בתיקיית הנכסים של האפליקציה ל-Android.
השלב הראשון הוא להעביר את המודל שהורדת מהשלב הקודם לתיקיית הנכסים באפליקציה.
- ב-Android Studio, עם תצוגת הפרויקט ב-Android, לוחצים לחיצה ימנית על תיקיית הנכסים.
- יופיע חלון קופץ עם רשימת אפשרויות. אחת מהאפשרויות האלה היא לפתוח את התיקייה במערכת הקבצים. מחפשים את התוסף המתאים למערכת ההפעלה ובוחרים בו. ב-Mac, הכיתוב יוצג ב-Finder יהיה זמין ב-Windows. פתיחה ב-Explorer וב-Ubuntu יוצג ב-Files.
- מעתיקים את המודל שהורדתם לתיקייה.
לאחר מכן, חוזרים ל-Android Studio ו אמורים לראות את הקובץ בתיקיית הנכסים.
7. טוענים את הדגם החדש באפליקציה הבסיסית
האפליקציה הבסיסית כבר משתמשת במודל מאומן מראש. הוא יוחלף במכשיר החדש שלכם.
- חובה 1: כדי לטעון את המודל החדש לאחר הוספתו לתיקייה נכסים, יש לשנות את הערך של המשתנה
modelPath
:
var modelPath = "my_birds_model.tflite"
למודל החדש יש שתי פלט (ראשיים):
- הפלט המקורי, הגנרי יותר מהמודל הבסיסי שבו השתמשתם, במקרה הזה YAMNet.
- הפלט המשני הספציפי לציפורים שבהן השתמשתם באימון.
הדרישה הזו נדרשת כי YAMNet עושה עבודה טובה בזיהוי כמה כיתות נפוצות, כמו Silence, למשל. כך לא צריך לדאוג לגבי כל הכיתות האחרות שלא הוספת למערך הנתונים.
מה עושים עכשיו, אם הסיווג של YAMNet מציג ציון גבוה עבור מחלקת הציפורים, עליכם לבדוק איזו ציפור נמצאת בפלט השני.
- אישור 2: יש לקרוא אם לראש הסיווג יש רמת ביטחון גבוהה של צליל הציפור. כאן תשנו את המסנן כדי לסנן גם כל דבר שאינו 'ציפור':
val filteredModelOuput = output[0].categories.filter {
it.label.contains("Bird") && it.score > .3
}
- משימה 3: אם הראש הבסיסי של הדגם מזהה ציפור עם אודיו בעל סבירות גבוהה, תופיע התראה על הראש השני.
if (filteredModelOutput.isNotEmpty()) {
Log.i("Yamnet", "bird sound detected!")
filteredModelOutput = output[1].categories.filter {
it.score > probabilityThreshold
}
}
זהו זה. כדי להשתמש במודל שאימנתם, פשוט משנים את המודל.
השלב הבא הוא לבדוק אותו.
8. בדיקת האפליקציה עם הדגם החדש
שילבת את מודל סיווג האודיו שלך באפליקציה, אז כדאי לבדוק אותה.
- מחברים את מכשיר Android ולוחצים על סמל ההפעלה ( ) בסרגל הכלים של Android Studio.
לאפליקציה צריכה להיות אפשרות לחזות כהלכה את האודיו של הציפורים. כדי להקל על הבדיקה, פשוט מפעילים אחד מקטעי האודיו מהמחשב (מהשלבים הקודמים), והטלפון אמור לזהות את האודיו. במקרה כזה, יוצג במסך שם הציפורים והסבירות שהוא נכון.
9. מזל טוב
ב-Codelab הזה למדתם איך ליצור מודל סיווג אודיו משלכם עם Maker Maker ולפרוס אותו באפליקציה לנייד באמצעות TensorFlow Lite. מידע נוסף על TFLite זמין בדוגמאות אחרות של TFLite.
מה כללנו?
- איך מכינים מערך נתונים משלכם?
- איך להעביר למידה לסיווג אודיו באמצעות עושה מודל
- איך להשתמש בדגם של אפליקציה ל-Android
השלבים הבאים
- לנסות עם הנתונים שלך
- דעתך חשובה לנו
מידע נוסף
- קישור לנתיב הלימוד
- תיעוד של TensorFlow Lite
- תיעוד ליוצר המודלים
- תיעוד של TensorFlow Hub
- למידה חישובית במכשיר בעזרת טכנולוגיות Google