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

Recommended Posts

Приветствую! Расскажу немного о своих трудностях, с которыми я столкнулся при обучении данной сетки:

На Tesla m40 пример, приведенный в туториале обучается очень здорово и шустро - все ок!

Когда же пытаемся всунуть сетке свои размеченные изображения - 

F0606 19:20:16.349822  2152 math_functions.cu:123] Check failed: status == CUBLAS_STATUS_SUCCESS (11 vs. 0)  CUBLAS_STATUS_MAPPING_ERROR

Уперся в стену с созданием файлов "png" аннотации-масок. Как я понимаю обычное RGB изображение "png" нам необходимо перекодировать в градации серого + какой-то режим типо HSV. Предварительно его раскрасив необходимыми цветами:

64 128 64    Animal
192 0 128    Archway
0 128 192    Bicyclist
0 128 64    Bridge
128 0 0        Building
64 0 128    Car
64 0 192    CartLuggagePram
192 128 64    Child
192 192 128    Column_Pole
64 64 128    Fence
128 0 192    LaneMkgsDriv
192 0 64    LaneMkgsNonDriv
128 128 64    Misc_Text
192 0 192    MotorcycleScooter
128 64 64    OtherMoving
64 192 128    ParkingBlock
...
0 0 0        Void

Но как бы не пытался я это сделать в Photoshop, у меня не выходит. Сеть не хочет это кушать.

Единственное решение, которое может создавать файлы масок-аннотаций - https://github.com/kyamagu/js-segment-annotator

После этой тулзы сеть съедает файлы "png" и обучается. Но проблема в том, что мне не нужно размечать данные вручную. У меня уже имеются "вырезанные" файлы. Мне остается только наложить "вырезанные" поверх "исходных" jpg и залить цветами. Но как конвертировать в цвета, которые сеть будет воспринимать и обучаться?

RGB разных цветов - отказ

Градации серого 25% - отказ

Индексированные цвета (3 цвета) - отказ

 

Еще нашел вот такой скрипт, который вроде как должен решить мою проблему, но сеть тоже не ест файлы, которые выходят после скрипта. (Более того, сеть даже не ест файлы аннотации из "родного" датасета CamVid, если ее прогнать через данный скрипт)

Как мне это победить?

 

 

gray.py

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


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

Там маски это просто одноканальные png в которых цифры {0,1,...N} поэтому они смотрятся почти черными.

  • Like 1

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


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

Спасибо! Именно это помогло! Кому нужно - в репозитории имеется около 3к идеально размеченных автоматом данных (больший объем пока не делал)

А что с настройками обучения? Оставить все по дефолту? 40к итераций хватит? если у меня будет 10-30к изображений для тренировки? Как выявить наилучший результат при тренировке?

https://github.com/Maxfashko/CamVid

  • Like 2

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


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

Можете сначала попробовать по дефолту или оставить только один encode-decode слой как у меня в примере.

Попробую прогнать на ваших данных.

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


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

После 10к итераций результат не улучшился, значит ли это, что обучение можно останавливать?

Screenshot_2016-06-09-07-54-44.png

Screenshot_2016-06-08-23-40-40.png

Я понимаю так, что меня должны интересовать следующие строки:

rain net output #0: accuracy = 0.987271

Train net output #2: per_class_accuracy = 0.967589

 Train net output #6: per_class_accuracy = 0.987386

Iteration 40580, loss = 0.0586965

И если показатели хорошие, то останавливать обучение?

 

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


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

Да по сути вас интересуют accuracy  и per_class_accuracy и если значения вас устраивают, то можно остановить нажав ctrl+c, по идее потом можно будет продолжить обучение если потребуется имея snapshot весов и solverstate.

P.S. у вас 12 классов? или 2 класса и вы не редактировали prototxt?

P.P.S вы просматриваете лог с удаленного сервера через ssh на android?

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


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

У меня действительно всего 2 класса, ptototxt я не редактировал. Когда запустил обучение поздно обнаружил, что неверно указал лог, и обучение не фиксировалось в логе. По этому я просматриваю не log а подключаясь к кластеру через screen чтобы посмотреть что там творится.

Из-за того, что не отредактировал prototxt все обучение на смарку?

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


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

Может и нет, т.к. у всех остальных accuracy 1, т.к. они никогда не встречаются.

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


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

Лучше переучить. Иначе могут разные неожиданности получаться.

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


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

А каким-нибудь образом можно получить кривую зависимостей loss и accuracy имея только обученную модель, но не имея лога?

Сейчас переучить не получиться -  кластер с м40-вой только на 2 дня погонять давали.

В общем обучение можно считать проваленным:

При конвертации размеченных цветами аннотированных изображений в {0,1}, в алгоритм закралась ошибка. Какая-то часть данных была размечена как 1- объект 0-фон, а другая чать как 0-объект, 1-фон. Этим объясняется странное поведение при тренировке: две итерации могли идти с точностью в 0.95, а следующие за ней десять итераций, как 0.20, и так до 40000 итерации.

Бедняга, все не могла понять, что же от нее хотят :mellow: 

collage.jpg

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


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

Результат разметки (цвет) напомнил результаты выдаваемые этой прогой: http://www.robots.ox.ac.uk/~szheng/crfasrnndemo стандарт ?

GitHub: https://github.com/torrvision/crfasrnn

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


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

Цвета разметки брал отсюда http://host.robots.ox.ac.uk/pascal/VOC/voc2012/index.html. По сути ребята модель тренировали на данном датасете, если я ничего не путаю.

Зачем изобретать велосипед :)

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


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

День добрый!

А что еще можно попробовать для обучения сетки на сегментацию? Сейчас у меня имеется в распоряжении 4 Tesla m2090 (но это только 5 gb на каждой карточке). Tesla m40 больше не доступна, и врядли в обозримом будущем удастся получить к ней доступ.

Как я понимаю на m2090 я не запущу SegNet. Пробывал указать все 4 карты при тренировке ( -gpu 0,1,2,3  ) не понимает. Может на амазоне есть инстансы с карточками по 10  gb и выше памяти? Я что-то не понял тамошних порядков с техническими характеритиками кластеров.

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


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

День добрый!

А что еще можно попробовать для обучения сетки на сегментацию? Сейчас у меня имеется в распоряжении 4 Tesla m2090 (но это только 5 gb на каждой карточке). Tesla m40 больше не доступна, и врядли в обозримом будущем удастся получить к ней доступ.

Как я понимаю на m2090 я не запущу SegNet. Пробывал указать все 4 карты при тренировке ( -gpu 0,1,2,3  ) не понимает. Может на амазоне есть инстансы с карточками по 10  gb и выше памяти? Я что-то не понял тамошних порядков с техническими характеритиками кластеров.

Сейчас выгодней купить 1080-ю, чем оплачивать тачки в амазоне (GPU + жесткий диск на амазоне стоят не оправдано дорого).

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


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

Сейчас выгодней купить 1080-ю, чем оплачивать тачки в амазоне (GPU + жесткий диск на амазоне стоят не оправдано дорого).

Понятно.

Хочу еще спросить - официальный туториал segnet говорит, что после обучения сети, необходимо проделать следующее:

python /Segnet/Scripts/compute_bn_statistics.py /SegNet/Models/segnet_train.prototxt /SegNet/Models/Training/segnet_iter_10000.caffemodel /Segnet/Models/Inference/  # compute BN statistics for SegNet
python /SegNet/Scripts/test_segmentation_camvid.py --model /SegNet/Models/segnet_inference.prototxt --weights /SegNet/Models/Inference/test_weights.caffemodel --iter 233  # Test SegNet

После этих команд выводятся изображения из тестовой выборки и результаты сегментации.

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

 

Все таки удалось запустить SegNet на одной m2090

А вообще это нормально, что у меня обучение происходит вот так? Уже после 3000 итерации точность довольно неплохая, ошибка тоже небольшая.

И еще - подскажите, из-за чего вот эти всплески ошибок происходят? На итерациях 5, 10, 15 тыс. Они ведь получились эквивалентны графику accuracy на тех же итерациях. Это из-за каких-то уникальных особенностей в обучающей выборке - неточности, выбросы и т.д ? Как от них избавиться? Или это нормально?

 

 

 

 

 

accuracy32000.png

loss32000.png

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


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

Товарищи! Есть кто живой?) Кто-нибудь может мне подсказать по поводу кривых обучения?

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


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

Это нормально, данные берутся порциями, на одних порциях ошибка одна, на других другая, вот и пляшет.

В процессе обучения, по мере улучшения модели, этот забор уменьшается.

  • Like 1

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


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

Это нормально, данные берутся порциями, на одних порциях ошибка одна, на других другая, вот и пляшет.

В процессе обучения, по мере улучшения модели, этот забор уменьшается.

Спасибо! Думаете есть смысл обучать более 40к итераций?

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


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

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

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


Ссылка на сообщение
Поделиться на других сайтах
В 04.07.2016 at 22:08, Smorodov сказал:

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

Smorodov, насчет теста, я правильно подхожу к тестированию? Делаю следующим образом:

В качестве модели указываю ту, на которой тренировался (segnet_train.prototxt)

~/PassArtSegment/Segnet/caffe-segnet/build/tools/caffe test -gpu 0 -model ~/PassArtSegment/SegNet-Tutorial/Models/segnet_train.prototxt 
- weights ~/PassArtSegment/SegNet-Tutorial/Models/Training/segnet_iter_40000.caffemodel -iter 3000 2>&1 | tee test.log

После чего парсим лог и получаем следующие графики точности и ошибки:

 

test_accuracy_40k.png

test_loss_40k.png

 

Ну и если высчитать средние значения из лога то получаю:

columnNumber = 2
data = [float(l.split(',')[columnNumber]) for l in open('log.csv', 'r').readlines()]
mean = sum(data) / len(data)
print(mean) //0.98666 для точности

columnNumber = 3
data = [float(l.split(',')[columnNumber]) for l in open('log.csv', 'r').readlines()]
mean = sum(data) / len(data)
print(mean) //0.013902 для ошибки

Это верный подход?

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


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

Я конкретно с Segnet-ом не возился, структуру каталогов не очень представляю.

Тестирование, я имел ввиду, то что проводится периодически в процессе обучения, задайте для него отдельный кусок данных, в отдельной папке, напрягает "train_data" в названии каталога данных для тестирования.

 

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


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

Приветствую. Может быть у кого-то есть идеи по поводу следующей проблемы?

Вот тут парень выложил caffe-segnet для задействовано нескольких gpu. https://github.com/developmentseed/caffe/tree/segnet-multi-gp

Я собрал, запустил обучение на трех tesla m2090, но прироста скорости не заметил, 20 итераций по-прежнему выполняются около 40 секунд. К тому же я думал что при использовании нескольких gpu память будет шариться, и я смогу увеличить batch size. Но сеть ведет себя странно:

| NVIDIA-SMI 352.39     Driver Version: 352.39         |                       
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla M2090         Off  | 0000:19:00.0     Off |                    0 |
| N/A   59C   P12    30W / 225W |     10MiB /  5375MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   1  Tesla M2090         Off  | 0000:1A:00.0     Off |                    0 |
| N/A   59C    P1   139W / 225W |   4812MiB /  5375MiB |     87%      Default |
+-------------------------------+----------------------+----------------------+
|   2  Tesla M2090         Off  | 0000:1E:00.0     Off |                    0 |
| N/A   59C    P0   159W / 225W |   4457MiB /  5375MiB |     19%      Default |
+-------------------------------+----------------------+----------------------+
|   3  Tesla M2090         Off  | 0000:1F:00.0     Off |                    0 |
| N/A   59C    P0   141W / 225W |   4457MiB /  5375MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
Я попытался попытался изменить batch size в segnet_train.prototxt (на m2090 работает только при значении 1, так как всего 5 gb ram) на значение 2 или 3. Но получил сообщение о нехватке памяти.
Подскажите пожалуйста, могу ли я увеличить скорость обучения при использовании двух и более gpu? Если да, то что мне необходимо для этого сделать? Могу ли я увеличить upsample layer в segnet_train.prototxt чтобы память шарилась?
layer {
  name: "upsample5"
  type: "Upsample"
  bottom: "pool5"
  top: "pool5_D"
  bottom: "pool5_mask"
  upsample_param {
  scale: 2
  upsample_w: 30
  upsample_h: 23
  }
  }
 
 
Я хочу изменить значения upsample_w : 45, upsample_h : 45 для того чтобы нейросеть могла принять на вход изображения 720*720. Возможно ли будет сделать это используя два и более gpu?

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


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

Надо сначала понять какая модель параллелизма там.

Мне кажется что происходит примерно так :

1. На 1 GPU прогнали batch, проапдейтили веса, повторили.

2. На N GPU прогнали batch для каждого GPU, проапдейтили N раз веса у каждого GPU (порядок не важен?), повторили.

Цитата

Parallelism: the -gpu flag to the caffe tool can take a comma separated list of IDs to run on multiple GPUs. A solver and net will be instantiated for each GPU so the batch size is effectively multiplied by the number of GPUs. To reproduce single GPU training, reduce the batch size in the network definition accordingly.

Т.е. по сути можно увеличить итоговый batch size, оставя на каждом GPU такой же как был до этого на 1 GPU.

Caffe и так поддерживает флаг -gpu all, так что непонятно что там в этом форке добавилось.

 

Цитата

Могу ли я увеличить upsample layer в segnet_train.prototxt чтобы память шарилась?

Если вопрос о том как сложить память всех GPU в 1 кусок, то думаю так просто это нельзя сделать. Это можно было бы сделать если первые k1 слоев лежали на первом GPU, k2 последующих на втором GPU и т.д. но я не знаю как это сделать в Caffe.

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


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

Все понял. Родная caffe-segnet не поддерживает multiple gpu. Что-то там изменили. 

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


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

Кстати тут вроде описано про модель

https://github.com/BVLC/caffe/blob/master/docs/multigpu.md

Цитата

The current implementation uses a tree reduction strategy. e.g. if there are 4 GPUs in the system, 0:1, 2:3 will exchange gradients, then 0:2 (top of the tree) will exchange gradients, 0 will calculate updated model, 0->2, and then 0->1, 2->3.

Так что не совсем так как я сказал.

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×