תחי ישראל - אין לנו ארץ אחרת

תחי ישראל -אין לנו ארץ אחרת

סיווג תמונות באמצעות מודל VGG16 וממשק Keras

מחבר:
בתאריך:

במדריך הקודם ניסינו לזהות תמונה של חפץ באמצעות מודל מאומן מוכן ששמו MobileNet. המודל אומנם הצליח בסיווג תמונות קונבנציונליות של מכוניות, אבל כשל בניסיון לזהות חפץ שאני צילמתי שהוא פסלון אדם נוהג במכונית. במדריך זה, ננסה לסווג באמצעות מודל טוב בהרבה, VGG16, שפותח על ידי חוקרים מאוקספורד ואף זכה בתחרויות של סיווג תמונות. המודל פותח על מאגר תמונות ענק ששמו ImageNet המכיל למעלה מ-14,000,000 תמונות המשתייכות ל-1000 קטגוריות. פיתוח המודל דרש מומחיות גבוהה ומספר שבועות של הרצה על מחשבים חזקים במיוחד. למזלנו, המפתחים של המודל בחרו לשחרר אותו לשימוש הציבור, וגם אנחנו נשתמש בו כדי לנסות לסווג את התמונות שלנו.

להורדת הקוד שנפתח במדריך.

 

נייבא את המודל VGG16

את המודל VGG16 אנחנו יכולים לייבא ולטעון בקלות רבה מ-Keras:

from keras import backend as K
from keras.applications.vgg16 import VGG16  
vgg_model = VGG16()

נסקור את המודל באמצעות הפקודה:

vgg_model.summary()

המודל מכיל שכבות קונבולציה.

 

2. נעלה את התמונה שאנו מעוניינים שהמודל יסווג

לצורך המדריך אני משתמש בסביבת google colab, אז אחת הדרכים להעלות תמונות היא באמצעות הקוד הבא:

from google.colab import files
uploaded = files.upload()

אפשר גם להעלות דרך ממשק הקבצים.

 

3. נבחן את המערכת באמצעות תמונה קונבנציונלית

את יכולת הבחנה של המודל אבחן באמצעות תמונה קונבנציונלית. ב-MobileNet , מאגר התמונות, ששימש לפיתוח המודל יש גם מכוניות ספורט אז החלטתי לבחון עם תמונה של מכונית שהורדתי מ-pixabay תחת ההנחה שהמודל לא נחשף אליה במהלך האימון. לפיכך, הבדיקה היא ליכולת ההבחנה וגם ליכולת ההכללה של המודל מהתמונות שעליהם אומן לתמונות שטרם ראה.

האם המודל ידע לזהות תמונה של מכונית?

נטען את התמונה בשביל Keras:

from keras.preprocessing.image import load_img
# load an image for VGG16 model in Keras
image = load_img('car.jpg', target_size=(224, 224))

הפונקציה גם מתאימה את התמונה לרזולוציה של 224X224 פיקסלים בהתאם לדרישות המודל VGG16.

כדי לצפות בתמונה נמיר אותה ורק אז נציג:

from keras.preprocessing.image import img_to_array
# See the uploaded image
img_array = img_to_array(image)
plt.imshow(img_array.astype('uint8'))

התמונה עברה התאמה לרוחב 224 ולגובה 224

 

3. סיווג התמונה שהעלינו

נמיר את המידע של התמונה ל-4 מימדים (מספר תמונות, שורות, עמודות, צבעים) במקום 3 שקיימים במידע המקורי (רוחב, אורך, צבעים):

converted_img_array = img_array.reshape((1, img_array.shape[0], img_array.shape[1], img_array.shape[2]))

הסיבה להמרה היא שהפונקציה predict של Keras, שבה מייד נשתמש דורשת 4 ממדים:

  1. מספר התמונות
  2. שורות (רוחב)
  3. עמודות (אורך)
  4. ערוצים (צבעים)

המודל פולט ניקוד של התאמה לסיווגים שונים באמצעות:

# predict the probability across all the output classes
prediction = vgg_model.predict(converted_img_array)

נציג את התוצאות:

from keras.applications.vgg16 import decode_predictions
# convert the probabilities to class labels
pred_decoded = decode_predictions(prediction)[0]

# Print the predictions.
for code, name, score in pred_decoded:
  print("%s : %.2f%%" % (name, score*100))
convertible : 54.98%
sports_car : 14.19%
car_wheel : 9.96%
racer : 6.95%
pickup : 6.21%

המודל מעריך שהצילום הוא של convertible מכונית ספורט דו-מושבית בעלת גג נפתח. גם יתר הסיווגים שייכים לעולם המוטורי, כולל מכונית ספורט, מרוץ או משאית קלה. מה שמפתיע הוא הסבירות הנמוכה יחסית מה שיכול לרמוז על בעיה טכנית או על קושי של המודל להכליל מהתמונות אליהם נחשף במהלך האימון לתמונות חדשות.

 

4. נחזור עבור התמונה שלנו

ננסה עם התמונה הפחות קונבנציונלית שלנו:

האם המודל ידע לזהות תמונה של מכונית?

ונקבל את התוצאות:

candle : 18.75%
hair_slide : 15.00%
nipple : 14.63%
diaper : 4.56%
perfume : 3.77%

המודל סבור שבתמונה נראה נר, פטמה או בושם במידה בטחון נמוכה מאוד. התוצאות שהמודל מנפק עבור התמונה שלנו הם לא יותר מרעש.

 

5. נסכם

מודל VGG16 הצליח לסווג תמונה של מכונית קונבנציונלית שדומה מספיק לתמונות עליהם הוא אומן אבל לא הצליח להכליל לתמונה פחות קונבנציונלית. במדריך הבא, אנסה לשפר את היכולת של המודל להבחין בפרטים בתמונות שעליהם הרשת לא אומנה באמצעות אימון מחדש של המודל.

לכל המדריכים בנושא של למידת מכונה

 

אהבתם? לא אהבתם? דרגו!

0 הצבעות, ממוצע 0 מתוך 5 כוכבים

 

 

המדריכים באתר עוסקים בנושאי תכנות ופיתוח אישי. הקוד שמוצג משמש להדגמה ולצרכי לימוד. התוכן והקוד המוצגים באתר נבדקו בקפידה ונמצאו תקינים. אבל ייתכן ששימוש במערכות שונות, דוגמת דפדפן או מערכת הפעלה שונה ולאור השינויים הטכנולוגיים התכופים בעולם שבו אנו חיים יגרום לתוצאות שונות מהמצופה. בכל מקרה, אין בעל האתר נושא באחריות לכל שיבוש או שימוש לא אחראי בתכנים הלימודיים באתר.

למרות האמור לעיל, ומתוך רצון טוב, אם נתקלת בקשיים ביישום הקוד באתר מפאת מה שנראה לך כשגיאה או כחוסר עקביות נא להשאיר תגובה עם פירוט הבעיה באזור התגובות בתחתית המדריכים. זה יכול לעזור למשתמשים אחרים שנתקלו באותה בעיה ואם אני רואה שהבעיה עקרונית אני עשוי לערוך התאמה במדריך או להסיר אותו כדי להימנע מהטעיית הציבור.

שימו לב! הסקריפטים במדריכים מיועדים למטרות לימוד בלבד. כשאתם עובדים על הפרויקטים שלכם אתם צריכים להשתמש בספריות וסביבות פיתוח מוכחות, מהירות ובטוחות.

המשתמש באתר צריך להיות מודע לכך שאם וכאשר הוא מפתח קוד בשביל פרויקט הוא חייב לשים לב ולהשתמש בסביבת הפיתוח המתאימה ביותר, הבטוחה ביותר, היעילה ביותר וכמובן שהוא צריך לבדוק את הקוד בהיבטים של יעילות ואבטחה. מי אמר שלהיות מפתח זו עבודה קלה ?

השימוש שלך באתר מהווה ראייה להסכמתך עם הכללים והתקנות שנוסחו בהסכם תנאי השימוש.

הוסף תגובה חדשה

 

 

ענה על השאלה הפשוטה הבאה כתנאי להוספת תגובה:

דג למים הוא כמו ציפור ל...?

 

תמונת המגיב

מיכל בתאריך: 10.01.2023

הסבר מפורט ומעניין תודה רבה אם תוכל להסביר מה האחוזים של מודל זה מייצגים תודה רבה

תמונת המגיב

קרן בתאריך: 06.02.2023

תודה רבה ! הסבר מקסים ומעולה תוכל להסביר מה בדיוק המודל מחזיר? ואיך זה אמור להיראות בתוצאה? והאם האחוזים משלימים למספר עגול מסוים?