maxfashko 5 Report post Posted March 21, 2017 Добрый день. Расскажите пожалуйста о вашем опыте работы с torch. Минусы и плюсы, а так же отзывы о производительности. Не будет ли проблем интеграции решения на данном фреймворка с другими модулями программы? Там насколько я понимаю Lua. Смотрю в сторону данного фреймворка потому, что имеется реализация многообещающей сетки ENet https://github.com/e-lab/ENet-training. Производительность колоссальная по сравнению с тем же SegNet на Jetson TX1. Авторы утверждают прям о реалтайме. Если есть какие то ограничения на данный фреймворк, и захочется переписать сетку на тот же Caffe, это возможно? Share this post Link to post Share on other sites
BeS 53 Report post Posted March 21, 2017 1 hour ago, maxfashko said: Расскажите пожалуйста о вашем опыте работы с torch. Словами не передать, какие боль и страдания я испытвал каждый раз, сталкиваясь с этим фрейморком Серьезно, может он и был когда-то крут потому, что альтернатив особо не было, но при живом tensorflow/theano/caffe он нафиг не сдался. Куча каких-то сторонних модулей, раскиданых по всему github'у, полувымершее комьюнити...хз зачемим пользовться в 2017 году...pytorch еще может быть, но не чистый torch. 1 hour ago, maxfashko said: Не будет ли проблем интеграции решения на данном фреймворка с другими модулями программы? Там насколько я понимаю Lua. Ну Lua ведь и задумывался как портабельный скриптовый язык...т.ч. в C/C++ код должен интегрироваться из коробки. 1 hour ago, maxfashko said: Смотрю в сторону данного фреймворка потому, что имеется реализация многообещающей сетки ENet https://github.com/e-lab/ENet-training. Там вроде бы никакой магии нету в ENet, и все должно легко переписываться на любой уютненький фреймворк. 1 Share this post Link to post Share on other sites
maxfashko 5 Report post Posted March 22, 2017 Bes, есть ли что-то подробнее описывающее процесс создания таких сеток? Например на Caffe. Нам необходимо только описать структуру сети в конфигурации, или нужно еще что-то на крестах писать? Будет ли лучшим решением использовать Caffe, если переписывать данную сетку? Или стоит посмотреть на theano, tensorflow. Задача поставлена так: как можно быстрее, без задержек производить сегментацию на выше описанном железе. Думаю в дальнейшем на плате будет еще что-нибудь крутиться. Про Caffe знаю, что можно выбросить питоновский интерфейс и пользоваться чистыми крестами, это подходит очень кстати. Share this post Link to post Share on other sites
BeS 53 Report post Posted March 22, 2017 3 hours ago, maxfashko said: Bes, есть ли что-то подробнее описывающее процесс создания таких сеток? Сомневаюсь...а что там описывать то? Прописывание конфига в prototxt'шник? 3 hours ago, maxfashko said: Будет ли лучшим решением использовать Caffe, если переписывать данную сетку? Или стоит посмотреть на theano, tensorflow. Задача поставлена так: как можно быстрее, без задержек производить сегментацию на выше описанном железе. Думаю в дальнейшем на плате будет еще что-нибудь крутиться. Надо смотреть, какой фреймворк сейчас наиболее активно поддерживается производителем железа, тот и использовать. Share this post Link to post Share on other sites
mrgloom 242 Report post Posted March 22, 2017 На любой чих вам придётся писать свой loss или свой layer и надо подумать на чем вы это сможете сделать. Тут есть неплохое сравнение http://cs231n.stanford.edu/slides/2016/winter1516_lecture12.pdf Caffe не нравится тем ,что python api без нормальной документации. Куча библиотек-зависимостей не весело деплоить и интегрировать в С++ проект. Не удобно править prototxt (6к строк для ResNet), можно дефайнить сеть в питоне только через дурацкие трюки. Так же говорят что в Caffe свертка не оптимальна по памяти. https://github.com/Yangqing/caffe/wiki/Convolution-in-Caffe:-a-memo Кто то сравнивал какой нибудь AlexNet на Caffe/Tensorflow по скорости? Тут не очень понятно т.к. есть только Caffe(native) https://github.com/soumith/convnet-benchmarks Мои результаты: https://github.com/mrgloom/kaggle-dogs-vs-cats-solution P.s. можете порыться тут https://github.com/mrgloom/Semantic-Segmentation-Evaluation 1 Share this post Link to post Share on other sites
BeS 53 Report post Posted March 22, 2017 Just now, mrgloom said: Кто то сравнивал какой нибудь AlexNet на Caffe/Tensorflow по скорости? на инференсе tensorflow может и обогнать кафю (особенно если квантизовать сеточку в 8 бит), а вот в train time Caffe до сих пор проигрывает только распределенным фреймворкам. Just now, mrgloom said: На любой чих вам придётся писать свой loss или свой layer и надо подумать на чем вы это сможете сделать. Это да, caffe совсем не дружелюбен в плане разработки чего-нибудь сильно кастомного Share this post Link to post Share on other sites
maxfashko 5 Report post Posted March 22, 2017 1 час назад, BeS сказал: на инференсе tensorflow может и обогнать кафю (особенно если квантизовать сеточку в 8 бит) Что значит квантизировать? 1 час назад, BeS сказал: Это да, caffe совсем не дружелюбен в плане разработки чего-нибудь сильно кастомного Можете привести пример? Share this post Link to post Share on other sites
BeS 53 Report post Posted March 22, 2017 40 minutes ago, maxfashko said: Что значит квантизировать? Переход на малобитную арифметику https://petewarden.com/2016/05/03/how-to-quantize-neural-networks-with-tensorflow/ 40 minutes ago, maxfashko said: Можете привести пример? Да хоть те же пресловутые GAN'ы...никто их не делает на caffe, т.к. извращение это...да и object detection там делается из кучи костылей... 1 Share this post Link to post Share on other sites
Smorodov 579 Report post Posted March 22, 2017 Можно еще Keras рассмотреть как упрощение к TF. Google вроде его хочет встроить в TF : http://www.fast.ai/2017/01/03/keras/ Share this post Link to post Share on other sites
mrgloom 242 Report post Posted March 22, 2017 По сжатию: accuracy тоже падает? вот кстати такая штука от NVIDIA наверно тоже сжимает\квантизирует. https://developer.nvidia.com/tensorrt 1 Share this post Link to post Share on other sites
BeS 53 Report post Posted March 22, 2017 4 hours ago, mrgloom said: По сжатию: accuracy тоже падает? В 8 бит вроде бы уже умеют без деградации качества квантизовать, при бинаризации уже серьезно качество плывет. 5 hours ago, Smorodov said: Можно еще Keras рассмотреть как упрощение к TF. Там есть модуль в contrib'е у TF, slim называется...вот народ его активно юзает в качестве ванильного API. Share this post Link to post Share on other sites
Smorodov 579 Report post Posted March 22, 2017 Еще одна сетка из последних (Mask R-CNN): https://arxiv.org/pdf/1703.06870.pdf Из поста google группы: "Facebook can do image segmentation which is essentially the ground truth now, using Mask R-CNN. And they can do it at 5 fps with code not optimised for speed. " Without tricks, Mask R-CNN outperforms all existing, single-model entries on every (COCO) task, including the COCO 2016 challenge winners."" Обещают исходники выложить. 1 Share this post Link to post Share on other sites
maxfashko 5 Report post Posted March 23, 2017 Просто оставлю это здесь, может конечно повторюсь, но все же. http://homepages.inf.ed.ac.uk/rbf/CVonline/Imagedbase.htm 1 Share this post Link to post Share on other sites
maxfashko 5 Report post Posted March 24, 2017 other.pdf Возник вопрос. Собственно как определить, что необходимо остановиться при обучении сети? Данные вот такие: Цитата test_initialization: false test_iter: 1000 test_interval: 2000 max_iter: 10000000 При запуске обучения я устанавливаю писать в лог файл. По мере обучения я его парсю и смотрю, что же там вышло: Цитата python caffe_root/tools/extra/parse_log.py mylog.log ./ gnuplot gnuplot> set datafile separator ',' gnuplot> plot 'mylog.log.train' using 1:4 with line # accuracy throughout the iterations gnuplot> plot 'mylog.log.train' using 1:5 with line # loss throughout the iterations Такие графики очень не информативны, и понять по ним, когда же необходимо остановиться нельзя. Когда итерации достигают величины тестирования: Цитата Iteration 2000, Testing net (#0) I0324 20:02:32.915902 6554 solver.cpp:343] Test net output #0: accuracy = 0.658568 I0324 20:02:32.915961 6554 solver.cpp:343] Test net output #1: loss = 0.247929 (* 1 = 0.247929 loss) I0324 20:02:32.915966 6554 solver.cpp:343] Test net output #2: per_class_accuracy = 0.439028 I0324 20:02:32.915985 6554 solver.cpp:343] Test net output #3: per_class_accuracy = 0.943957 I0324 20:02:33.049631 6554 solver.cpp:214] Iteration 200, loss = 0.236956 Собственно тоже не совсем понятно, что же происходит у нас на этапе тестирования, где я указал test_iter=1000 Share this post Link to post Share on other sites
Smorodov 579 Report post Posted March 24, 2017 Обычно, когда точность на тестовой выборке идет вниз, а точность на обучающей вверх, тогда пора остановиться, ну или или когда точность на тестовой выборке перестала расти. Share this post Link to post Share on other sites
maxfashko 5 Report post Posted March 24, 2017 9 минут назад, Smorodov сказал: Обычно, когда точность на тестовой выборке идет вниз, а точность на обучающей вверх, тогда пора остановиться, ну или или когда точность на тестовой выборке перестала расти. Это выставляется все настройками test в solver.prototxt? То есть test_iter=1000 - это то, сколько итераций по тестовой выборке алгоритм отработает. Тестовая выборка тоже в solver.prototxt устанавливается? Я о том, что идет процесс тренировки, затем после заданной итерации начался процесс тестирования, не останавливая обучение Share this post Link to post Share on other sites
Smorodov 579 Report post Posted March 24, 2017 Каждые N итераций, прогоняется тестовая выборка. Да вроде задается в solver.prototxt, но точно не скажу, давно не запускал caffe из командной строки. Обучал с основном через DIGITS. 1 Share this post Link to post Share on other sites
maxfashko 5 Report post Posted March 24, 2017 Понятно, там все проще, да. Я пробовал с DIGITS SegNet обучать, и не вышло. Хорошо, указал я тестовую и тренировочную сетку: Цитата train_net: "/home/maksim/learning/skyfinder/Models/train.prototxt" test_net: "/home/maksim/learning/skyfinder/Models/test.prototxt" test_initialization: false test_iter: 100 test_interval: 100 Каждые 100 итераций консоль выдает: Цитата I0324 21:50:17.667479 14168 solver.cpp:294] Iteration 100, Testing net (#0) I0324 21:50:28.657519 14168 solver.cpp:343] Test net output #0: label = 4 I0324 21:50:28.657542 14168 solver.cpp:343] Test net output #1: label = 4 I0324 21:50:28.657546 14168 solver.cpp:343] Test net output #2: label = 4 ...................................................... I0324 21:50:28.805891 14168 solver.cpp:343] Test net output #23999: label = 0 I0324 21:50:28.805896 14168 solver.cpp:343] Test net output #24000: prob = 0.211419 ....................................................... I0324 21:50:29.709029 14168 solver.cpp:343] Test net output #143997: prob = 0.236837 I0324 21:50:29.709034 14168 solver.cpp:343] Test net output #143998: prob = 0.235051 I0324 21:50:29.709038 14168 solver.cpp:343] Test net output #143999: prob = 0.227755 Собственно что это за информация? В тестовой выборке у меня 9729 изображений. Это сетка сегментирует мои изображения в тестовой выборке? Если да, то почему этих "prob" и "label" так много? prob - 143 тысячи, label - 23 тысячи? по идее должно ведь только 100 картинок из тестовой выборки обрабатываться с батчем равным 1 Share this post Link to post Share on other sites
mrgloom 242 Report post Posted March 24, 2017 в caffe нету early stopping из коробки, если речь об этом. https://deeplearning4j.org/earlystopping Share this post Link to post Share on other sites
maxfashko 5 Report post Posted March 28, 2017 Вечер добрый. Назрел вопрос. Натренировал сетку по двум классам на изображениях приведенных ниже ( 25к в train (200*120px) ). В итоге при ровном положении камеры на бпла картинку распознает более менее сносно, даже есть инвариантность к небольшим поворотам. Но вот как только крен бпла увеличивается, получается жесть. Собственно, ожидаемо. Как с этим бороться? Генерировать новые данные для обучения на основе имеющихся, но с поворотом? Или идти путем создания новых реальных данных, которые необходимо будет разметить? Share this post Link to post Share on other sites
BeS 53 Report post Posted March 28, 2017 1 hour ago, maxfashko said: Вечер добрый. Назрел вопрос. Натренировал сетку по двум классам на изображениях приведенных ниже ( 25к в train (200*120px) ). В итоге при ровном положении камеры на бпла картинку распознает более менее сносно, даже есть инвариантность к небольшим поворотам. Но вот как только крен бпла увеличивается, получается жесть. Собственно, ожидаемо. Как с этим бороться? Генерировать новые данные для обучения на основе имеющихся, но с поворотом? Или идти путем создания новых реальных данных, которые необходимо будет разметить? Сверточные сети не инвариантны к повротам, т.ч. нужно аугментировать данные. Share this post Link to post Share on other sites
maxfashko 5 Report post Posted March 28, 2017 Только что, BeS сказал: Сверточные сети не инвариантны к повротам, т.ч. нужно аугментировать данные. А как же субдискретизация? Она ведь для создания инвариантности и служит? Share this post Link to post Share on other sites
BeS 53 Report post Posted March 28, 2017 8 minutes ago, maxfashko said: А как же субдискретизация? Она ведь для создания инвариантности и служит? В общем случае операция свертки не инвариантна к повороту. У сеток есть только инвариант к трансляции и нечувствительность к слабым поворотам за счет всяких пулингов. з.ы. можно, кстати, попробовать саму картинку доворачивать в соответствии с данными от IMU...так может быть даже точнее получится за счет меньшей вариативности в таргетном распределении... Share this post Link to post Share on other sites
Smorodov 579 Report post Posted March 28, 2017 Может здесь обычный graph cut пойдет, и не нужно городить сетку ? 1 Share this post Link to post Share on other sites
maxfashko 5 Report post Posted March 28, 2017 1 час назад, BeS сказал: з.ы. можно, кстати, попробовать саму картинку доворачивать в соответствии с данными от IMU...так может быть даже точнее получится за счет меньшей вариативности в таргетном распределении... Расскажите подробнее пожалуйста об этом. 1 час назад, Smorodov сказал: Может здесь обычный graph cut пойдет, и не нужно городить сетку ? Как вариант, стоит рассмотреть данный вариант. Тут суперпиксели? А сетка потом будет больше областей распознавать, пока два класса только. Поэтому ее взял, и на небе с землей стал обучать пока. Кстати, каким образом можно задать заранее сегменты неба (синий) и земли (зеленый), если предварительно не известно, что на изображении? Share this post Link to post Share on other sites