深度学习驱动的自动驾驶技术解析
自动驾驶汽车使用深度学习技术
自动驾驶汽车无疑将成为未来的标准交通方式。许多大型机构都投入巨资使其成为现实,预计未来市场价值将达到数万亿美元。过去几年,该领域取得了巨大发展,多家机构的自动驾驶汽车已累计行驶800万英里。
自动驾驶汽车之所以成为现实,得益于硬件和软件方面的多项技术进步(剧透:主要是深度学习)。激光雷达传感器、摄像头、GPS和超声波传感器协同工作,从各种可能来源接收数据。这些数据通过先进算法进行实时分析,使自动驾驶功能成为可能。
编程自动驾驶汽车的关键步骤
自动驾驶流程包含以下5个基本步骤:
定位
定位是自动驾驶汽车精确知道自身在世界中位置的过程。在此步骤中,系统从上述所有传感器获取数据(传感器融合),并使用卡尔曼滤波技术以最高精度确定位置。卡尔曼滤波是一种概率方法,使用随时间变化的测量值来估计物体位置状态。另一种广泛使用的技术是粒子滤波。
感知
感知是汽车感知和理解环境的方式。这是计算机视觉和神经网络发挥作用的地方。
预测
在预测步骤中,汽车预测周围每个物体(车辆或行人)的行为:它们将如何移动、朝哪个方向、以什么速度、将遵循什么轨迹。这里最常用的模型之一是循环神经网络,因为它可以从过去的行为中学习并预测未来。
路径规划
路径规划不言自明,是汽车规划要遵循的路线或生成其轨迹的地方。这通过搜索算法(如A*)、格子规划和强化学习来实现。
控制
最后,控制工程师接手工作。他们使用前一步生成的轨迹相应地改变汽车的方向、加速度和刹车。最常用的方法是PID控制,但还有其他几种方法,如线性二次调节器(LQR)和模型预测控制(MPC)。
构建自动驾驶汽车
我们将使用某机构开源的自动驾驶汽车模拟器。要使用它,需要安装Unity游戏引擎。
模拟器从3个不同角度产生了1551帧图像,并为不同的517个状态记录了转向角、速度、油门和刹车值。
在keras中构建模型之前,必须读取数据并将其拆分为训练集和测试集。
def load_data():
data_df = pd.read_csv(os.path.join(os.getcwd(),data_dir, 'driving_log.csv'), names=['center', 'left', 'right', 'steering', 'throttle', 'reverse', 'speed'])
X = data_df[['center', 'left', 'right']].values
y = data_df['steering'].values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
return X_train, X_test, y_train, y_test
之后,我们将构建包含5个卷积层、1个Dropout层和4个密集层的模型。
def build_model():
model = Sequential()
model.add(Lambda(lambda x: x/127.5-1.0, input_shape=INPUT_SHAPE))
model.add(Conv2D(24, kernel_size=(5, 5),strides=(2,2) ,activation='elu'))
model.add(Conv2D(36, kernel_size=(5, 5),strides=(2,2) ,activation='elu'))
model.add(Conv2D(48, kernel_size=(5, 5),strides=(2,2),activation='elu'))
model.add(Conv2D(64, kernel_size=(3, 3), activation='elu'))
model.add(Conv2D(64, kernel_size=(3, 3), activation='elu'))
model.add(Dropout(0.5))
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))
return model
网络将仅输出一个值:转向角。
在将输入传递给模型之前,应该进行一些预处理。这是使用OpenCV完成的,这是一个为图像和视频处理构建的开源库。
首先,必须通过增强现有数据来产生更多数据。例如,可以翻转现有图像、平移它们、添加随机阴影或更改其亮度。
image, steering_angle = choose_image(data_dir, center, left, right, steering_angle)
image, steering_angle = random_flip(image, steering_angle)
image, steering_angle = random_translate(image, steering_angle, range_x, range_y)
image = random_shadow(image)
image = random_brightness(image)
接下来,必须确保裁剪和调整图像大小以适合网络。
def preprocess(image):
image = crop(image)
image = resize(image)
image = rgb2yuv(image)
return image
训练时间:
def train_model(model, X_train, X_valid, y_train, y_valid):
model.compile(loss='mean_squared_error', optimizer=Adam(lr=0.001))
model.fit_generator(batch_generator(data_dir, X_train, y_train, batch_size, True),
steps_per_epoch,
num_epochs,
verbose=1,
validation_data=batch_generator(data_dir, X_valid, y_valid, batch_size, False),
validation_steps=40
)
现在有了训练好的模型。它基本上克隆了驾驶行为。
为了测试模型,需要一个简单的服务器(socketio服务器)将模型预测实时发送到模拟器。重要的是使用模拟器实时生成的帧和日志预测转向角的部分。
steering_angle = float(data["steering_angle"])
throttle = float(data["throttle"])
speed = float(data["speed"])
image = Image.open(BytesIO(base64.b64decode(data["image"])))
image = np.asarray(image)
image = preprocess_data.preprocess(image)
image = np.array([image])
steering_angle = float(model.predict(image, batch_size=1))
throttle = 1.0 - steering_angle ** 2 - (speed / speed_limit) ** 2
send_control(steering_angle, throttle)
结果表现相当不错。
某机构的模拟器是开始学习自动驾驶汽车的最简单方法。要继续自动驾驶汽车的学习之旅,推荐某学习平台的自驾汽车专业课程。如果对该领域真正感兴趣,它包含了入门所需的一切内容。
总之,自动驾驶汽车已经开始成为主流,毫无疑问,它们将比大多数人想象的更早普及。构建自动驾驶汽车极其复杂,需要从传感器到软件的许多不同组件。深度学习肯定会在实现这一目标方面发挥重要作用。但这里只是迈出了非常非常小的第一步。
最重要的是:未来已来,而且令人兴奋...
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)或者 我的个人博客 https://blog.qife122.com/
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)
公众号二维码
公众号二维码