DeepTesla
數據來自deeptesla
安裝要求
- Python3
- Numpy
- Pandas
- TensorFlow
- Keras
- opencv
- imageio
數據預處理
- 將視頻轉化為圖片
import cv2nimport imageionimport pandas as pdnimport numpy as npnepoch_ids = [i+1 for i in range(10)]nimg_data=[[] for i in range(10)]nlabel_data=[[] for i in range(10)]nnfor epoch_id in epoch_ids:n print(---------- processing video {} ----------.format(epoch_id))n csv_path = epochs/epoch{:0>2}_steering.csv.format(epoch_id)n df = pd.read_csv(csv_path)n label_data[epoch_id-1] = df[wheel].valuesn mkv_path = epochs/epoch{:0>2}_front.mkv.format(epoch_id)n vid = imageio.get_reader(mkv_path, ffmpeg)n for i in range(len(df)):n img = cv2.resize(vid.get_data(i),(224,224))n img_data[epoch_id-1].append(img)n print(end of video {},.format(epoch_id),n img_count:,len(img_data[epoch_id-1]),img_shape:,img_data[epoch_id-1][0].shape,labels:,label_data[epoch_id-1].shape)nnimg_data = np.concatenate(img_data, axis=0)nlabel_data = np.concatenate(label_data, axis=0)nprint(-------------end of all---------------,nimg_data:,img_data.shape,label_data:,label_data.shape)n
- 由於我們此次會用到遷移學習,使用的預訓練模型是VGG16,所以我們的圖片形狀為(224, 224, 3)
- 數據混洗、分割
##shufflenp = np.random.permutation(len(img_data))nimg_data,label_data = img_data[p],label_data[p]n##splitnindex = int(len(img_data)*0.8)ntrain_image,test_image = img_data[:index], img_data[index:]ntrain_label,test_label = label_data[:index], label_data[index:]nprint(train_image.shape,test_image.shape)nprint(train_label.shape,test_label.shape)n
模型構建與訓練
from keras.models import Modelnfrom keras.optimizers import SGD,RMSpropnfrom keras.callbacks import TensorBoardnfrom keras.layers import Input, Flatten, Dropout,Dense,Reshape,Convolution2D, MaxPooling2D,GlobalAveragePooling2Dnfrom keras.applications.vgg16 import VGG16nbase_model = VGG16(weights=imagenet,include_top=False)nnx = GlobalAveragePooling2D()(base_model.output)nx = Dense(1024, activation=relu)(x)nx = Dense(512, activation=relu)(x)nx = Dropout(0.7)(x)noutput = Dense(1)(x)nmodel = Model(input=base_model.input,output=output)nnfor layer in base_model.layers:n layer.trainable = Falsennopt = RMSprop(lr=1e-6)nmodel.compile(optimizer=Adadelta,n loss=mse)nnmodel.fit(train_image,train_label,validation_split=0.2,batch_size=32, callbacks=[TensorBoard(log_dir=./log)])nmodel.evaluate(test_image, test_label)nnmodel.save(./models/model.h5)nwith open(./models/model.json, w) as f:n f.write(model.to_json())n
評估與預測
model.evaluate(test_image, test_label)n
模型的loss為0.7065757193388762
- 預測可視化
pred = model.predict(train_image[0:100])nplt.plot(pred,r)nplt.plot(train_label[0:100],b)nplt.show()n

藍色為真實值,紅色為預測值,相比上次的行為克隆真是太好了
模擬

黑色方向盤為人類駕駛,綠色方向盤為模型預測,右下角的曲線圖展示了兩者方向盤角度的區別。上圖只是告訴你模擬方式,並不是具體效果。
結尾
代碼/數據地址ciozhang
推薦閱讀:
※Tesla自動駕駛的前世今生
※【乾貨】擁有神秘技能,讓你成為自動駕駛領域的香餑餑
※自動駕駛令沃爾沃谷歌特斯拉長安等使盡洪荒之力?
※淺談自動轉向功能ACSF
※如何看待最近谷歌放棄研發自動駕駛輔助系統?
TAG:机器学习 | 深度学习DeepLearning | 自动驾驶 |

