小白都会玩的自动驾驶算法

2018-09-17 09:57:04·  来源:Ethon 九三智能控  
 
今天,我们介绍一个可实现自动驾驶的简单算法。本算法是在Udacity的Self-Driving Car Simulator模拟器环境下开发,将摄像头的图像输入到深度学习模型中,可以让汽车学会如何自动运行。在模拟器中,我们从三个不同的视角创建了1551个画面,同时记录了车辆在517个不同状态下的转角、速度、油门和刹车等数据。本算法是在keras
今天,我们介绍一个可实现自动驾驶的简单算法。本算法是在Udacity的Self-Driving Car Simulator模拟器环境下开发,将摄像头的图像输入到深度学习模型中,可以让汽车学会如何自动运行。



在模拟器中,我们从三个不同的视角创建了1551个画面,同时记录了车辆在517个不同状态下的转角、速度、油门和刹车等数据。

本算法是在keras环境下开发的。首先,将数据划分为训练集和验证集。

1def load_data():
2 data_df = pd.read_csv(os.path.join(os.getcwd(),data_dir, 'driving_log.csv'), names=['center', 'left', 'right', 'steering', 'throttle', 'reverse', 'speed'])
3 X = data_df[['center', 'left', 'right']].values
4 y = data_df['steering'].values
5 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
6 return X_train, X_test, y_train, y_test

然后,我们进行模型的创建。模型包含5个卷积层、1个Dropout层和4个压缩层(Dense layer)。

1def build_model():
2 model = Sequential()
3 model.add(Lambda(lambda x: x/127.5-1.0, input_shape=INPUT_SHAPE))
4 model.add(Conv2D(24, kernel_size=(5, 5),strides=(2,2) ,activation='elu'))
5 model.add(Conv2D(36, kernel_size=(5, 5),strides=(2,2) ,activation='elu'))
6 model.add(Conv2D(48, kernel_size=(5, 5),strides=(2,2),activation='elu'))
7 model.add(Conv2D(64, kernel_size=(3, 3), activation='elu'))
8 model.add(Conv2D(64, kernel_size=(3, 3), activation='elu'))
9 model.add(Dropout(0.5))
10 model.add(Flatten())
11 model.add(Dense(100, activation='elu'))
12 model.add(Dense(50, activation='elu'))
13 model.add(Dense(10, activation='elu'))
14 model.add(Dense(1))
15 #model.summary()
16 return model

整个模型只输出一个值:车辆转角(steering angle)。将训练图像输入模型前,我们需要先做些预处理。

首先,为了增加训练样本数,我们需要进行数据增强处理:对已有图像进行翻转、平移、增加随机阴影或改变亮度等。

1image, steering_angle = choose_image(data_dir, center, left, right, steering_angle)
2image, steering_angle = random_flip(image, steering_angle)
3image, steering_angle = random_translate(image, steering_angle, range_x, range_y)
4image = random_shadow(image)
5image = random_brightness(image)

然后,我们对图像进行剪裁和重设大小(resize),以便输入图像能适合训练模型。

1def preprocess(image):
2 image = crop(image)
3 image = resize(image)
4 image = rgb2yuv(image)
5 return image
接下来,进行训练:

1def train_model(model, X_train, X_valid, y_train, y_valid):
2 model.compile(loss='mean_squared_error', optimizer=Adam(lr=0.001))
3
4 #Fits the model on data generated batch-by-batch by a Python generator.
5 model.fit_generator(batch_generator(data_dir, X_train, y_train, batch_size, True),
6 steps_per_epoch,
7 num_epochs,
8 verbose=1,
9 validation_data=batch_generator(data_dir, X_valid, y_valid, batch_size, False),
10 validation_steps=40
11 )

现在,我们获得了训练好的模型。然后,利用一个简单的服务器(socketio server)将模型预测的转角实时的传输给模拟器。

1steering_angle = float(data["steering_angle"])
2throttle = float(data["throttle"])
3speed = float(data["speed"])
4image = Image.open(BytesIO(base64.b64decode(data["image"])))
5image = np.asarray(image)
6image = preprocess_data.preprocess(image)
7image = np.array([image])
8
9steering_angle = float(model.predict(image, batch_size=1))
10throttle = 1.0 - steering_angle ** 2 - (speed / speed_limit) ** 2
11
12#send prediction to the simulator
13send_control(steering_angle, throttle)

车辆的运行情况如下:



可以看到,本算法实现了基本的自动驾驶功能,非常适合于初学者进行尝试。 
分享到:
 
反对 0 举报 0 收藏 0 评论 0
沪ICP备11026917号-25