Построить беспилотный автомобиль за месяц — инструкция от любителя

Эксперимент продуктового менеджера Intuit Макса Дейча, занявший 26 часов обучения и программирования.

Чтобы построить беспилотный автомобиль, необходимо создать автономное программное обеспечение и соответствующее автомобильное оборудование. Фокус этого эксперимента находился в области разработки программной части, поскольку именно в ней заключалась основная техническая сложность.

Программное обеспечение должно решать две задачи: на основе видеоданных определять, какая стратегия управления автомобилем эффективна и безопасна, и подсказывать, как правильно использовать механизмы ускорения и замедления. Все сводилось к задаче использования машинного и глубокого обучения для обработки сценариев компьютерного зрения.

Линейный и V-метод изучения чего-либо

На старте изучения новой области часто бывает трудно понять, с какой стороны к ней подойти. В итоге большинство начинают с основ, чтобы обеспечить себя базовыми знаниями, а затем перейти к более глубокому изучению предмета. В этом и заключается линейный метод обучения.

Чтобы использовать такой метод для создания беспилотного автомобиля, придётся изучить:

  • Функции нескольких переменных.
  • Линейную алгебру.
  • Основы информатики.
  • Общие концепции машинного обучения​.
  • Концепции компьютерного зрения.
  • Основы программирования на Python (включая использование библиотеки TensorFlow).

Метод выглядит неэффективным. Не ясно, где та грань, когда знаний в определенной области становится достаточно, нет способа расставить приоритеты, это обучение «на всякий случай». Кроме того, способ абстрактен — отсутствует возможность эффективного практического применения полученных знаний. Так что этот метод не подходит для обучения чему-либо в сжатые сроки.

Дейч предложил вместо этого использовать V-метод, при котором обучение начинается с разбора конкретного, хорошо задокументированного примера. Любые непонятные термины и теории изучаются по мере их появления. На основе полученных знаний воспроизводится новый пример.

Отсюда вытекает и название метода: начало обучения — высокий уровень детализации, потом идет спуск к основополагающим концепциям, затем возврат к верхнему уровню. V-метод превосходит линейный тем, что порядок обучения здесь зависит от конкретной цели, основы сопровождаются практическими примерами, выстраивается иерархия знаний.

Первая неделя

Цель первой недели — запустить на компьютере код, который может быть использован для беспилотного автомобиля. Код, найденный Дейчем, брал для обработки изображение дорожного полотна и делил его на полосы движения.

Оставалось запустить его на собственном ПК. Для этого нужно было убедиться, что все необходимые библиотеки подключены, в частности, библиотеки Numpy, Matplotlib и OpenCV для Python.

a557ca5e02d27f.png

Когда в коде появлялась ошибка, автор использовал «самую эффективную» технику отладки — вводил текст сообщения об ошибке в Google. Через некоторое время, которое ушло на попытки сохранить изображение, генерируемое на выходе, программа стала показывать результаты.

1b41f9d7b84d8b.jpg

Когда программа начала правильно идентифицировать границы полос, оставалось только научить автомобиль двигаться по ним.

Принцип работы программы

Программа включала в себя следующую последовательность обработки изображений:

  • ​Получение входного изображения.
  • Преобразование в изображение в оттенках серого.
  • Применение фильтра размытия по Гауссу.
  • Распознавание граней.
  • Наложение маски.
  • Преобразование Хафа.

Входное изображение

Изображение — это набор пикселей. Значение каждого пикселя — сочетание красного, зеленого и синего цветов, и каждый цвет может принимать значение от 0 до 255 (соответственная интенсивность — 0% и 100%). Например, белый цвет будет выглядеть как (255, 255, 255), а черный как (0, 0, 0). То есть входное изображение размером в 960×540 пикселей задается 518 400 тройками чисел.

ca36edc32920d6.png

Изображение в оттенках серого

При преобразовании цветного изображения в оттенки серого цветовое пространство понижалось до одного измерения вместо трех. Таким изображением можно управлять эффективнее.

Ожидалось, что преобразованием занималась обыкновенная функция, усредняющая числовые значения цвета. Но этот метод в итоге давал несколько отличный от нужного серый цвет, поскольку брал средневзвешенные значения, не учитывая то, каким образом глаза реагируют на цвет.

Решением стал специальный метод colometric, который преобразует цветовую гамму с нужными коэффициентами.

7e0fb4bc5f5f15.png

Фильтр размытия по Гауссу

При применении размытия из изображения удалялся шум, что позволяло эффективнее анализировать входные данные. Фактически размытие — это присваивание близлежащим пикселям усредненного значения. Причем чем ближе друг к другу находятся пиксели, тем сильнее они уравновешивают друг друга.

Распознавание граней

Гранью считается область изображения, где поблизости находятся контрастные пиксели. Чем больше разница в цветовых значениях (то есть чем выше контраст), тем более высокую значимость будет иметь грань. Грани с незначительными цветовыми перепадами отсекались, чтобы изображение не заполнялось «мусором».

811c8e272c79df.png

Наложение маски

Метод удалял те части фотографии, которые не представляют информационной ценности для программы.

c53fec80c36f0f.png

Преобразование Хафа

Численный метод, позволяющий извлечь элементы из изображения. Шаг был нужен для того, чтобы вывести уравнение полосы движения, которую распознает программа. Иначе говоря, метод сводился к поиску коэффициентов W и b в уравнении y = Wx + b, для удобства представляемых в параметрическом виде.

В итоге программа выводила два набора значений: параметры, позволяющие описать через уравнение полосы движения, и координаты конечных точек каждой из них. Например, Коэффициент 1: -0.740605727717; Коэффициент 2: 664.075746144, Пункт 1: (475, 311). Пункт 2: (960, 599).

Для создания ПО беспилотного автомобиля необходимо было научиться интерпретировать входное изображение и на его основе передать параметры, позволяющие рассчитать угол поворота и ускорение. Поскольку второй шаг с каждым днем совершенствовался, предварительная обработка изображений отходила на второй план. На тот момент главной задачей было научить машину «рулить».

Сервис с онлайн-курсами по техническим темам Udacity опубликовал в открытом доступе проект, где данные видеорегистратора были разложены на кадры, в каждом из которых фиксировался угол поворота, совершаемого водителем. Данные идеально подходили для тестирования функции, отвечающей за поворот автомобиля.

9dbc59e7f5b544.png

Для усовершенствования функции Дейч обратился к GitHub, но попытка настроить необходимые библиотеки привела к сбою в компьютере.

Вторая неделя

В процессе была найдена научная статья, написанная учеными из Nvidia, о системе, которая может отображать необработанные пиксели с фронтальной камеры непосредственно в управляющие команды и реализацию системы на GitHub.

После нескольких попыток программа была обучена, погрешности в определении угла поворота сведены к минимуму. То есть формально программа была готова к работе, не считая погрешностей в визуализации.

Код стал работать без перебоев, когда визуализация была отключена. При этом данные считывались верно, но оценить это было довольно трудно. Решением проблемы стало удаление отдельных кадров входного видео и прогнозируемой анимации руля.

Основные задачи на тот момент — понять механику работы кода и разобраться, как входное изображение преобразуется в инструкции по управлению автомобилем. В коде всего 50 строк с пробелами и комментариями.

По мере разбора появляющихся вопросов автор понял, что не обязательно понимать базовые понятия в математике и информатике с прикладной точки зрения. Важно понимать принципы работы нейронных сетей, в данном случае — какие манипуляции с изображением и математические расчеты позволят ускорить обучение.

Тем не менее методом «угадать и проверить» можно спроектировать автомобиль, автономный на 98%. Чтобы добиться 100%, нужно разбираться в вопросе гораздо лучше. Практическая реализация всех этих «базовых компонентов» сложнее, но библиотека TensorFlow существенно облегчает задачу.

Дейч допустил, что через полтора-два года уровень абстракции будет таким, что код управления беспилотным автомобилем будет состоять из одной строки.

Следующий шаг в разработке кода — обучить автомобиль двигаться по любым дорогам, а не только по тем, которые ему известны. Производительность программы на новом наборе дорог была очень низкой, в реальной жизни автомобиль разбился бы почти сразу. Модель, прошедшая обучение по набору данных Nvidia, не подходила для набора данных Udacity. Разные видео отличались углом обзора, кадрированием и искажением объектива.

6fce1f9d5431ee.png
Кадр из набора данных NVIDIA
b57fea0b69ce6c.png
Кадр из набора данных Udacity

Оказалось, что нельзя использовать одну модель для интерпретации разных данных. Необходимо обучить автомобиль на основе данных Udacity, а затем посмотреть, как модель работает при тестировании данных Nvidia. Их объем при этом должен быть четко регламентирован.

Третья неделя

На дорогах уже встречались беспилотные автомобили, в частности, Uber, которые на тот момент управлялись водителями (видимо, в целях обучения), и Google, которые передвигались самостоятельно. Программное обеспечение, контролирующее автомобили, было аналогом программы Дейча.

Набор данных Udacity, найденный для тестирования, включал 33 тысячи кадров вождения, сделанных с трех разных углов, а также все данные для рулевого управления, торможения, GPS и так далее — что более чем достаточно для повышения функциональности автомобиля.

При тренировке самодельной модели, основанной на большом наборе данных Udacity, погрешность за несколько часов с 6,14783 уменьшилась до 0,000377398. Другими словами, при увеличении набора данных в семь раз, погрешность уменьшалась в 2,5 тысячи раз. Именно поэтому беспилотник Google так эффективен — в его распоряжении огромное количество данных (поиск, электронная почта, фотографии, видео на YouTube).

e902efd5b95c17.png
Прежнее уменьшение погрешности при увеличении набора данных
606f7530314796.png
Новое уменьшение погрешности при увеличении набора данных

Попытка представить результат использования программы в условиях реального вождения была удачной: программа справилась с незнакомым набором данных — дорогами из новой местности. Во время тестирования сценарий визуализировал образы рулевого колеса, повернутые на основе прогнозируемого угла поворота.

Чтобы закончить проект, необходимо было построить систему для управления педалями автомобиля. Оказалось, что дописывать код для этого не нужно.

Модель управления строилась на следующих шагах:

  1. ​Ввод изображений.
  2. Присвоение изображению числового значения.
  3. Соотношение пикселей и полученных значений.
  4. Прогнозирование на его основе числового значения будущего изображения.

Таким образом, для создания педальной системы необходимо было присвоить каждому изображению числовое значение, соответствующее, например, величине торможения, а затем дать компьютеру возможность определить соотношение между пикселями и числовыми значениями.

Как и ожидал автор, модель со временем научилась уменьшать погрешности и определяла эффективный способ предсказать величину торможения. Универсальность, которая позволяла заменить торможение на положение дроссельной заслонки или угол поворота, говорила о том, что технология машинного обучения дошла до такой степени развития, что больше не было необходимости создавать узкоспециализированные модели для каждого приложения. Одна модель будет достаточно расширяема.

18 месяцев назад агентство Bloomberg опубликовало видеоролик о 26-летнем Джордже Хотце, который построил в своем гараже беспилотный автомобиль. В видео он объяснял, что для создания автомобиля нужны две вещи: система, выводящая управляющие команды на основе входных данных, и система, которая могла бы управлять физическими приводами автомобиля на основе цифровых входов.

Для контроля физических приводов Хотц подключал компьютер к порту отладки автомобиля. Таким образом он смог показать всем, что полностью беспилотный автомобиль доступен для разработки не только для таких компаний, как Google, но и для любителей.

Четвертая неделя

«В феврале 2017 года автор начал свой проект. Если бы это было в феврале 2020 года, никому бы не было до него дела. В декабре 2016 года он научился продумывать реалистичные сценарии. Если бы это было в декабре 2036 года, это не имело бы никакого значения. В мае 2017 года была создана программная часть беспилотного автомобиля. Если бы это было в мае 2020 года, эта проблема была бы совершенно иной, — пишет Дейч. — Передовые навыки устаревают, приоритеты и задачи меняются. Возможно, вся вышеописанная история спустя три года превратится в одну строку кода».

Проект беспилотного автомобиля был основан на чужом исходном коде, который в свою очередь был основан на документе, написанном независимой автомобильной исследовательской группой Nvidia. Сама модель была основана на математических методах, которые были изобретены вне лаборатории Nvidia.

Эти математические методы построены на основе фундаментальных идей исчисления, которые были изобретены сотни лет назад. Код, который запускал Макс Дейч, был построен поверх библиотеки машинного обучения, созданной Google, которая строилась поверх высокоуровневого языка программирования, придуманного гораздо раньше. Так что это работа многих людей, объединенная в одном проекте.

«MIT опубликовала ежегодные исследования, посвященные текущему состоянию интереса потребителей к беспилотным автомобилям, и 48% из трёх тысяч участников исследования сказали, что они никогда не приобретут автомобиль, который полностью управляет собой. Это можно понять. Но общество уже доверяет свою жизнь водителям из Uber и Lyft, так что чем хуже беспилотные автомобили?».

©  vc.ru