Перейти к содержимому
Compvision.ru

Recommended Posts

Добрый день. 

Расскажите пожалуйста о вашем опыте работы с torch. Минусы и плюсы, а так же отзывы о производительности. Не будет ли проблем интеграции решения на данном фреймворка с другими модулями программы? Там насколько я понимаю Lua.

Смотрю в сторону данного фреймворка потому, что имеется реализация многообещающей сетки ENet https://github.com/e-lab/ENet-training

Производительность колоссальная по сравнению с тем же SegNet на Jetson TX1. Авторы утверждают прям о реалтайме.

20170322_010150.thumb.png.c4041a2eee3c72db34b9a8755affb825.png

Если есть какие то ограничения на данный фреймворк, и захочется переписать сетку на тот же Caffe, это возможно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
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, и все должно легко переписываться на любой уютненький фреймворк. 

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Bes, есть ли что-то подробнее описывающее процесс создания таких сеток? Например на Caffe. Нам необходимо только описать структуру сети в конфигурации, или нужно еще что-то на крестах писать?

Будет ли лучшим решением использовать Caffe, если переписывать данную сетку? Или стоит посмотреть на theano, tensorflow.

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
3 hours ago, maxfashko said:

 

Bes, есть ли что-то подробнее описывающее процесс создания таких сеток?

 

Сомневаюсь...а что там описывать то? Прописывание конфига в prototxt'шник?

 

3 hours ago, maxfashko said:

Будет ли лучшим решением использовать Caffe, если переписывать данную сетку? Или стоит посмотреть на theano, tensorflow.

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

Надо смотреть, какой фреймворк сейчас наиболее активно поддерживается производителем железа, тот и использовать. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

На любой чих вам придётся писать свой 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

 

 

 

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Just now, mrgloom said:

Кто то сравнивал какой нибудь AlexNet на Caffe/Tensorflow по скорости?

на инференсе tensorflow может и обогнать кафю (особенно если квантизовать сеточку в 8 бит), а вот в train time Caffe до сих пор проигрывает только распределенным фреймворкам.

 

Just now, mrgloom said:

 

На любой чих вам придётся писать свой loss или свой layer и надо подумать на чем вы это сможете сделать.

 

Это да, caffe совсем не дружелюбен в плане разработки чего-нибудь сильно кастомного :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, BeS сказал:

на инференсе tensorflow может и обогнать кафю (особенно если квантизовать сеточку в 8 бит)

Что значит квантизировать?

1 час назад, BeS сказал:

Это да, caffe совсем не дружелюбен в плане разработки чего-нибудь сильно кастомного :(

Можете привести пример?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
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 там делается из кучи костылей...

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Можно еще Keras рассмотреть как упрощение к TF. Google вроде его хочет встроить в TF : http://www.fast.ai/2017/01/03/keras/

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

По сжатию: accuracy тоже падает?

вот кстати такая штука от NVIDIA наверно тоже сжимает\квантизирует.

https://developer.nvidia.com/tensorrt

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
4 hours ago, mrgloom said:

По сжатию: accuracy тоже падает?

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

 

5 hours ago, Smorodov said:

Можно еще Keras рассмотреть как упрощение к TF.

Там есть модуль в contrib'е у TF, slim называется...вот народ его активно юзает в качестве ванильного API.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Еще одна сетка из последних (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.""

Обещают исходники выложить.

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
9 минут назад, Smorodov сказал:

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

Это выставляется все настройками test в solver.prototxt?

То есть test_iter=1000 - это то, сколько итераций по тестовой выборке алгоритм отработает.

Тестовая выборка тоже в solver.prototxt устанавливается?

Я о том, что идет процесс тренировки, затем после заданной итерации начался процесс тестирования, не останавливая обучение 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Каждые N итераций, прогоняется тестовая выборка. Да вроде задается в solver.prototxt, но точно не скажу, давно не запускал caffe из командной строки. Обучал с основном через DIGITS.

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Понятно, там все проще, да. Я пробовал с 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вечер добрый. Назрел вопрос. Натренировал сетку по двум классам на изображениях приведенных ниже ( 25к в train (200*120px) ). В итоге при ровном положении камеры на бпла картинку распознает более менее сносно, даже есть инвариантность к небольшим поворотам. Но вот как только крен бпла увеличивается, получается жесть. Собственно, ожидаемо. Как с этим бороться? Генерировать новые данные для обучения на основе имеющихся, но с поворотом? Или идти путем создания новых реальных данных, которые необходимо будет разметить?

train.thumb.PNG.f3890b05179270b3ea58eb294bb4f821.PNG

 

result_segment.thumb.PNG.d8d8c0d6f19abf8d7dc9b3eafd56e0b0.PNG

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 hour ago, maxfashko said:

Вечер добрый. Назрел вопрос. Натренировал сетку по двум классам на изображениях приведенных ниже ( 25к в train (200*120px) ). В итоге при ровном положении камеры на бпла картинку распознает более менее сносно, даже есть инвариантность к небольшим поворотам. Но вот как только крен бпла увеличивается, получается жесть. Собственно, ожидаемо. Как с этим бороться? Генерировать новые данные для обучения на основе имеющихся, но с поворотом? Или идти путем создания новых реальных данных, которые необходимо будет разметить?

train.thumb.PNG.f3890b05179270b3ea58eb294bb4f821.PNG

 

result_segment.thumb.PNG.d8d8c0d6f19abf8d7dc9b3eafd56e0b0.PNG

Сверточные сети не инвариантны к повротам, т.ч. нужно аугментировать данные.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Только что, BeS сказал:

Сверточные сети не инвариантны к повротам, т.ч. нужно аугментировать данные.

А как же субдискретизация? Она ведь для создания инвариантности и служит?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
8 minutes ago, maxfashko said:

А как же субдискретизация? Она ведь для создания инвариантности и служит?

В общем случае операция свертки не инвариантна к повороту. У сеток есть только инвариант к трансляции и нечувствительность к слабым поворотам за счет всяких пулингов.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Может здесь обычный graph cut пойдет, и не нужно городить сетку ?

 

Скриншот 2017-03-28 12.02.15.png

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, BeS сказал:

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

Расскажите подробнее пожалуйста об этом.

1 час назад, Smorodov сказал:

Может здесь обычный graph cut пойдет, и не нужно городить сетку ?

 

Скриншот 2017-03-28 12.02.15.png

Как вариант, стоит рассмотреть данный вариант. Тут суперпиксели?

А сетка потом будет больше областей распознавать, пока два класса только. Поэтому ее взял, и на небе с землей стал обучать пока.

Кстати, каким образом можно задать заранее сегменты неба (синий) и земли (зеленый), если предварительно не известно, что на изображении?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×