Neural Networks Crash Tutorial - Keras version

Classifying images with Neural Networks

This notebook is inspired by lots of tutorials on the web. It's first part uses the same data and shares the same objectives as with:

https://www.datacamp.com/community/tutorials/tensorflow-tutorial

The data necessary to run this notebook can be downloaded from:

http://btsd.ethz.ch/shareddata/

Look for the two zip files, BelgiumTSC_Training.zip and BelgiumTSC_Testing.zip in the section Anotations next to the label "BelgiumTS for Classification (cropped images)".

This notebook assumes that the images will be in a directory named BelgiumTrafficSigns with subdirectories Training and Testing.

You will need jupyter notebook and tensorflow to be installed. You will also need the following packages:

  • numpy
  • scipy
  • matplotlib
  • scikit-image
  • keras

Most if not all of these packages may already be installed for you.

Preliminaries

Here are some useful functions:

In [1]:
import os, skimage.data

def load_data(data_directory):
    directories = [d for d in os.listdir(data_directory) 
                   if os.path.isdir(os.path.join(data_directory, d))]
    labels = []
    images = []
    for d in directories:
        label_directory = os.path.join(data_directory, d)
        file_names = [os.path.join(label_directory, f) 
                      for f in os.listdir(label_directory) 
                      if f.endswith(".ppm")]
        for f in file_names:
            images.append(skimage.data.imread(f))
            labels.append(int(d))
    return images, labels
In [2]:
def plot_images(images, labels, color_map = "brg"):
    # Get the unique labels 
    unique_labels = set(labels)

    # Initialize the figure
    plt.figure(figsize=(15, 15))

    # Set a counter
    i = 1

    # For each unique label,
    for label in unique_labels:
        # You pick the first image for each label
        image = images[labels.index(label)]
        # Define 64 subplots 
        plt.subplot(8, 8, i)
        # Don't include axes
        plt.axis('off')
        # Add a title to each subplot 
        plt.title("Label {0} ({1})".format(label, labels.count(label)))
        # Add 1 to the counter
        i += 1
        # And you plot this first image 
        plt.imshow(image, cmap=color_map)
    
    # Show the plot
    plt.show()

Load training data

In [3]:
train_data_directory = "./BelgiumTrafficSigns/Training"
images, labels = load_data(train_data_directory)

Plot histogram of labels to see how the images are distributed

In [4]:
# Import the `pyplot` module of matplotlib
import matplotlib.pyplot as plt 

# Make a histogram with 62 bins of the `labels` data
plt.hist(labels, 62)

# Show the plot
plt.show()

Check out some random images and their shapes:

In [5]:
import random

# Determine the (random) indexes of the images that you want to see 
traffic_signs = random.sample(range(len(images)), 4)

# Fill out the subplots with the random images and add shape
for i in range(len(traffic_signs)):
    plt.subplot(1, 4, i+1)
    plt.axis('off')
    plt.imshow(images[traffic_signs[i]])
    plt.subplots_adjust(wspace=0.5)
    plt.show()
    print("shape: {0}".format(images[traffic_signs[i]].shape))
shape: (136, 142, 3)
shape: (116, 115, 3)
shape: (72, 71, 3)
shape: (60, 56, 3)

Plot first sample from each category:

In [6]:
plot_images(images,labels)