סיווג תמונות באמצעות מודל מאומן VGG16 על מסד נתונים שהורדנו מ-kaggle

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

בסדרה זו נלמד לסווג תמונות באמצעות מודלים מאומנים שנתאים לצרכינו. במדריך הראשון בסדרה נאמץ מסד נתונים קיים מ-Kaggle שמכיל קרוב ל-40,000 תמונות.

 קהילה של data scientists kaggle

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

 

מקור מסד הנתונים

Kaggle היא פלטפורמה שמיועדת ל data scientists שמפורסמת בזכות תחרויות שמציעות סכומים נכבדים של כסף לפותרים לצד הזדמנויות ללמידה למי שרק התחילו את דרכם. אנחנו נשתמש במסד הנתונים של התחרות כלבים נגד חתולים (Dogs vs. Cats) כי היא מכילה 37,500 תמונות מסווגות במקום שנצטרך לאסוף אותם לבד.

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

 

1. התקנת ויבוא הספריות

את Kaggle צריך להתקין באמצעות שורת הקוד הבאה:

# Install dependencies
!pip install kaggle

סימן קריאה (!) בתחילת השורה מסמל פקודות טרמינל בסביבת colab.

את המדריך הזה פתחתי על סביבת colab שבה אין צורך להתקין את הספריה.

ספריות נוספות:

# Import dependencies
import os
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
  • os - בשביל לעבוד עם התמונות
  • numpy, pandas - בשביל החישובים
  • matplotlib - בשביל להציג תמונות וגרפים

 

2. ייבוא התמונות מ-Kaggle

כדי לייבא את תיקיות התמונות צריך להשתמש ב-api של kaggle. כדי לקבל את ה-credentials, היכנסו לפרופיל האישי שלכם באתר ולחצו על create new api token. הורידו את קובץ ה-kaggle.json לשולחן העבודה. קובץ זה מכיל את ה-credentials.

צריך להעלות את kaggle.json לתיקיית העבודה. בסביבת colab:

# Upload the kaggle credentials
from google.colab import files
files.upload()

נוודא שאכן העלנו את הקובץ:

# Confirm the upload
!ls

הדרישה של kaggle היא שהקובץ יישב בתיקייה מיוחדת:

# file configuration
!mkdir -p ~/.kaggle/
!cp kaggle.json ~/.kaggle/
!chmod 600 ~/.kaggle/kaggle.json

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

# Download the dataset from kaggle
!kaggle competitions download -c dogs-vs-cats

נוודא שאכן התיקיות ירדו:

# Verify the download
!ls
kaggle.json  sample_data  sampleSubmission.csv  test1.zip  train.zip

נעשה unzip לתיקיות המכווצות:

!unzip train.zip
!unzip test1.zip

 

3. סקירת התיקיות שהורדנו

מבט זריז בשמות הקבצים יראה לנו שבתיקיית train הקטגוריה cat או dog משולב כחלק משם הקובץ. בתיקיית test קיימים רק מספרים ללא קטגוריות.

הנתיבים לתיקיות האימון והבדיקה:

# the main directories
dir_train = './train'
dir_test  = './test1'

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

# explore the dataset - how many images in the training set?
path, dirs, files = next(os.walk(dir_train))
file_count_train = len(files)
print(file_count_train)
25000
# and how many in the test set?
path, dirs, files = next(os.walk(dir_test))
file_count_test = len(files)
print(file_count_test)
12500

25000 בתיקיית האימון ו-12500 בתיקיית המבחן.

כמה כלבים וכמה חתולים בתיקייה train?

# how many dogs and cats?
print('number of dogs: %d' % len(df[df.category==1]))
print('number of cats: %d' % len(df[df.category==0]))
number of dogs: 12500
number of cats: 12500

ניצור מסד נתונים טבלאי מהתמונות בתיקיית האימון תוך אבחנה בין הקטגוריות:

# make a dataset out of the images in the training dir
filenames = os.listdir(dir_train)

categories = []
for filename in filenames:
    category = filename.split('.')[0]
    if category == 'dog':
        categories.append(1)
    else:
        categories.append(0)

df = pd.DataFrame({
    'filename': filenames,
    'category': categories
})

קטגוריה 1 מייצגת כלבים ו-0 חתולים.

נסקור את מסד הנתונים:

# explore the dataset
df.head()
filename category
0 dog.9019.jpg 1
1 dog.12462.jpg 1
2 dog.6611.jpg 1
3 dog.5750.jpg 1
4 cat.5388.jpg 0

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

# visualize the images
import matplotlib.image as mpimg

# Create figure with 2x2 sub-plots.
def plot_images(images, labels):
  fig, axes = plt.subplots(2, 2)
  fig.subplots_adjust(hspace=0.3, wspace=0.3)

  for i, ax in enumerate(axes.flat):
    # Plot image
    ax.imshow(mpimg.imread(images[i]))
    
    # Plot label
    ax.set_xlabel('Label : %s' % labels[i])
        
        
  plt.show()

נשלוף 4 רשומות אקראיות מתוך מסד הנתונים ונשתמש בפונקציה לעיל כדי להציג אותם:

img_paths = []
img_labels = []
for i in range(4):
  # pick 4 random ids from the dataset
  rand_id = np.random.randint(0, file_count_train)
  
  # get the img path from the id
  filename = df.loc[rand_id, 'filename'] 
  path = os.path.join(dir_train, filename)
  img_paths.append(path)
  
  # get the img label from the id
  img_label = df.loc[rand_id, 'category'] 
  if img_label == 1:
    img_labels.append('dog')
  else:
    img_labels.append('cat')
  
plot_images(img_paths, img_labels)

4 תמונות אקראיות שהורדנו מ-kaggle

במדריך הבא נלמד לבנות את התיקיות שישמשו בתהליך הלמידה ובזה שאחריו נעשה את תהליך הלמידה עצמו.

לכל המדריכים בסדרה על למידת מכונה

 

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

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

 

 

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

 

= 6 + 2