Pull to refresh

Comments 52

Я достаточно далек от нейронных сете, но все же:
Что показывает синий график? Ошибку? А как изменяется синий график при сведении и разведении моста?
Может быть применив какую-либо фильтрацию удастся определить, что мост начал сводиться или разводиться? Это частично позволит решить проблему глюков видеокамеры. Ведь зная предыдущее состояние моста (а если синий график зеркально отражается относительно вертикальной оси при сведении/разведении моста то можно и без этого) и текущее направление движения, а так же среднее время сведения моста + запас можно с 90% предсказать текущее положение (открыт или закрыт)
Синий график показывает вероятность третьего класса «мост в движении». Потом я отказался от данного класса, т.к. в интерфейсе его всё равно не существует. Мусор с камеры оказалось проще всего отслеживать по баннеру, т.к. обычно мусор связан с развалившимся видеопотоком.
По-честному ещё стоит, конечно, отслеживать, что камеру не повернули, и что она смотрит в тот же ракурс, на котором бот обучался.

Вопрос про запас и вероятность я не понял. Глюки видеокамеры обычно выражаются либо в нескольких мусорных кадрах либо в полной её недоступности.
Очень интересный пост.
У меня пара вопросов:
1. Информационный робот всё время работал на вашем ноутбуке? Не было желания перенести его на выделенный сервер?
2. Видно ли мост Александра Невского на фоне неба? Просто фото на «веб-мордочке» довольно мыльное, я мост не сразу нашел, чего уж про робота говорить)
1. Нет, на linode живёт робот, который пишет в канал, на ноутбуке жила только часть подготовки данных. Сбор данных жил, конечно, на кусочке отдельной железки с достаточным местом на диске, но и там пришлось думать о том, чтоб весь диск не забить видеопотоком :-)
2. Плохо, но обычно видно. Если очень интерено, могу поделиться датасетом.
2. Если нет желания смотреть датасет, то качество на мосту Александра Невского можно посмотреть ещё в истории Telegram канала.
Очень интересная статья, спасибо!

Я тоже далёк от нейронных сетей, поэтому интересно — не будет ли эффективнее не «изучать» картинку как таковую, а сличать картинки в периоде 1-3-5-10 минут (или сколько там уходит на сведение моста) и определять что-то вроде «на протяжении нескольких часов картинка была одна, а сейчас произошло изменение, скорее всего, мост свели»?
Изменение яркости по времени суток, по погоде, дождь, туман, ветер, фонари, засвет, блики, автотранспорт, птицы. Картинка вряд ли будет статичной долгий период времени.
Всё что надо — это определить это дерево контуров, описывающих «изображение похожее на мост». Далее определить соответствующее множество сопряженности векторов относящихся к «изображению похожему на мост».
Про яркость у меня есть смешная картинка «Рассвет над мостом Александра Невского». Когда я разбирался с качеством камеры, которая смотрела на этот мост, я заметил, что она имеет два режима: ночной и дневной. Эти два режима хорошо видны на следующей картинке:

Я взял RGB значения цвета неба над мостом в разные моменты времени за всю ночь и нарисовал их точками на диаграмме. Хорошо видно, что цвет неба имеет разрыв — в какой-то момент он меняется скачком. Кажется, этот момент соответствует выключению городского освещения :-)
Безотносительно распознавания изображений: мосты сводят раньше при окончании фактической навигации, т.е. когда все суда, которые хотели пройти, прошли. Переговоры между судами и диспетчерами мостов ведутся по радиоканалу. Я сейчас не вспомню на какой частоте, но можно купить «речную» рацию и слушать на одном из первых каналов (опять же, точно не помню, но скорее всего 2, 3 или 5 канал). Последнее судно сообщает, что оно было последним и мост можно сводить.
Возможно, оперативную информацию можно узнавать в Мостотресте. К середине дня они уже должны представлять сколько судов пойдет ночью.
Да, в Мостотресте по телефону теоретически что-то можно узнать. По крайней мере на сайте телефон есть.
С рацией есть тонкость — если мосты не разводят из-за непогоды, то бот об этом может принять решение и сказать, «что-то мост не развели по расписанию», а в радиоэфире будет, наверное, тишина.
Вместо размывания по Гауссу, я бы применил Median.
Гаусс лежал готовый в коробке и оказался достаточно хорош :-)
Я хотел сказать, что Гаусс в коробке с `feature.canny`. А из-за каких свойств взяли бы именно median?
Очень просто: Гаусс размывает всё подряд, а Median давит мелкий мусор, пытаясь оставлять имеющиеся четкие переходы (местами, правда, он их сам дорисовывает).
Чувствую, что камера познала Хабраэффект… Жаль парамедиков(а точнее людей, которых никто, возможно, не спасёт), снова остались без инфы

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

Технологии крутые, но применение скорее как хороший пример
На мой взгяд проще разведенность моста отслеживать по наличию и отсутствию потока машин — к слову машина дает перемещающуюся яркую точку — а движущиеся объекты могут быть отслежены без применения ненйронных сетей
А если потока машин нет и мост не разведен и мчится кораблик? Страшно если ваше предложение используют.
см ответ ниже (а также, между прочим, как ни странно, поток через питерские мосты всегда есть, особенно в предразводное время )
сомнительное утверждение. Особенно после сведения, особенно, если свели раньше срока. Проедет пара машин которые ждут и все.
Практически это мне кажется более сложной задачей, т.к. надо смотреть на динамику изображений и анализировать, наверное, каждый кадр (а не каждый 50-ый). Если есть интерес, могу предложить неразмеченный датасет с видео Литейного моста, там как раз камера смотрит на участок дороги сбоку, а разводной секции не видно.
Во-первых, я уже делал один проект про опасное сближение автомобилей (фиксация видеорегистратором) — поэтому в теме
Во-вторых при заданной камере движение объектов задано по кадру (кораблики по мосту не едут)
В-третьих, задача фиксация движения давно решена в системах безапасности — на всякий случай даю ссылку http://www.codeproject.com/Articles/10248/Motion-Detection-Algorithms
> я уже делал один проект про опасное сближение автомобилей
Вот поэтому вы и предлагаете нелепый вариант, про обнаружение автомобилей, т.к. вы это уже делали.

Однако это выглядит нелогичным и ненужным усложнением. Определение по картинке — поднят ли мост, или опущен выглядит гораздо проще, чем определение — есть ли автомобили, и автомобили ли это. Тем более, машин может не быть ВООБЩЕ, а мост стоять (особенно, в предразводное время, т.к. все кому надо уже проехали, остались те, кто рассчитывает на авось).
Так и напрашивается об'единение этих двух методов. Ибо, толку мне от того, что мост сведён, если его через 10 минут разводить будут и уже входы/выходы заблокированы. Или же мост полностью перекрыт, но сведён (как было, когда его ремонтировали).
если его через 10 минут разводить будут

Обычно въезд на мост закрывают аккурат по расписанию. Польза робота только в ночной сводке.


перекрыт, но сведён (как было, когда его ремонтировали)

Об этом обычно есть оперативные данные, которые навигаторы публикуют. Вот, например, сейчас ремонтируют Тучков мост и на мосту в Яндекс.Картах нарисовано одностороннее движение:


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

Да, обещали развести с 11-30 до 13-30. В 11-30 и развели, но где-то в 12-40 уже начали сводить, а потом камера выключилась.

Так ведь задача сводится к определению — раздвинут ли мост, или сдвинут, а не заблокированы ли входы/выходы. Для этого, естественно, нужно иметь камеру в другом месте и решать задачку посложнее.
Я ни с одним из этих утверждений не спорил. Более того, именно так я и планировал решать задачу с Литейным мостом, если не получится найти более пристойного источника данных, чем следы от стоп-сигналов :)

Со следами от стоп-сигналов вот ещё какая беда есть: если машина ошибается (а я не слишком высокого мнения о своих умениях в задачах распознавания), то по контуру моста человек может перепроверить машину. По следам стоп-сигналов это сложнее.
Очень интересная статья и красиво подобранный материал. Сразу вспомнил как с друзьями составляли карту открытия и закрытия движения по мостам для максимально быстрого «объезда» ночью по максимальному количеству.

В статье, там примерно четыре строчки кода :-) Вся содержательная часть — это преобразование картинки в вектор фич, которыми потом кормится классификатор с дефолтными параметрами. Но несложно продублировать:


def load_dvorcovy_vpiter_admiral(fname):
    feat = feature.canny(color.rgb2gray(io.imread(fname)[40:360, 110:630]), sigma=2)
    feat = transform.downscale_local_mean(feat, (20, 20))
    assert feat.shape == (16, 26)
    return feat.reshape((np.prod(feat.shape), ))
  • А всё-таки хотелось бы увидеть какие-нибудь циферки, оценивающие точность модели. LogLoss, accuracy, ROC_AUC, и т. д,
  • Если поделитесь размеченными изображениями(больше — лучше) готов поиграться со свёрточными сетями, и рассказать, что из них для этой задачи можно получить.(ну и код, понятно, выложить)
Автор указал, что у него «на всяких разных метриках» (подозреваю, что precision) получается 0,99. Картинка статичная и на самом деле остальные метрики не очень то нужны.

Интересно поиграться с нейронными сетями было бы в случае, если была бы размеченная база из многих мостов (желательно с разными конфигурациями). Но при этом не забывайте, что один из немногих плюсов свёрточных нейросетей для компьютерного зрения — это устойчивость к translation, rotation и shifting. Если у вас примерно одинаковые картинки с примерно одинакового ракурса — нет особенного смысла их использовать.
С Дворцовым мостом всё было ровно так, как я написал, первая же попытка дала пристойный классификатор, который показывал 0.99+ по F-мере. Там выборка была не сбалансированная, собранная за рабочую неделю и у меня, если честно, она уже потерялась. :-)

С мостом Александра Невского с наскоку не получилось, там качество картинки на голову хуже. Там я составлял выборку следующим образом: захватывал видеопоток с 0:00 до 8:00, нарезал его на блоки по 5 минут, размечал блоки на UP/DOWN/MOV, где в MOV попадали два блока соответствующие началу и концу движения моста. Проще говоря, факт разводки порождал такую последовательность блоков …, down, down, down, mov, mov, up, up, up, …. После этого из всех блоков одного класса я брал ~1000 кадров за кажду ночь и превращал их в фичи.
Качество оценивал разделяя выборку по времени, первые 20 дней в train, 5 в test и 5 в валидационную выборку. По валидации настраивал кроп. Полагаю, разный кроп даёт заметно разные результаты, т.к. рядом с мостом стоит фонарь, который светит прямо в камеру, и из-за этого пороги у `canny` могут получаться бестолковые. Наверное, вместо кропа можно было точно так же пороги подбирать. Когда делал кросс-валидацию по дням, оценка качества получалась завышенной. С одной стороны это понятно (мы учимся на данных «из будущего»), с другой — не очень (чем данные «из будущего» отличаются-то). Этот процесс тоже дал F-меру 0.99+.

Блоки mov я для обучения текущей модели не использовал, а использовал их только для рисования графика «процесс разводки глазами классификатора», чтоб визуально оценить скорость реакции модели на изменение моста. По этому графику я настраивал размер «кворума». Робот отсылает сообщение в telegram только тогда, когда в последних N кадрах было больше двух третей голосов за одно из двух состояний. Этим действием я сглаживал возможный шум в момент переходного процесса — спамящий о своей неуверенности робот мне довольно быстро показался весьма неприятным.

Про датасеты. Размеченных руками у меня сейчас только 3 Gb jpeg-ов Александра Невского, с 2016-06-19 по 2016-07-24. Можно породить ещё разметку классификатором для Ал.Не. и Дворцового за последние две недели, там flv-шки и их сильно больше: 28G с Дворвоцого и 53G с Александра Невского. Есть ещё поворотная камера, которая смотрит на мост лейтенанта Шмидта (две задачи по цене одной — понять, что сейчас на камере нужный мост и понять его состояние) и Литейный, по которому машины ездят, а разводной секци не видно. Что из этого интересно?
Лучше всего и побольше. :) Вы выложите, что есть размеченного на данный момент. 3GB jpeg-ов о мосте Александра Невского — с этим однозначно можно работать.
Так у вас тут статичная картинка, зачем вам тут вообще машинное обучение? На вашем питоне у вас за 10 минут бы получился отличный rule-based с 100% точностью.
Чтобы не тратить время на составление правил :-)
Машины должны работать. Люди должны думать.

Есть мнение, что применив skimage.feature.canny, вы уже сделали за машину большую часть работы)

Может как-то брать инфу у кораблей стоящих на рейде в Рыбацком. По рации или ещё как?
UFO landed and left these words here
Спасибо за информацию, я vpiter.tv в коде для читаемости оставлял, ещё думал, почему же в вёрстке IP-адрес напрямую зашит.

Кстати, нет планов у вас робота моего забанить по какой-либо причине? :-) Я писал о нём на info at vpiter.com, но ответа там никакого не получил, и решил, «если баннер не вырезать и ссылку оставить, то, наверное, пока ок, а там видно будет».
UFO landed and left these words here
Хорошая статья.
И главное — хорошая демонстрация — быстро разработанному «на коленке» вполне себе нормальному сервису… который возможно будет жить не один год и приносить реальную помощь людям.

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

image
стильно, модно, молодёжно

Так речь как раз о том, что можно обойтись простейшей линейной моделью, которая "нейронная сеть" лишь формально (один нейрон).


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

Я о таком слове попросту не знал, никогда не занимался обработкой изображений, в этом и был посыл статьи — можно сделать ненулевую пользу почти не разбираясь, абсолютно "на коленке" :-)


Но да, когда прикручивал мост Александра Невского, я думал об извлечении более сложных фич, собирался начать как раз с угла наклона — но тот же способ с canny(rgb2blue(crop(raw))) успел дать пристойные результаты попросту на большем количестве данных раньше, чем я в режиме "по вечерам" успел разобраться в вопросе получше.

Проще было бы не веб-камеры анализирывать, а скрин-шоты яндекс-карт.
Only those users with full accounts are able to leave comments. Log in, please.