TensorFlowを用いた自走車

9415 ワード

歓迎👋, 今日は、私たちがNVIDIAのセルフドライビングモデルに基づいてセルフドライビングカーを構築します.

必要条件

  • ユニティUnity そして、Unityインストーラをダウンロードしてください.適切なバージョンを選択します.インストーラを起動し、プログラムを正常にインストールするのに必要な手順に従ってください.
  • シミュレーターgithub/udacity との指示に従ってくださいReadme.md システム要件に従ってシミュレータをダウンロードして実行する.
  • アナコンダ/Python ENV -モデルのPython環境を作成するconda or python .
  • TensorFlow -アナコンダENVを作成した後、TensorFlowをインストールします.訪問here もっと知る.
  • シミュレータの実行

  • 私たちが最初にシミュレータを実行するとき、我々は以下に示されるものに類似したスクリーンを見ます.
  • 解像度(私は640 x 480を示唆する)とグラフィックの品質を選択します.
  • その後、再生ボタンを押してシミュレータを起動します.
  • 次に、2つのオプション、トレーニングモードと自律モードで画面が表示されます.
  • トラックを選択し、トレーニングモードを選択します.
  • トレーニングモード


    このモードでは、3カメラ(左、中央、右)によって生成される画像を車の前面に記録します.すべてのキャプチャされたイメージは、ステアリング、スロットル、ブレーキとDrivingHellowログという名前のCSVファイル内の速度の値と一緒にローカルディスクに保存されます.CSV

    For more accurate results, run the car for 8-10 laps.


    ゴール


    プロジェクトの目標は、自律モードでは、トレーニングモードを実行した後に得られたすべてのデータを使用して深いニューラルネットワークを使用して車を自動的に実行することです.

    コーディングを始めましょう!


    探索データ解析

  • 我々はデータと必要なライブラリをインポートします.
  • import pandas as pd
    import numpy as np
    import os
    import cv2
    import tensorflow as tf
    import matplotlib.pyplot as plt
    from tensorflow.keras.models import Sequential
    from tensorflow.keras.layers import Convolution2D, Flatten, Dense, Dropout
    from tensorflow.keras.optimizers import Adam
    
    
  • データを読み込み、ヘッドを使用して表示するdf.head() .
  • columns = ['center', 'left', 'right', 'steering', 'throttle','brake', 'speed']
    df = pd.read_csv(os.path.join('E:\dev\SelfDrivingCar','driving_log.csv'), names = columns)
    df.head()
    
    
  • 視覚的洞察のためのステアリング値のプロット
  • plt.hist(df.steering)
    plt.show()
    
    
  • また、コードを実行することによってその歪みをチェックすることもできます.
  • print("Skewness of the steering feature:\n", df['steering'].skew())
    
    

    We are going to use steering column as the dependent variable. Our goal will be to predict the steering values from the images produced by the simulation.

  • を使用してイメージをチェックする
  • img = cv2.imread(df['center'][0])
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    plt.imshow(img)
    
    
  • イメージは大丈夫ですが、山や木、空などの不要なオブジェクトがたくさんあります.私たちはイメージから取り除くことができて、トレーニングのために道を保つだけです.
  • 画像前処理とデータ増強


    トレーニングプロセスに移行する前に、不必要なデータを削除し、モデルを訓練するためのイメージをシンプルに保つことが重要です.イメージ前処理は、モデルトレーニング時間を減少させて、モデル推論速度を増やすかもしれません.
    画像の強化は、良い結果を得るために、すでに使用可能なものからトレーニングのためのより多くのデータを作成するプロセスであり、オーバーフィットを防ぐ.
  • 関数の定義image_preprocessing() これは入力として画像のパスを受け取り、イメージをトリミングし、イメージをYUVに変換します.
  • def image_preprocessing(path):
        # cropping image
        img = cv2.imread(path)
        cropped_img = img[60:160,:]
        # color conversion from BGR to YUV
        final_img = cv2.cvtColor(cropped_img, cv2.COLOR_BGR2YUV)
        # application of gaussian blur
        final_img = cv2.GaussianBlur(final_img,(3,5),0)
        # resize image
        output = cv2.resize(final_img, (300,80))
        # normalizing image
        output = output/255
        return output
    
    
  • 関数を作成するdata_augmentation() これは、画像処理機能を受け入れ、拡張画像を出力し、ステアリングの機能を強化.
  • def data_augmentation(img_process):
        images = []
        steerings = []
        # for each row in the dataset
        for row in range(df.shape[0]):
            # for ith column
            for i in range(3):
                # splitting image path and filename
                fileName = mod_name(df.iloc[row, i])
                filePath = './IMG/'+ fileName
                # processing the images
                img = img_process(filePath)
                images.append(img)
                steerings.append(df['steering'][row])
    
        # image and measurement augmentation
        augmented_images, augmented_steerings = [], []
        for image, steering in zip(images, steerings):
            augmented_images.append(image)
            augmented_steerings.append(steering)
    
            # horizontally flippping the images
            flipped_img = cv2.flip(image, 1)
            augmented_images.append(flipped_img)
            # changing the sign to match the flipped images
            augmented_steerings.append(-1*steering)
    
        return augmented_images, augmented_steerings
    
    
  • 我々は、拡張画像を格納し、2つの異なる変数でステアリング値を拡張した.そして、処理されたイメージと一緒に値を印刷して、すべてがうまく動くかどうかチェックする.
  • 我々は、画像を表示するMatplotLibを使用します.
  • augmented_images, augmented_steerings = data_augmentation(image_preprocessing)
    print(augmented_steerings[100])
    plt.imshow(augmented_images[100])
    plt.show()
    
    

    訓練と検証


    次の手順は、トレーニングと検証のデータセットを準備することです.
  • 第一に、我々は拡張画像を格納し、XとYの変数で別のステアリング値を増やす.
  • X = np.array(augmented_images)
    y = np.array(augmented_steerings)
    
    X.shape
    
    

    (7698, 80, 300, 3)

  • 次に、このデータをtrain_test_split SkLearnライブラリからのメソッド.
  • from sklearn.model_selection import train_test_split
    xtrain, xval, ytrain, yval = train_test_split(X, y, test_size = 0.2, random_state = 1)
    print('Train images:',len(xtrain))
    print('Validation images:',len(xval))
    
    

    Train images: 6158 Validation images: 1540


    モデルビルとトレーニング


    The model アーキテクチャは、自己駆動車のNVIDIAのニューラルネットワークに基づいています.
    model = Sequential()
    model.add(Convolution2D(24,(5,5),(2,2),input_shape=xtrain[0].shape))
    
    model.add(Convolution2D(36,(5,5),(2,2),activation='elu'))
    model.add(Convolution2D(48,(5,5),(2,2),activation='elu'))
    # since the images are very small, we are keeping the stride small and not 2x2.
    model.add(Convolution2D(64,(3,3),activation='elu'))
    model.add(Convolution2D(64,(3,3),activation='elu'))
    model.add(Dropout(0.2))
    model.add(Flatten())
    model.add(Dense(100,activation='elu'))
    model.add(Dense(50,activation='elu'))
    model.add(Dense(10,activation='elu'))
    model.add(Dense(1))
    
    model.compile(Adam(learning_rate=0.0001), loss='mse', metrics=['accuracy'])
    print(model.summary())
    
    
  • オーバーフィットを防ぐためのモデルの早期停止
  • モデルの保存
  • トレーニングと検証損失の評価


    Matplotlibを使用してトレーニング損失と検証損失をプロットします.
    plt.plot(history.history['loss'])
    plt.plot(history.history['val_loss'])
    plt.legend(['Training', 'Validation'])
    plt.title('loss')
    plt.xlabel('epoch')
    plt.show()
    
    

    結論


    全体のモデルは、元のNVIDIAモデルの正確な複製ではない、それはちょうど元の背後にあるアイデアの実装ですので、まだ改善の余地があります.適切なパラメータの調整とデータ前処理により,モデルの精度と損失をさらに改善できる.私の場合、トレーニングデータのイメージを収集するために、トラックの2~3周だけを考慮しました.したがって、ラップの数を増やすことは確実にモデル精度と損失に影響します.そして、私はイメージをyuvに変えました、しかし、我々が色を除去して、端だけを保つか、グレイスケールにイメージを変えることを考えるならば、我々は我々のモデルで改善された結果を得るかもしれません.
    🌎探検する.🎓学ぶ👷‍♂️ビルド.ハッピーコーディング💛