כיצד להשתמש במודול קיים של Keras לסיווג תמונות?

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

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

במדריך זה אני משתמש במודל MobileNet שיתרונו בגודל קטן וזמן ריצה קצר וחסרונו במידת דיוק פחותה בזיהוי אובייקטים. ניתן להשתמש בעקרונות שילמדו במדריך במודולים אחרים שמציע Keras https://keras.io/applications.

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

 

ייבוא הספריות שישמשו אותנו במדריך

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

from keras import backend as K
from keras.models import Sequential
from keras.layers import Convolution2D, MaxPooling2D
from keras.layers.core import Activation
from keras.layers.core import Flatten
from keras.layers.core import Dense
from keras.utils import np_utils
from keras.optimizers import SGD, RMSprop, Adam
import numpy as np
import matplotlib.pyplot as plt

נייבא את המודל ונטען אותו.

from keras.applications.mobilenet import MobileNet  
mn_model = MobileNet()

אנחנו יכולים לצפות בארכיטקטורת המודל באמצעות הפקודה:

mn_model.summary()

סוג המודל הוא:

type(mn_model)
keras.engine.training.Model

המודל כתוב באמצעות API מסוג Model שאנו לא יודעים להשתמש בו כי עד כה השתמשנו ב-API מסוג sequential.

 

המרת המודל

נמיר למודל sequential שאיתו למדנו לעבוד.

# We need to transform the model to the sequential api that we are used to work with
model = Sequential()

for layer in mn_model.layers:
  model.add(layer)

נוודא את סוגו של המודל לאחר ההמרה:

type(model)
keras.engine.sequential.Sequential

נמנע מהמודל לעבור אימון מחדש בזמן שאנו מריצים אותו:

# Prevent the layers from being updated as we run the app
for layer in model.layers:
  layer.trainable = False

נוודא את השינויים שערכנו:

model.summary()

 

נעלה תמונה ונמיר לפורמט שהמודל יודע לקבל

אני מעוניין שהמודל יזהה תמונה של אדם שנוהג במכונית:

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

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

# load an image from file
from google.colab import files
import io
from keras.preprocessing.image import load_img

uploaded = files.upload()
image = load_img(io.BytesIO(uploaded['car.jpg']), target_size=(224, 224))

נעבד את התמונה לפורמט שהמודל יודע לקבל

from keras.preprocessing.image import img_to_array
# convert the image pixels to a numpy array
image = img_to_array(image)


# reshape data for the model
image = image.reshape((1, image.shape[0], image.shape[1], image.shape[2]))


from keras.applications.mobilenet import preprocess_input
# prepare the image for the mobilenet model
image = preprocess_input(image)

 

זיהוי התמונה

הקוד הבא מאפשר למודל לזהות את התמונה:

# predict the probability across all output classes
yhat = model.predict(image)

מה המודל שלנו מצא?

from keras.applications.mobilenet import decode_predictions

# convert the probabilities to class labels
label = decode_predictions(yhat)

# retrieve the most likely result, e.g. highest probability
label = label[0][0]

# print the classification
print('%s (%.2f%%)' % (label[1], label[2]*100))

והתוצאה היא:

piggy_bank (34.97%)

המודל חושב שמדובר בתמונה של "שק קמח" בסבירות של 35%. לא מה שאני מצפה.

כשניסיתי עם 2 תמונות קונבנציונליות יותר של מכונית קבלתי תוצאות טובות בהרבה.

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

 

התוצאה

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

 

סיכום

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

  • זיהוי באמצעות מודל משוכלל הרבה יותר VGG16.
  • אימון רשת קונבולציה לזהות את האובייקטים שבהם אני מעוניין.

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

 

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

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

 

 

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

 

= 3 + 9