Deep Dream: как обучить нейронную сеть мечтать не только о собаках

Original author: tsulej
  • Translation
  • Tutorial
В июле всех порадовала статья про deep dream или инцепционизм от Google. В статье подробно рассказывалось и показывалось как нейронные сети рисуют картины и зачем их заставили это делать. Вот эта статья на хабре.

Теперь все, у кого настроена среда caffe, кому скучно и у кого есть свободное время могут сделать собственные фотки в стиле инцепционизм. Одна проблема — почти на всех фотках получаются собаки. Как же избавится от элементов с псами в изображениях deep dream и обучить свою нейронную сеть пользоваться другими картинками?

image


Пошаговая инструкция


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

Самая сложная часть — скачать 200-1000 изображений, которые хотите использовать для обучения. Автор пришел к выводу, что хорошо работают однотипные изображения. Можно использовать лица, картинки порнографического характера, письма, животных, огнестрельное оружие и так далее.

Измените размер всех картинок на 256х256. Сохраните их как Truecolor JPG (но не в Grayscale, даже если изображение черно-белое).

Вычислите среднецветовые показатели всех ваших изображений (это по желанию). Нужно знать о средних показателях красного, зелёного и синего в наборе картинок. Для этого автор использует инструменты convert и identify в ImageMagick

convert *.jpg -average res.png 
identify -verbose res.png 

Так можно увидеть усреднённый показатель по каждому цветовому каналу.

Создайте папку <caffe_path>/models/MYNET.
Это рабочая папка. Все созданные папки и файлы будут помещены в MYNET.

Создайте папку с названием ‘images’
(в рабочей папке в MYNET).

Для каждого из изображений нужно создать отдельную папку внутри папки ‘images’. Автор использует числа, начиная с 0. Например, ‘images/0/firstimage.jpg’,
‘images/1/secondimage.jpg’,
и так далее. Каждая папка – это категория, так что в итоге у вас получится много папок, каждая из которых содержит по одному изображению.

Создайте текстовый файл с названием train.txt
 (и разместите его в рабочей папке). Каждая строка в этом файле должна содержать путь к изображению с номером категории изображения. Выглядит это так:

images/0/firstimage.jpg 0

images/1/secondimage.jpg 1

…

Скопируйте содержимое файла train.txt
в файлval.txt.
Скопируйте файлы deploy.prototxt,
train_val.prototxt
и solver.prototxt
в рабочую папку вот отсюда.

Как редактировать файлы


1. train_val.prototxt

Строки 13-15 (и 34-36) определяют средние значения для вашего набора картинок для синего, зелёного и красного каналов (именно в этой последовательности). Если вы не знаете значений, просто выставьте везде «129»

В строке 19 укажите число одновременно обрабатываемых изображений. 4-гигабайтный графический процессор может справиться с 40 изображениями, ну, а если процессор 2 Гб, количество нужно будет сократить до 20. Если введенное вами число слишком высоко, программа выдаст ошибку «недостаточно памяти» и нужно будет ввести меньшее значение. Подойдёт любое количество картинок, даже 1.

Строки 917, 1680 и 2393. num_output
должен соответствовать количеству ваших категорий, т.е. количеству папок в каталоге с изображениями.

2. deploy.prototxt

Строка 2141, num_output
должен быть таким же, как и в предыдущем файле.

3. solver.prototxt

Очень важно изменить следующие значения:

  • display: 20 – печатать статистику после кадых 20 итераций
  • base_lr: 0.0005 – скорость обучения (learning rate), её можно менять. base_lr можно адаптировать исходя из результатов (см. стратегию ниже)
  • max_iter: 200000 – максимальное количество итераций для обучения. Здесь можно указывать хоть 1000000.
  • snapshot: 5000 – как часто будет сохраняться прогресс. (в данном случае каждые 5000 итераций). Это значение обязательно нужно если понадобится остановить обучение в какой-либо точке.

Почти всё готово


Ещё нужен googlenet. Открываем caffe/models/bvlc_googlenet
и сохраняем этот файл сюда.

Переходим в рабочую папку и выполняем эту команду:

../../build/tools/caffe train -solver ./solver.prototxt -weights ../bvlc_googlenet/bvlc_googlenet.caffemodel

Каждые 5000 итераций будет сохраняться прогресс. Когда он сохранится, можно прервать обучение и запустить Deep Dream в сети. Первые результаты должны будут видны в слое inception_5b/output
.
Чтобы возобновить обучение, используйте последнее сохранение прогресса со следующей командой:

../../build/tools/caffe train -solver ./solver.prototxt -snapshot ./MYNET_iter_5000.solverstate

Стратегии для base_lr


Есть несколько стратегий для base_lr
во время первых 1000 итераций. Наблюдайте за процентом потерь. Во время обучения значение должно постепенно снижаться вплоть до 0.0, однако:

  • Если вы видите, что процент потерь всё выше и выше, прервите обучение и установите значение base_lr
    в пять раз ниже текущего.
  • Если процент потерь «застрял» на одном уровне и снижается очень медленно, прервите обучение и установите значение base_lr
    в 5 раз выше предыдущего значения.
  • Ели не сработала ни одна из вышеперечисленных стратегий, то, вероятно, есть проблема и обучение провалено. Смените набор изображений и попробуйте ещё раз.

Немного инсайтов


Графический процессор автора — NVIDIA GTX960 с 4 Гб RAM. Caffe скомпилирован с библиотекой CuDNN. Каждые 5000 итераций занимали около часа. При использовании CPU вычисления были медленнее в 40 раз.

Автор советует прекращать обучение после 40 тысяч итераций, но однажды сделал 90 тысяч. У пользователя с ником DeepDickDream ушло 750 тысяч итераций на то, чтобы сложить из членов портрет Халка Хогана.

У вас мало шансов сделать набор изображений заметными, если вы делаете менее 100 000 итераций, но есть хороший шанс увидеть что-то новое… и без собак.

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

Примеры


Сеть, обученная с помощью изображений из Британской библиотеки. 11 категорий. 100 тысяч изображений (у каждого изображения было по 10 вариантов). Слои inception 3, 4 и 5 были очищены. Результат получился после 25 тысяч итераций. Лица из портретного альбома чётко видны. Вот изображение со слоя 5b/output
.

image

Подраздел Британской библиотеки, содержащий исключительно письма. 750 категорий, по одному изображению в каждой. 40 тысяч итераций. Вычищен только слой classification. Интересно почему четко видны бабочки? Слой 5b.

image

Та же картинка, но с песочными часами. Слой 5a.

image

А вот набор порнографического характера. 94 категории, 100 изображений в каждой. 90 тысяч итераций. Слой 5b.

image

Изображение, аналогичное предыдущему, но с измененным набором картинок (использованы эффекты поворота изображений, отражения, нормализации, размытия и прочее). 40 тысяч итераций. Слой 5b.

image

4 категории искаженных изображений, по 1000 каждое, 65 тысяч итераций. Слой Pool5.

image

Изображение, подобное предыдущему. 80 тысяч итераций. С пустыми 3,4 и 5 слоями. Слой 5b.

image

Конспект


  1. Для этой задачи не надо обучать сеть с нуля — занимайтесь лишь настройкой параметров в Googlenet.
  2. Самая сложная часть — скачать 200-1000 изображений, которые хотите использовать для обучения.
  3. Хорошо работают однотипные изображения.
  4. Размер всех картинок нужно изменить на 256х256.
  5. Тренировать сеть можно на случайных изображениях, идентичных или похожих.
.io
Company
Ads
AdBlock has stolen the banner, but banners are not teeth — they will be back

More

Comments 5

    0
    Сегодня день deep dream прям какой-то. Приятно.
      +7
      Почему нейронная сеть натаскана на собак, а не на котиков? Это какой-то котофобный заговор?
      0
      А на чем все это написано? На питоне?
        0
        на компьютере

      Only users with full accounts can post comments. Log in, please.