Pull to refresh

Comments 39

Не очень понятно мне вот это:


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

В сочетании с вот этим:


Итак, в автономных машинах есть очень модный подход — Behavioral Cloning, суть которого заключается в том, что компьютер учится вести себя как человек (за рулем), опираясь только на записанные входные и выходные данные. Грубо говоря, есть база картинок с камеры и соотвествующий им угол поворота руля. В теории, обучив на этих данных нейросеть, мы можем дать ей порулить машиной.

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

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

Не пробовали оценить насколько данный подход по времени был выгоден/невыгоден по сравнению с алгоритмическим подходом к решению данной задачи?

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

ОК, но разве эта задача уже не решена другими? Я имею ввиду, что нельзя взять какую-то готовую распознавалку, которая уже обучена распознавать дорогу, подцепить к вашей камере на ровере и получить результат?
Я видел десятки человек, натаскивающие нейросети именно на это — выделяющие маркерами дороги, обочины, автомобили. Разве результат их работы закрыт/недоступен?

В прямо готовом виде я не встречал пока. Может быть плохо искал.
Вот это — «выделяющие маркерами дороги, обочины, автомобили» — как правило учебные задания, выделяющие части картинки по цвету.
В учебных картинках все получается хорошо, в реальной жизни не так гладко.
Мне приходило в голову попробовать выделить дорогу посредством сегментирования, но это тема для отдельной статьи.
Вот это — «выделяющие маркерами дороги, обочины, автомобили» — как правило учебные задания, выделяющие части картинки по цвету.

Да нет, они работали на автомобильные фирмы целыми месяцами.


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


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

>>Собственно, вы наверное слишком сложную задачу хотели решить
да, конечно, по линиям гораздо проще ориентироваться через Computer Vision.
Я обучал нейросеть на комнатных данных из
предыдущей статьи, она показывала приемлемые результаты на цветных картинках, но на роботе я ее не запускал.
Все упирается в задачу распознавания дороги, она технически гораздо сложнее, чем принятие решений на основе нейросети и зависит от условий.

На самом деле, нет.
Если у вас была приличная база неразмеченных картинок, то разметить пару десятков кадров, а потом обучить Unet с псевдолейблингом до приемлемой точности — это решаемая задача.
Я пробовал скармливать в нейросеть цветные картинки (уменьшенные и размытые), но она не ловила закономерности.
Бегло почитал статью про Unet, сложилось впечатление что под сегментацией они понимают то, что в OpenCV называется нахождением контуров.
Под сегментацией «они» подразумевают то, что называется задачей семантической сегментации.
Удивительно, что вы пишете про автономную езду, не зная про стандартные виды задач CV, которые повсеместно используются в этом домене.
Сегментация — очень интересная тема, но для задачи руления она не первостепенна.
Вы не поверите. Self-driving cars — это тот домен, который крайне активно драйвит развитие сегментации (особенно в контексте видео).
Спасибо за информацию, буду смотреть в этом направлении тоже.
Не пробовали запускать сеть через OpenCV?
Что вы имеете в виду? Распознать дорогу какой то уже обученной сетью?
Я понимаю. Но какую задачу решать с помощью нейросети в контексте статьи?
Сама возможность использовать готовую нейросеть в OpenCV конечно есть, в самой первой своей статье я так делал, чтобы детектировать предметы в комнате.
Не устанавливать TensorFlow на Raspberry Pi и, возможно, получить больше кадров в секунду с OpenCV?
Tensorflow может читать сети, обученные в Керасе, а это самый быстрый и простой способ. OpenCV понимает не все форматы и с этим надо разбираться. Я этого не делал, так как проблема производительности пока не стоит на первом месте.
подскажите, а зачем здесь вообще нейросеть? нельзя ли просто line-following реализовать на opencv?

Чтобы сделать line following, нужно выделить полотно дороги сначала. А зачем потом выделять из дороги линию, когда можно всю дорогу скормить в нейросеть?

Я немного не о том. Почему нельзя в HSV выделить дорогу и определить ее как линию вместо 2-х месячного обучения нейросети?
В пишите про Raspbian Stretch, a репы содержат Jessie ( Есть репы под статью, чтобы не собирать все под Stretch?
На raspberry pi 3b ездите?
*Поставьте на танк металлические траки, пластик скользит и изнашивается быстрее.м Есть на ali.
Не так просто выделить HSV дорогу и формализовать ее правую кромку (на основании которой и принимаются решения). Кромка получается довольно нечеткой, аппроксимирующий ее вектор — иногда изрядно кривым. Поэтому я переложил этот головняк на нейросеть.
Вот же лежит OpenCV под Stretch рядом:
github.com/tprlab/pi-opencv/blob/master/opencv_4_0_0_raspbian_9_stretch.deb
Да, 3b.
а нет у вас image, чтобы сразу залить на SD?
Кстати, прикупил себе Movidius, но пока не преуспел запустить на нем сегментацию. Та сеть, что идет в OpenVino, сегментирует что-то не то, а уже существующие не очень перевариваются Model Optimizer.
Не порекомендуете проверенную модель для 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.
Отправил в гугл драйв, сообщу вам в личку как зальется.
Если правильно понимаю, то 1 запуск train.py дает model.h5 и model.json на диске.
Далее: python check-nn.py «любая картинка из train/data».jpg.
Итог: Prediction[0].
С другой картинкой: Prediction[1].
Как интерпретировать результат? «1» — что-то нашло?
Сколько раз надо запустить train.py? (т.е. станет ли модель лучше после многократных запусков?)

>>Как интерпретировать результат? «1» — что-то нашло?
0, 1, 2 = left, right, straight
>>Сколько раз надо запустить train.py? (т.е. станет ли модель лучше после многократных >>запусков?)
Это сложный вопрос, погуглите «how many epochs to train nn».
В итоге оказалось, что простейшая нейросеть из любого туториала про multi-category classification дает вполне приемлемые результаты.

Не к столу будет сказано, но у вас используется не простейшая нейросеть и сверточная, а точнее двумерная сверточная сеть (так называемая LeNet).
Об этом говорит использование в коде Conv2D и MaxPooling2D.
Эта информация не для того, чтобы поиграть терминами, а к тому, что простейшая сеть дает гораздо более низкий результат распознавания при малом количестве обучающего датасета. А он у вас крайне мал: около 300 экземпляров (по 100 для влево, прямо и вправо). Для сравнения MNIST — 50000 экземляров.
Так вот, при уменьшении обучающего набора простейшая сеть дает совсем плохие результаты, а сверточная держится дольше. Делались замеры для MNIST при 300 экз. обучающего набора. Простейшая сеть — 42%, а сверточная — 72,4%.
Поэтому ваш танк до сих пор ездит, используя сверточную сеть.
Вы называете «простейшей» полносвязную, а автор — простую архитектуру сверточной, потому что в 2019 году сверточные сети — настолько дефолт для визуальных данных, что никто даже не думает о применении полносвязной.
Возможно, вы правы.
По поводу полносвязной сети, не стоит так обнулять ее результаты.
Давеча, капчу ломали полносвязной, так что еще потенциал есть.
Для упрощения работы с тысячами картинок подойдет такой вариант. Есть такой фреймворк (так его назовем) для raspberry Rpi-webcam-interface, готовый образ. Там помимо прочего можно запустить timelapse и далее просто пронести танк в руках вдоль линии для влево, вправо и прямо. Картинок не будет так много и их наверняка не придется разбирать (если вы только падать не будете с танком). В принципе, timelapse можно и не используя вышеуказанное запустить. Кроме того, не обязательно в сеть скармливать именно 64x64 px картинки. Они у вас как солдаты все одного размера. Их можно резать автоматом до нужных размеров, а те, что не режутся выкидывать:
try:
      image = cv2.resize(image, (64, 64)).flatten()
except:
      continue
Sign up to leave a comment.

Articles