{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "accelerator": "GPU", "colab": { "name": "NVIDIA_Model.ipynb", "provenance": [] }, "kernelspec": { "display_name": "Python 3", "name": "python3" }, "language_info": { "name": "python" } }, "cells": [ { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "BKnMAKV2juCn", "outputId": "6e405f7b-56c2-45d9-bbe3-257c81f6d892" }, "source": [ "#!git clone https://github.com/tbchhetri/DrivingData #use ! to invoke bash commands to use commands like ls cd git clone, these can just be used as a command line" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "fatal: destination path 'DrivingData' already exists and is not an empty directory.\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "LfxvLfwutcaw", "outputId": "26bc021f-c1e8-43f0-acea-b51b4537d9c8" }, "source": [ "from google.colab import drive #details: https://youtu.be/InZ16tcM9Pc, https://youtu.be/58t0PFIWR9Y\n", "drive.mount('/content/drive')" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "Mounted at /content/drive\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "tgWQ03ADJdGV" }, "source": [ "import os\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import matplotlib.image as mpimg\n", "import keras\n", "from keras.models import Sequential\n", "from keras.optimizers import Adam\n", "from keras.layers import Convolution2D, MaxPooling2D, Dropout, Flatten, Dense\n", "from sklearn.utils import shuffle\n", "from sklearn.model_selection import train_test_split\n", "from imgaug import augmenters as iaa #https://imgaug.readthedocs.io/en/latest/\n", "import cv2\n", "import pandas as pd\n", "import ntpath #to cut the path \n", "import random" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 204 }, "id": "d1ZONeyBKPPK", "outputId": "8f4a94cd-205a-44e8-89a5-e394456714c6" }, "source": [ "#getting the data from the git and save it in a var\n", "#gitData = \"DrivingData\"\n", "gitData = r'/content/drive/MyDrive/DrivingData'\n", "columns = ['center','steering', 'speed'] #inref to the csv file\n", "drivingData = pd.read_csv(os.path.join(gitData, 'driving_log.csv'), names = columns)\n", "drivingData.head()" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
centersteeringspeed
0/Volumes/MyData/Data/College/Winter20/training...0.00.000077
1/Volumes/MyData/Data/College/Winter20/training...0.00.000079
2/Volumes/MyData/Data/College/Winter20/training...0.00.000079
3/Volumes/MyData/Data/College/Winter20/training...0.00.000079
4/Volumes/MyData/Data/College/Winter20/training...0.00.000080
\n", "
" ], "text/plain": [ " center steering speed\n", "0 /Volumes/MyData/Data/College/Winter20/training... 0.0 0.000077\n", "1 /Volumes/MyData/Data/College/Winter20/training... 0.0 0.000079\n", "2 /Volumes/MyData/Data/College/Winter20/training... 0.0 0.000079\n", "3 /Volumes/MyData/Data/College/Winter20/training... 0.0 0.000079\n", "4 /Volumes/MyData/Data/College/Winter20/training... 0.0 0.000080" ] }, "metadata": { "tags": [] }, "execution_count": 3 } ] }, { "cell_type": "code", "metadata": { "id": "NxOskJ1SyIjw" }, "source": [ "#remove the startin path of images\n", "def getTail(imgPath):\n", " _,tail = ntpath.split(imgPath)\n", " return tail \n", "\n", "#moving forward we will only be using center data as our camera will only be placed at the center of the car\n", "drivingData['center'] = drivingData['center'].apply(getTail) #same can be done for left and right\n", "#drivingData.head()" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "2GA017FR99mi" }, "source": [ "#getting rid of excess data so that our model will not be biased\n", "numBins = 25\n", "deleteMe = []\n", "binElemets = 400 #so only 400 elements per bin\n", "_, bins = np.histogram(drivingData['steering'], numBins)\n", "\n", "for binCounter in range (numBins):\n", " tempList = [] #get the list ready for another bin\n", " for steeringIndex in range(len(drivingData['steering'])):\n", " if drivingData['steering'][steeringIndex] >= bins[binCounter] and drivingData['steering'][steeringIndex] <= bins[binCounter+1]: #making sure the steering falls in the bins\n", " tempList.append(steeringIndex)\n", " tempList = shuffle(tempList)\n", " tempList = tempList[binElemets:]\n", " deleteMe.extend(tempList) #deleteMe will now contain all the excess steering data\n", "\n", "drivingData.drop(drivingData.index[deleteMe], inplace=True) #data is removed here, true inplace removes the data directly from the drivingData without returning anything" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "y1LuVsFvD64_" }, "source": [ "#getting the training data and labels\n", "def getReadyImg(gitData): #returns the center image and it's corresponding steering angle\n", " imgPath = []\n", " steering = []\n", "\n", " for row in range (len(drivingData)):\n", " drivingDataRow = drivingData.iloc[row]\n", " imgPath.append(os.path.join(gitData, drivingDataRow[0].strip())) #center = drivingDataRow[0]\n", " steering.append(float(drivingDataRow[1])) #cuz steering is at index 1\n", "\n", " return imgPath, steering\n", "imgPath, steeringDegree = getReadyImg(gitData + '/IMG')\n", "\n", "X_train, X_val, y_train, y_val = train_test_split(imgPath, steeringDegree, test_size = 0.2, random_state = 6) #20%of data will be x_val and y_val" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "NkwXRC6AUzeI" }, "source": [ "# AUGMENTATION TECHNIQUES\n", "#1. Zoom\n", "def zoom(img):\n", " zoom = iaa.Affine(scale=(1,1.3)) #selects a random percent of zoom from 1-30%\n", " img = zoom.augment_image(img)\n", " return img\n", "\n", "#2. Panning\n", "#def panIt(img):\n", "# pan = iaa.Affine(translate_percent={\"x\": (-0.1, 0.1), \"y\" : (-0.1, 0.1)}) #just the degree of panning, it is working randomly\n", "# img = pan.augment_image(img)\n", "# return img\n", "\n", "#3. Brightness\n", "def brighten (img):\n", " brightness = iaa.Multiply((0.2,1.2)) #makes img darker if less than 1, it is working randomly\n", " img = brightness.augment_image(img)\n", " return img\n", "\n", "#4. Flip\n", "def flip (img, steeringDegree):\n", " flipped = cv2.flip(img, 1) #1-horizontal flip, -1-vertical flip\n", " steeringDegree = -steeringDegree\n", " return flipped, steeringDegree\n", "\n", "#COMBINING AUGMENTATIONS\n", "def randomAugmentation (img, steeringDegree):\n", " img = mpimg.imread(img) #reading the image path\n", "\n", " if (np.random.rand() < 0.5): #this will only run almost half of the time, the rand function only outputs no from 0-1\n", " img = zoom(img)\n", " #if (np.random.rand() < 0.5):\n", " # img = panIt(img)\n", " if (np.random.rand() < 0.5):\n", " img = brighten(img)\n", " if (np.random.rand() < 0.5):\n", " img, steeringDegree = flip(img, steeringDegree)\n", " \n", " return img, steeringDegree" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "5jc-crE2hHHW" }, "source": [ "#PREPROCESSING\n", "def preprocess(img):\n", " #img = mpimg.imread(img)\n", " img = img[60:135,:,:] #we are cropping the height of the image since other than 60-135 we dont need those infos\n", " img = cv2.cvtColor(img, cv2.COLOR_RGB2YUV) #Y-luminosity, and UV. This is recommended by NVIDIA while running their Neural Network\n", " img = cv2.GaussianBlur(img, (3,3), 0) #(3,3) is the kernal size for the blur, this is done to reduce the noise in image\n", " img = cv2.resize(img, (200,66)) #this size is also recommended by NVIDIA\n", " img = img/255\n", " return img" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "ii2jUqZsk3Zr" }, "source": [ "def augmenterCoroutein (imgPath, steeringDegree, batchSize, isTraining):#this is a coroutein, when this is called again the values don't reinitialize but gets initialized to their old value\n", " while True: #coroutines can pause and resume thier functions\n", " imgBatch = []\n", " steeringBatch = []\n", "\n", " for counter in range (batchSize):\n", " randomIndex = random.randint(0, len(imgPath) - 1)\n", "\n", " if isTraining:\n", " img, steering = randomAugmentation(imgPath[randomIndex], steeringDegree[randomIndex])\n", " else:\n", " img = mpimg.imread(imgPath[randomIndex])\n", " steering = steeringDegree[randomIndex]\n", " \n", " img = preprocess(img)\n", " imgBatch.append(img)\n", " steeringBatch.append(steering)\n", " yield (np.asarray(imgBatch), np.asarray(steeringBatch))" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "bbYAsmNx-Rz7" }, "source": [ "#following the NVIDIA Model, more details: https://developer.nvidia.com/blog/deep-learning-self-driving-cars/\n", "def nvidiaModel():\n", " model = Sequential()\n", " model.add(Convolution2D(24, (5, 5), strides=(2,2), input_shape=(66, 200, 3), activation='elu'))\n", " model.add(Convolution2D(36, (5, 5), strides=(2,2), activation='elu'))\n", " model.add(Convolution2D(48, (5, 5), strides=(2,2), activation='elu'))\n", " model.add(Convolution2D(64, (3, 3), activation='elu'))\n", " \n", " model.add(Convolution2D(64, (3, 3), activation='elu'))\n", " #model.add(Dropout(0.5))\n", " \n", " model.add(Flatten())\n", " \n", " model.add(Dense(100, activation = 'elu'))\n", " #model.add(Dropout(0.5))\n", " \n", " model.add(Dense(50, activation = 'elu'))\n", " #model.add(Dropout(0.5))\n", " \n", " model.add(Dense(10, activation = 'elu'))\n", " #model.add(Dropout(0.5))\n", "\n", " model.add(Dense(1))\n", " \n", " model.compile(loss='mse', optimizer = Adam(lr=1e-4))\n", " return model" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "kvo9O_A9_Yrw", "outputId": "a6142dc0-fe7f-491f-cadb-e031089d986d" }, "source": [ "model = nvidiaModel() \n", "print(model.summary())" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "Model: \"sequential\"\n", "_________________________________________________________________\n", "Layer (type) Output Shape Param # \n", "=================================================================\n", "conv2d (Conv2D) (None, 31, 98, 24) 1824 \n", "_________________________________________________________________\n", "conv2d_1 (Conv2D) (None, 14, 47, 36) 21636 \n", "_________________________________________________________________\n", "conv2d_2 (Conv2D) (None, 5, 22, 48) 43248 \n", "_________________________________________________________________\n", "conv2d_3 (Conv2D) (None, 3, 20, 64) 27712 \n", "_________________________________________________________________\n", "conv2d_4 (Conv2D) (None, 1, 18, 64) 36928 \n", "_________________________________________________________________\n", "flatten (Flatten) (None, 1152) 0 \n", "_________________________________________________________________\n", "dense (Dense) (None, 100) 115300 \n", "_________________________________________________________________\n", "dense_1 (Dense) (None, 50) 5050 \n", "_________________________________________________________________\n", "dense_2 (Dense) (None, 10) 510 \n", "_________________________________________________________________\n", "dense_3 (Dense) (None, 1) 11 \n", "=================================================================\n", "Total params: 252,219\n", "Trainable params: 252,219\n", "Non-trainable params: 0\n", "_________________________________________________________________\n", "None\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "zKTRwqXQ_gvR", "outputId": "27e9efb6-12ac-4e0b-ddf3-c33bd9979977" }, "source": [ "history = model.fit_generator(augmenterCoroutein(X_train, y_train, 100, 1), steps_per_epoch = 300, epochs = 10, \n", " validation_data = augmenterCoroutein(X_val, y_val, 100, 0), validation_steps = 200, verbose = 1, shuffle = 1)" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "/usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/training.py:1844: UserWarning: `Model.fit_generator` is deprecated and will be removed in a future version. Please use `Model.fit`, which supports generators.\n", " warnings.warn('`Model.fit_generator` is deprecated and '\n" ], "name": "stderr" }, { "output_type": "stream", "text": [ "Epoch 1/10\n", "300/300 [==============================] - 638s 2s/step - loss: 0.1246 - val_loss: 0.1104\n", "Epoch 2/10\n", "300/300 [==============================] - 217s 726ms/step - loss: 0.0997 - val_loss: 0.0766\n", "Epoch 3/10\n", "300/300 [==============================] - 217s 725ms/step - loss: 0.0861 - val_loss: 0.0564\n", "Epoch 4/10\n", "300/300 [==============================] - 214s 717ms/step - loss: 0.0762 - val_loss: 0.0526\n", "Epoch 5/10\n", "300/300 [==============================] - 219s 733ms/step - loss: 0.0672 - val_loss: 0.0470\n", "Epoch 6/10\n", "300/300 [==============================] - 222s 742ms/step - loss: 0.0596 - val_loss: 0.0437\n", "Epoch 7/10\n", "300/300 [==============================] - 221s 739ms/step - loss: 0.0594 - val_loss: 0.0538\n", "Epoch 8/10\n", "300/300 [==============================] - 220s 737ms/step - loss: 0.0530 - val_loss: 0.0396\n", "Epoch 9/10\n", "300/300 [==============================] - 219s 731ms/step - loss: 0.0489 - val_loss: 0.0413\n", "Epoch 10/10\n", "300/300 [==============================] - 216s 722ms/step - loss: 0.0460 - val_loss: 0.0456\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "LSrryJyp_q5B", "colab": { "base_uri": "https://localhost:8080/", "height": 312 }, "outputId": "217c3186-d84e-4af7-f6f3-010f0c8923e1" }, "source": [ "plt.plot(history.history['loss'])\n", "plt.plot(history.history['val_loss'])\n", "plt.title('Loss')\n", "plt.xlabel('epoch')" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "Text(0.5, 0, 'epoch')" ] }, "metadata": { "tags": [] }, "execution_count": 13 }, { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] }, { "cell_type": "code", "metadata": { "id": "NcjcbAXMPDYH" }, "source": [ "" ], "execution_count": null, "outputs": [] } ] }