Lane Follower - CompRobo17

Imports and Directories


In [1]:
#Create references to important directories we will use over and over
import os, sys
current_dir = os.getcwd()
SCRIPTS_HOME_DIR = current_dir
DATA_HOME_DIR = current_dir+'/data'

In [2]:
#import modules
from matplotlib import pyplot as plt
from keras.models import Sequential
from keras.metrics import categorical_crossentropy, categorical_accuracy
from keras.layers.convolutional import *
from keras.preprocessing import image
from keras.layers.core import Flatten, Dense
from keras.optimizers import Adam
import seaborn as sns
%matplotlib inline


Using TensorFlow backend.

In [3]:
%cd $DATA_HOME_DIR

#Set path to sample/ path if desired
path = DATA_HOME_DIR
train_path=path + '/train/color/'
valid_path=path + '/valid/color/'


/home/nathan/olin/spring2017/line-follower/line-follower/src/old_lane_follower_past_project/data

Convnet

Constants


In [4]:
img_rows, img_cols = 32, 32
in_shape = (img_rows, img_cols)
batch_size = 64
nb_classes = 3

Batches


In [5]:
gen = image.ImageDataGenerator(
                                rescale=1. / 255
                              )

In [6]:
train_generator = gen.flow_from_directory(train_path, target_size=(32, 32), batch_size=32)
valid_generator = gen.flow_from_directory(valid_path, target_size=(32, 32), batch_size=32)

# get_batches(train_path, batch_size=batch_size, 
#                             target_size=in_shape, 
#                             gen=gen)
# val_batches   = get_batches(valid_path, batch_size=batch_size, 
#                             target_size=in_shape, 
#                             gen=gen)


Found 940 images belonging to 3 classes.
Found 114 images belonging to 3 classes.

In [7]:
data, category = next(train_generator)
data.shape


Out[7]:
(32, 32, 32, 3)

Model


In [8]:
def get_model():
    model = Sequential([
        Convolution2D(32,3,3, border_mode='same', activation='relu', input_shape=(32, 32, 3)),
        MaxPooling2D(),
        Convolution2D(64,3,3, border_mode='same', activation='relu'),
        MaxPooling2D(),
        Flatten(),
        Dense(1024, activation='relu'),
        Dense(nb_classes, activation='softmax')
        ])
    model.compile(Adam(), loss='categorical_crossentropy', metrics=['accuracy'])
    return model

In [9]:
model = get_model()

In [10]:
model.summary()


____________________________________________________________________________________________________
Layer (type)                     Output Shape          Param #     Connected to                     
====================================================================================================
convolution2d_1 (Convolution2D)  (None, 32, 32, 32)    896         convolution2d_input_1[0][0]      
____________________________________________________________________________________________________
maxpooling2d_1 (MaxPooling2D)    (None, 16, 16, 32)    0           convolution2d_1[0][0]            
____________________________________________________________________________________________________
convolution2d_2 (Convolution2D)  (None, 16, 16, 64)    18496       maxpooling2d_1[0][0]             
____________________________________________________________________________________________________
maxpooling2d_2 (MaxPooling2D)    (None, 8, 8, 64)      0           convolution2d_2[0][0]            
____________________________________________________________________________________________________
flatten_1 (Flatten)              (None, 4096)          0           maxpooling2d_2[0][0]             
____________________________________________________________________________________________________
dense_1 (Dense)                  (None, 1024)          4195328     flatten_1[0][0]                  
____________________________________________________________________________________________________
dense_2 (Dense)                  (None, 3)             3075        dense_1[0][0]                    
====================================================================================================
Total params: 4,217,795
Trainable params: 4,217,795
Non-trainable params: 0
____________________________________________________________________________________________________

Train


In [11]:
model.fit_generator(train_generator, 
                    samples_per_epoch=train_generator.nb_sample,
                    nb_epoch=30,
                    validation_data=valid_generator,
                    nb_val_samples=valid_generator.nb_sample,
                    verbose=True)


Epoch 1/30
940/940 [==============================] - 1s - loss: 0.5235 - acc: 0.8021 - val_loss: 1.3585 - val_acc: 0.5263
Epoch 2/30
940/940 [==============================] - 0s - loss: 0.3982 - acc: 0.8532 - val_loss: 1.1515 - val_acc: 0.4912
Epoch 3/30
940/940 [==============================] - 0s - loss: 0.3558 - acc: 0.8649 - val_loss: 1.1374 - val_acc: 0.5965
Epoch 4/30
940/940 [==============================] - 0s - loss: 0.3620 - acc: 0.8543 - val_loss: 0.8943 - val_acc: 0.6140
Epoch 5/30
940/940 [==============================] - 0s - loss: 0.3092 - acc: 0.8819 - val_loss: 1.4289 - val_acc: 0.4825
Epoch 6/30
940/940 [==============================] - 0s - loss: 0.3257 - acc: 0.8606 - val_loss: 0.6234 - val_acc: 0.6491
Epoch 7/30
940/940 [==============================] - 0s - loss: 0.3064 - acc: 0.8777 - val_loss: 0.8938 - val_acc: 0.6404
Epoch 8/30
940/940 [==============================] - 0s - loss: 0.2910 - acc: 0.8830 - val_loss: 1.5060 - val_acc: 0.5000
Epoch 9/30
940/940 [==============================] - 0s - loss: 0.3132 - acc: 0.8809 - val_loss: 0.8340 - val_acc: 0.6491
Epoch 10/30
940/940 [==============================] - 0s - loss: 0.2761 - acc: 0.9021 - val_loss: 0.8051 - val_acc: 0.6842
Epoch 11/30
940/940 [==============================] - 0s - loss: 0.2677 - acc: 0.8989 - val_loss: 0.8079 - val_acc: 0.6754
Epoch 12/30
940/940 [==============================] - 0s - loss: 0.2481 - acc: 0.9021 - val_loss: 0.9497 - val_acc: 0.6842
Epoch 13/30
940/940 [==============================] - 0s - loss: 0.2251 - acc: 0.9202 - val_loss: 0.8046 - val_acc: 0.6930
Epoch 14/30
940/940 [==============================] - 0s - loss: 0.2212 - acc: 0.9149 - val_loss: 0.5830 - val_acc: 0.8070
Epoch 15/30
940/940 [==============================] - 0s - loss: 0.2205 - acc: 0.9202 - val_loss: 0.9544 - val_acc: 0.6053
Epoch 16/30
940/940 [==============================] - 0s - loss: 0.1929 - acc: 0.9277 - val_loss: 1.0276 - val_acc: 0.6404
Epoch 17/30
940/940 [==============================] - 0s - loss: 0.1799 - acc: 0.9330 - val_loss: 1.1789 - val_acc: 0.5877
Epoch 18/30
940/940 [==============================] - 0s - loss: 0.1771 - acc: 0.9309 - val_loss: 1.0690 - val_acc: 0.6140
Epoch 19/30
940/940 [==============================] - 0s - loss: 0.1598 - acc: 0.9404 - val_loss: 1.5989 - val_acc: 0.5877
Epoch 20/30
940/940 [==============================] - 0s - loss: 0.1714 - acc: 0.9404 - val_loss: 1.3432 - val_acc: 0.6228
Epoch 21/30
940/940 [==============================] - 0s - loss: 0.1454 - acc: 0.9543 - val_loss: 1.2145 - val_acc: 0.6491
Epoch 22/30
940/940 [==============================] - 0s - loss: 0.1322 - acc: 0.9521 - val_loss: 1.3728 - val_acc: 0.6667
Epoch 23/30
940/940 [==============================] - 0s - loss: 0.1172 - acc: 0.9574 - val_loss: 1.2651 - val_acc: 0.6579
Epoch 24/30
940/940 [==============================] - 0s - loss: 0.1029 - acc: 0.9649 - val_loss: 1.1714 - val_acc: 0.7193
Epoch 25/30
940/940 [==============================] - 0s - loss: 0.0984 - acc: 0.9660 - val_loss: 1.4554 - val_acc: 0.6667
Epoch 26/30
940/940 [==============================] - 0s - loss: 0.0753 - acc: 0.9723 - val_loss: 1.2406 - val_acc: 0.7456
Epoch 27/30
940/940 [==============================] - 0s - loss: 0.1003 - acc: 0.9649 - val_loss: 1.1195 - val_acc: 0.7544
Epoch 28/30
940/940 [==============================] - 0s - loss: 0.0699 - acc: 0.9755 - val_loss: 1.4787 - val_acc: 0.6754
Epoch 29/30
940/940 [==============================] - 0s - loss: 0.0500 - acc: 0.9862 - val_loss: 1.1050 - val_acc: 0.7105
Epoch 30/30
940/940 [==============================] - 0s - loss: 0.0496 - acc: 0.9872 - val_loss: 1.6415 - val_acc: 0.7018
Out[11]:
<keras.callbacks.History at 0x7f2187d16e48>

In [12]:
# model.save_weights('binary_86.h5')

In [13]:
train_batches.class_indices


---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-13-10ddc5cd1129> in <module>()
----> 1 train_batches.class_indices

NameError: name 'train_batches' is not defined

In [ ]: