Repository navigation
Expand file tree
/
Copy pathmodel.py
More file actions
84 lines (66 loc) · 3.08 KB
/
Copy pathmodel.py
File metadata and controls
84 lines (66 loc) · 3.08 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten, Convolution2D, Input, Lambda, SpatialDropout2D
from keras.optimizers import Adam
import tensorflow as tf
import pandas as pd
import os
from utils import process_img_from_path
from utils import training_image_generator
from utils import get_images
from utils import randomly_drop_low_steering_data
DATA_PATH = "../../data"
LABEL_PATH = os.path.join(DATA_PATH, "driving_log.csv")
BATCH_SIZE = 64
EPOCHS = 50
def model_nvidia(input_shape):
"""Model based on the following paper by Nvidia
http://images.nvidia.com/content/tegra/automotive/images/2016/solutions/pdf/end-to-end-dl-using-px.pdf
"""
def resize_images(img):
"""Returns resized image
Cannot be directly used in lambda function
as tf is not understood by keras
"""
import tensorflow as tf
return tf.image.resize_images(img, (66, 200))
model = Sequential()
model.add(Lambda(resize_images, input_shape=input_shape))
model.add(Lambda(lambda x: x/255.-0.5))
model.add(Convolution2D(24, 5, 5, border_mode="same", subsample=(2,2), activation="elu"))
model.add(SpatialDropout2D(0.2))
model.add(Convolution2D(36, 5, 5, border_mode="same", subsample=(2,2), activation="elu"))
model.add(SpatialDropout2D(0.2))
model.add(Convolution2D(48, 5, 5, border_mode="valid", subsample=(2,2), activation="elu"))
model.add(SpatialDropout2D(0.2))
model.add(Convolution2D(64, 3, 3, border_mode="valid", activation="elu"))
model.add(SpatialDropout2D(0.2))
model.add(Convolution2D(64, 3, 3, border_mode="valid", activation="elu"))
model.add(SpatialDropout2D(0.2))
model.add(Flatten())
model.add(Dropout(0.5))
model.add(Dense(100, activation="elu"))
model.add(Dense(50, activation="elu"))
model.add(Dense(10, activation="elu"))
model.add(Dropout(0.5))
model.add(Dense(1))
model.compile(optimizer=Adam(lr=0.001), loss='mse')
return model
## Load CSV File generated by simulator
csv_df = pd.read_csv(LABEL_PATH, index_col=False)
csv_df.columns = ['center', 'left', 'right', 'steer', 'throttle', 'brake', 'speed']
## Randomly Shuffle
csv_df = csv_df.sample(n=len(csv_df))
## Training and Validation Data
training_count = int(0.8 * len(csv_df))
training_data = csv_df[:training_count].reset_index()
validation_data = csv_df[training_count:].reset_index()
## Reducing low steering angle data to remove bias
training_data = randomly_drop_low_steering_data(training_data)
## Opening a random image to obatin input size for model
img = process_img_from_path(os.path.join(DATA_PATH, training_data['center'].iloc[909].strip()))
## Creating a model
model = model_nvidia(img.shape)
samples_per_epoch = int(len(training_data) / BATCH_SIZE) * BATCH_SIZE
nb_val_samples = len(validation_data)
values = model.fit_generator(training_image_generator(training_data, BATCH_SIZE, DATA_PATH), samples_per_epoch=samples_per_epoch, nb_epoch=EPOCHS, validation_data=get_images(validation_data, DATA_PATH), nb_val_samples=len(validation_data))
model.save('model.h5')