Comments 39
Не очень понятно мне вот это:
Сбор и подготовка данных — нуднейшая задача, на это ушла пара месяцев.
В сочетании с вот этим:
Итак, в автономных машинах есть очень модный подход — Behavioral Cloning, суть которого заключается в том, что компьютер учится вести себя как человек (за рулем), опираясь только на записанные входные и выходные данные. Грубо говоря, есть база картинок с камеры и соотвествующий им угол поворота руля. В теории, обучив на этих данных нейросеть, мы можем дать ей порулить машиной.
Я думал, что сбор и подготовка данных должны просто заключаться в том, что вы будете ездить по парку и записывать видео с камеры в сочетании с сигналами от джойстика. А все остальное — это чисто работа компьютера без вашего участия.
Надо проверить как на них распознается дорога. И разложить их по категориям — право, лево, прямо. На все это очень много времени уходит.
Т.е. это ручной труд?
Не пробовали оценить насколько данный подход по времени был выгоден/невыгоден по сравнению с алгоритмическим подходом к решению данной задачи?
Т.е чтобы подготовить данные для нейросети, нужно сначала подобрать параметры распознавания дороги для данной местности и уровня освещенности.
Все упирается в задачу распознавания дороги, она технически гораздо сложнее,
ОК, но разве эта задача уже не решена другими? Я имею ввиду, что нельзя взять какую-то готовую распознавалку, которая уже обучена распознавать дорогу, подцепить к вашей камере на ровере и получить результат?
Я видел десятки человек, натаскивающие нейросети именно на это — выделяющие маркерами дороги, обочины, автомобили. Разве результат их работы закрыт/недоступен?
Вот это — «выделяющие маркерами дороги, обочины, автомобили» — как правило учебные задания, выделяющие части картинки по цвету.
В учебных картинках все получается хорошо, в реальной жизни не так гладко.
Мне приходило в голову попробовать выделить дорогу посредством сегментирования, но это тема для отдельной статьи.
Вот это — «выделяющие маркерами дороги, обочины, автомобили» — как правило учебные задания, выделяющие части картинки по цвету.
Да нет, они работали на автомобильные фирмы целыми месяцами.
Собственно, вы наверное слишком сложную задачу хотели решить — научить вездеход ездить без линий разметки. А в реальности автомобили все же на нее ориентируется.
Попробуйте упростить эксперимент — на той же парковой дороге нарисовать маркером или мелом линии разметки, чтобы камера с робота показывала примерно то же самое, что видит обычный автомобиль. А потом применить готовую нейросеть, уже обученную на это. Сработает?
да, конечно, по линиям гораздо проще ориентироваться через Computer Vision.
Я обучал нейросеть на комнатных данных из
предыдущей статьи, она показывала приемлемые результаты на цветных картинках, но на роботе я ее не запускал.
Все упирается в задачу распознавания дороги, она технически гораздо сложнее, чем принятие решений на основе нейросети и зависит от условий.
На самом деле, нет.
Если у вас была приличная база неразмеченных картинок, то разметить пару десятков кадров, а потом обучить Unet с псевдолейблингом до приемлемой точности — это решаемая задача.
Бегло почитал статью про Unet, сложилось впечатление что под сегментацией они понимают то, что в OpenCV называется нахождением контуров.
Удивительно, что вы пишете про автономную езду, не зная про стандартные виды задач CV, которые повсеместно используются в этом домене.
Сама возможность использовать готовую нейросеть в OpenCV конечно есть, в самой первой своей статье я так делал, чтобы детектировать предметы в комнате.
Чтобы сделать line following, нужно выделить полотно дороги сначала. А зачем потом выделять из дороги линию, когда можно всю дорогу скормить в нейросеть?
В пишите про Raspbian Stretch, a репы содержат Jessie ( Есть репы под статью, чтобы не собирать все под Stretch?
На raspberry pi 3b ездите?
*Поставьте на танк металлические траки, пластик скользит и изнашивается быстрее.м Есть на ali.
Вот же лежит OpenCV под Stretch рядом:
github.com/tprlab/pi-opencv/blob/master/opencv_4_0_0_raspbian_9_stretch.deb
Да, 3b.
Есть пакет OpenVINO тулкита (внутри и OpenCV и движок для Movidius стиков): https://download.01.org/opencv/2019/openvinotoolkit/R1/l_openvino_toolkit_raspbi_p_2019.1.094.tgz
Не порекомендуете проверенную модель для NCS?
Попробуйте прямо оригинальную модель загрузить в OpenCV и выставить net.setPreferableTarget(DNN_TARGET_MYRIAD), если не заведется — пришлите пожалуйста модель, чтобы можно было попробовать.
Модель из OpenVino — road-segmentation-adas-0001 — сегментирует с ошибками, хуже чем эта модель:
github.com/e-lab/ENet-training/releases/download/v1.cs/model-cityscapes.net.
Но эта модель сделана в старом luatorch, она поддерживается OpenCV-DNN, но не Model Optimizer'ом. Не вижу возможности перекинуть ее на NCS.
Далее: python check-nn.py «любая картинка из train/data».jpg.
Итог: Prediction[0].
С другой картинкой: Prediction[1].
Как интерпретировать результат? «1» — что-то нашло?
Сколько раз надо запустить train.py? (т.е. станет ли модель лучше после многократных запусков?)
В итоге оказалось, что простейшая нейросеть из любого туториала про multi-category classification дает вполне приемлемые результаты.
Не к столу будет сказано, но у вас используется не простейшая нейросеть и сверточная, а точнее двумерная сверточная сеть (так называемая LeNet).
Об этом говорит использование в коде Conv2D и MaxPooling2D.
Эта информация не для того, чтобы поиграть терминами, а к тому, что простейшая сеть дает гораздо более низкий результат распознавания при малом количестве обучающего датасета. А он у вас крайне мал: около 300 экземпляров (по 100 для влево, прямо и вправо). Для сравнения MNIST — 50000 экземляров.
Так вот, при уменьшении обучающего набора простейшая сеть дает совсем плохие результаты, а сверточная держится дольше. Делались замеры для MNIST при 300 экз. обучающего набора. Простейшая сеть — 42%, а сверточная — 72,4%.
Поэтому ваш танк до сих пор ездит, используя сверточную сеть.
try:
image = cv2.resize(image, (64, 64)).flatten()
except:
continue
Автономная езда по тротуару посредством OpenCV и Tensorflow