В июле всех порадовала статья про deep dream или инцепционизм от Google. В статье подробно рассказывалось и показывалось как нейронные сети рисуют картины и зачем их заставили это делать. Вот эта статья на хабре.
Теперь все, у кого настроена среда caffe, кому скучно и у кого есть свободное время могут сделать собственные фотки в стиле инцепционизм. Одна проблема — почти на всех фотках получаются собаки. Как же избавится от элементов с псами в изображениях deep dream и обучить свою нейронную сеть пользоваться другими картинками?
Для этой задачи не надо обучать сеть с нуля — занимайтесь лишь настройкой параметров в Googlenet. Построение сети с нуля требует массу времени, сотни часов. Прежде чем начать, прочтите это.
Самая сложная часть — скачать 200-1000 изображений, которые хотите использовать для обучения. Автор пришел к выводу, что хорошо работают однотипные изображения. Можно использовать лица, картинки порнографического характера, письма, животных, огнестрельное оружие и так далее.
Измените размер всех картинок на 256х256. Сохраните их как Truecolor JPG (но не в Grayscale, даже если изображение черно-белое).
Вычислите среднецветовые показатели всех ваших изображений (это по желанию). Нужно знать о средних показателях красного, зелёного и синего в наборе картинок. Для этого автор использует инструменты convert и identify в ImageMagick:
Так можно увидеть усреднённый показатель по каждому цветовому каналу.
Создайте папку
Создайте папку с названием
Для каждого из изображений нужно создать отдельную папку внутри папки ‘images’. Автор использует числа, начиная с 0. Например,
Создайте текстовый файл с названием
Скопируйте содержимое файла
Строки 13-15 (и 34-36) определяют средние значения для вашего набора картинок для синего, зелёного и красного каналов (именно в этой последовательности). Если вы не знаете значений, просто выставьте везде «129»
В строке 19 укажите число одновременно обрабатываемых изображений. 4-гигабайтный графический процессор может справиться с 40 изображениями, ну, а если процессор 2 Гб, количество нужно будет сократить до 20. Если введенное вами число слишком высоко, программа выдаст ошибку «недостаточно памяти» и нужно будет ввести меньшее значение. Подойдёт любое количество картинок, даже 1.
Строки 917, 1680 и 2393.
Строка 2141,
Очень важно изменить следующие значения:
Ещё нужен googlenet. Открываем
Переходим в рабочую папку и выполняем эту команду:
Каждые 5000 итераций будет сохраняться прогресс. Когда он сохранится, можно прервать обучение и запустить Deep Dream в сети. Первые результаты должны будут видны в слое
Чтобы возобновить обучение, используйте последнее сохранение прогресса со следующей командой:
Есть несколько стратегий для
Графический процессор автора — NVIDIA GTX960 с 4 Гб RAM. Caffe скомпилирован с библиотекой CuDNN. Каждые 5000 итераций занимали около часа. При использовании CPU вычисления были медленнее в 40 раз.
Автор советует прекращать обучение после 40 тысяч итераций, но однажды сделал 90 тысяч. У пользователя с ником DeepDickDream ушло 750 тысяч итераций на то, чтобы сложить из членов портрет Халка Хогана.
У вас мало шансов сделать набор изображений заметными, если вы делаете менее 100 000 итераций, но есть хороший шанс увидеть что-то новое… и без собак.
В одной категории может находиться больше изображений чем в других. Например, можно использовать 20 категорий с двумя сотнями картинок в них. Тренировать сеть можно на случайных изображениях, идентичных или похожих – в общем, всё, что угодно. У автора не получилось выделить правило, обеспечивающее лучший результат. Возможно всё зависит от контента.
Сеть, обученная с помощью изображений из Британской библиотеки. 11 категорий. 100 тысяч изображений (у каждого изображения было по 10 вариантов). Слои inception 3, 4 и 5 были очищены. Результат получился после 25 тысяч итераций. Лица из портретного альбома чётко видны. Вот изображение со слоя
Подраздел Британской библиотеки, содержащий исключительно письма. 750 категорий, по одному изображению в каждой. 40 тысяч итераций. Вычищен только слой classification. Интересно почему четко видны бабочки? Слой 5b.
Та же картинка, но с песочными часами. Слой 5a.
А вот набор порнографического характера. 94 категории, 100 изображений в каждой. 90 тысяч итераций. Слой 5b.
Изображение, аналогичное предыдущему, но с измененным набором картинок (использованы эффекты поворота изображений, отражения, нормализации, размытия и прочее). 40 тысяч итераций. Слой 5b.
4 категории искаженных изображений, по 1000 каждое, 65 тысяч итераций. Слой Pool5.
Изображение, подобное предыдущему. 80 тысяч итераций. С пустыми 3,4 и 5 слоями. Слой 5b.
Теперь все, у кого настроена среда caffe, кому скучно и у кого есть свободное время могут сделать собственные фотки в стиле инцепционизм. Одна проблема — почти на всех фотках получаются собаки. Как же избавится от элементов с псами в изображениях deep dream и обучить свою нейронную сеть пользоваться другими картинками?
Пошаговая инструкция
Для этой задачи не надо обучать сеть с нуля — занимайтесь лишь настройкой параметров в 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
.Подраздел Британской библиотеки, содержащий исключительно письма. 750 категорий, по одному изображению в каждой. 40 тысяч итераций. Вычищен только слой classification. Интересно почему четко видны бабочки? Слой 5b.
Та же картинка, но с песочными часами. Слой 5a.
А вот набор порнографического характера. 94 категории, 100 изображений в каждой. 90 тысяч итераций. Слой 5b.
Изображение, аналогичное предыдущему, но с измененным набором картинок (использованы эффекты поворота изображений, отражения, нормализации, размытия и прочее). 40 тысяч итераций. Слой 5b.
4 категории искаженных изображений, по 1000 каждое, 65 тысяч итераций. Слой Pool5.
Изображение, подобное предыдущему. 80 тысяч итераций. С пустыми 3,4 и 5 слоями. Слой 5b.
Конспект
- Для этой задачи не надо обучать сеть с нуля — занимайтесь лишь настройкой параметров в Googlenet.
- Самая сложная часть — скачать 200-1000 изображений, которые хотите использовать для обучения.
- Хорошо работают однотипные изображения.
- Размер всех картинок нужно изменить на 256х256.
- Тренировать сеть можно на случайных изображениях, идентичных или похожих.
Комментарии (5)
maaGames
14.08.2015 15:44+7Почему нейронная сеть натаскана на собак, а не на котиков? Это какой-то котофобный заговор?
ruikarikun
14.08.2015 18:24+2Увы, в сети сейчас происходит ряд негативных процессов, уводящих котиков на второй план по сравнению с собаками.
io9.com/we-who-spoke-lolcat-now-speak-doge-1481243678
www.elezea.com/2013/12/from-lolcat-to-doge
KaaPex
Сегодня день deep dream прям какой-то. Приятно.