Беспилотные автомобили, без сомнения, станут стандартным способом передвижения в будущем. Крупнейшие компании из Убер и Google Toyota и General Motors готовы потратить миллионы долларов, чтобы воплотить их в жизнь, поскольку прогнозируется, что будущий рынок будет стоить триллионы. В последние годы мы наблюдаем огромную эволюцию в этой области с автомобилями от Uber, Tesla, Waymo, которые имеют в общей сложности 8 миллионов миль в своих отчетах.
Конечно, беспилотные автомобили теперь стали реальностью благодаря множеству различных технологических достижений как в аппаратном, так и в программном обеспечении (спойлер: это глубокое обучение). Датчики LIDAR, камеры, GPS, ультразвуковые датчики работают вместе, чтобы получать данные из всех возможных источников. Эти данные анализируются в режиме реального времени с использованием передовых алгоритмов, что делает возможной работу автопилота.
Изображение из обзора технологий
Шаги для программирования автономного автомобиля
Существует 5 основных шагов для формирования автономного конвейера в следующем порядке:
-
Локализация
-
Восприятие
-
Прогноз
-
Планирование
-
Контроль
Локализация в основном, как автономное транспортное средство точно знает, где оно находится в мире. На этом этапе они получают данные от всех вышеупомянутых датчиков (объединение датчиков) и используют технику, называемую фильтрами Калмана, чтобы найти свое положение с максимально возможной точностью. Фильтр Калмана это вероятностный метод, который использует измерения во времени для оценки состояния положения объекта. Еще одна широко используемая методика – фильтры твердых частиц.
Восприятие это то, как автомобили чувствуют и понимают свое окружение. Здесь в игру вступают компьютерное зрение и нейронные сети. Но об этом позже.
в прогноз шаг, автомобили предсказывают поведение каждого объекта (автомобиля или человека) в их окружении. Как они будут двигаться, в каком направлении, с какой скоростью, по какой траектории будут следовать. Один из наиболее распространенных режимов, используемых здесь, — это рекуррентная нейронная сеть, поскольку она может учиться на прошлом поведении и прогнозировать будущее.
Планирование пути самоочевидно. Именно здесь автомобиль планирует маршрут следования или, другими словами, формирует свою траекторию. Это достигается с помощью поисковых алгоритмов (таких как
А*), Планирование решетки и Обучение с подкреплением.
Окончательно, контроль инженеры берут это отсюда. Они используют траекторию, сгенерированную на предыдущем шаге, чтобы соответствующим образом изменить рулевое управление, ускорение и торможение автомобиля. Наиболее распространенным методом является
ПИД Контроль, но есть несколько других, таких как Линейный квадратичный регулятор (LQR)
и Модель прогнозирующего управления (MPC)
Кстати, если вы хотите узнать больше, проверьте два замечательных курса, предлагаемых Udacity бесплатно:
Что ж, я думаю, пришло время построить автономный автомобиль самостоятельно. Хорошо, не все. Но что мы можем сделать, так это использовать симулятор вождения и записать то, что видит камера. Затем мы можем передать эти кадры в нейронную сеть, и, надеюсь, машина сможет научиться водить самостоятельно. Давайте посмотрим…
Мы будем использовать открытый исходный код Udacity. Симулятор беспилотного автомобиля. Чтобы использовать его, вам необходимо установить игровой движок Unity. Теперь самое интересное:
Само собой разумеется, что я трачу около часа на запись кадров. Это была серьезная работа, ребята. Я не дурачился.
Так или иначе, теперь симулятор создал 1551 кадр с 3 разных ракурсов, а также записал угол поворота руля, скорость, газ и тормоз для каждого из 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 сверточных, один отбрасываемый и 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
)
Теперь у нас есть обученная модель. По сути, он клонировал наше поведение за рулем. Давайте посмотрим, как мы это сделали. Для этого нам нужен простой сервер (сервер сокетио), чтобы отправить прогноз модели в симулятор в режиме реального времени. Я не буду вдаваться в подробности о сервере. Что важно, так это то, что мы предсказываем угол поворота, используя кадры и логи, сгенерированные симулятором в режиме реального времени.
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)
И результат:
Неплохо. Совсем неплохо.
Мы действительно сделали это. Я думаю, что эмулятор Udacity — это самый простой способ начать изучать беспилотные автомобили. Для продолжения путешествия на автономных транспортных средствах рекомендую Специализация «Беспилотные автомобили» от Coursera. Он содержит все, что вам нужно для начала работы, если вы действительно заинтересованы в этой области.
Подводя итог, автономные автомобили уже стали мейнстримом, и нет сомнений, что они станут обычным явлением раньше, чем думает большинство из нас. Его чрезвычайно сложно построить, поскольку для этого требуется очень много различных компонентов, от датчиков до программного обеспечения. Глубокое обучение определенно сыграет большую роль в достижении этой цели. Но здесь мы только что сделали очень-очень маленький первый шаг.
Главное, что будущее уже здесь. И это захватывающе…
* Раскрытие информации: Обратите внимание, что некоторые из приведенных выше ссылок могут быть партнерскими ссылками, и без дополнительной оплаты для вас мы будем получать комиссию, если вы решите совершить покупку после перехода по ссылке.