Предлагаю вашему вниманию перевод статьи Neural Network As Predictor For Image Coding (PNG). Блог автора находится здесь.

Тема исследования


Главной причиной данной работы было улучшение существующих предварительных фильтров. Создать новый фильтр, который с помощью искусственной нейронной сети делал бы наилучший прогноз, приводящий к лучшему сжатию файла.

Сжатие


Классически PNG-компрессия делится на два шага:

  1. Предварительная фильтрация (с использованием предикторов);
  2. Компрессия (с помощью DEFLATE).

В данной статье важен только первый шаг. На рисунке ниже вы можете видеть существующие на данный момент предварительные фильтры, и как они сохраняют разницу между реальным и предсказанным пикселем.

Работа предиктора
Существующие на данный момент фильтры + новое решение:
Тип Имя Функция фильтра Функция восстановления
0 None Filt(x) = Orig(x) Recon(x) = Filt(x)
1 Sub Filt(x) = Orig(x) — Orig(a) Recon(x) = Filt(x) + Recon(a)
2 Up Filt(x) = Orig(x) — Orig(b) Recon(x) = Filt(x) + Recon(b)
3 Average Filt(x) = Orig(x) — floor((Orig(a) — Orig(b) / 2)) Recon(x) = Filt(x) + floor((Recon(a) — Recon(b) / 2))
4 Paeth Filt(x) = Orig(x) — PaethPredictor(Orig(a), Orig(b), Orig(d)) Recon(x) = Filt(x) + PaethPredictor(Recon(a), Recon(b), Recon(d))
5 Neural Network Filt(x) = Orig(x) — NN(ArrayOfInputPixels) Recon(x) = Filt(x) + NN(ArrayOfInputPixels)

Нейронная сеть в качестве предиктора


Последний фильтр – новая реализация автора данной статьи. Он внутренне использует нейронную сеть с массивом входных пикселей. В результате возвращает переменную предсказанного пикселя. Как и в других фильтрах сохраняется разность между оригинальным и предсказанным значением. Но что это за входные значения спросите вы? На рисунке ниже автор попытался описать процесс передачи нейронной сети входных значений более наглядно и понятно. Во-первых, есть три различные части изображения:

  1. Копируемая (обозначена КРАСНЫМ);
  2. Входные пиксели для нейронной сети (обозначены ЗЕЛЕНЫМ);
  3. Предсказанный пиксель (обозначен СИНИМ).

Области изображения

Скопированные пиксели

Вся красная область будет скопирована 1:1, поскольку для начала работы нейрофильтра необходимы исходные данные. Вот в ченм причина копирования такой рамки изображения. Конфигурация сети была такая:

  • 28 входных нейронов (отмечено ЗЕЛЕНЫМ) – (8*4-4) px.
  • 1 выходной нейрон (отмечено СИНИМ) – 29-й px.

Так что все пиксели с 1-го по 28-й будут скопированы.

Входные пиксели

Первый пиксель, прошедший обработку фильтром находится в позиции (5,4). Этот пиксель может быть предсказан с помощью остальных 28-ми пикселей и нейронной сети. Это видно из иллюстрации выше.

Прогнозируемый пиксель

Все зеленые пиксели – входные пиксели, которые обрабатывает нейронная сеть, в результате получается предсказанное значение для СИНЕГО пикселя.

Компоненты


В этом разделе автор описывает разработанные и используемые компоненты. Весь код написан на JAVA.
На первом этапе необходимо обучить нейронную сеть. Чтобы выполнить этот шаг немного быстрее, автор разработал Pattern Exporter, который создает тренировочную последовательность для JavaNNS Tool. Для наглядности данный шаг описывает рисунок ниже.

image

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

image

  1. Входное изображение: простое изображение, которое будет сжимать нейронная сеть.
  2. PNG Encoder/Decoder: кодирование и декодирование изображения с использование предиктора на нейронной сети.
  3. Neural Netwrok: нейронная сеть, разработанная на языке программирования JAVA.
  4. JNNSParser
  5. Выходное изображение: в качестве выхода должно получится изображение меньше того, что сжималось.

Для кодирования и декодирования автор использовал библиотеку pngj. Найти ее можно тут.

Результаты


Существует множество способов выбора конфигурации нейронной сети.

image

Возможные способы выбора конфигурации нейронной сети:

  • выбор количества входных нейронов;
  • определение схемы входных нейронов;
  • выбор количества скрытых нейронов;
  • выбор количества скрытых слоев нейронов;
  • определение функций активации нейронов;
  • определение алгоритма обучения
  • и прочее...

Ниже приведены некоторые и оцененных автором оптимальных вариантов для проектирования нейронной сети. В основном он оценивал их, просто проверяя при помощи нескольких выборок изображений, а затем вычислял BPP (bit per pixel) нейронной сети и определил лучшие параметры. Это привело к следующим результатам:

image

Оцененная конфигурация нейронной сети:

  • Количество входных нейронов: 28.
  • Количество скрытых нейронов:
    • 9 нейронов (3х3);
    • 25 нейронов (5х5).

  • Количество скрытых слоев: 1.
  • Функция активации: сигмоида, ограничивающая диапазон от 0,2 до 0,8.
  • Алгоритм обучения: обратное распространение ошибки.

Сравнение с другими предикторами PNG

На следующем этапе автор сравнивал свой нейрофильтр с другими фильтрами PNG, которые используются в настоящее время. Тестирование происходило на нескольких изображениях.

image

Видно, что нейронная сеть несколько хуже справляется с сжатием изображения, чем фильтры Paeth и Average, но она намного лучше, чем Sub и Up. После этой проверки, была проведена еще одна, в ней участвовало гораздо больше изображений (111), на которых были запечатлена природа. Необходимо было узнать, с какими изображения фильтр справляется лучше всего, а с какими хуже.Ниже представлены изображения, с которыми нейронная сеть справилась намного лучше всех остальных фильтров:

image

I wasnt sure what these picture have in common. Well there are many flowers. So possibly my Neural Network really likes Flowers. But I wasn’t very comfortable with that explanation.

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

  • множество текстур;
  • различные текстуры;
  • мало шума.

На следующем шаге автор порылся в своих фотографиях, сделанных за время отпуска, чтобы найти ту, что удовлетворяла бы условия, описанные выше и нашел такую:

image

В результате были расчитаны следующие значения BPP для 6 фильтров:
Тип Имя BPP
0 None 7.289
1 Sub 6.681
2 Up 6.667
3 Average 6.433
4 Paeth 6.486
5 NN 6.368

Таким образом теория о признаках изображения для лучшего сжатия с помощью нейрофильтра подтвердились.

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


Еще один тест автор проводил, чтобы выяснить, как влияет на сжатие происхождение объекта на изображении. Получились следующие результаты:

image

Заключение


  • Есть большой потенциал. Не было достаточно времени, чтобы найти подходящую настройку нейронной сети. Может быть, если бы специализировался в данной области, то нейрофильтр побил бы по показаниям BPP другие фильтры.
  • Возможно, используя другую топологию нейронной сети, можно привнести улучшения. Были мысли о рекурсивных нейронных сетях…
  • Другой идеей было то, что можно было обучить нейронную сеть обрабатывать только один тип изображений.
  • Производительность не была целью, над которой работал автор. Понятно, что другие фильтры обрабатывают изображения гораздо быстрее, чем приведенное решение.

Проект есть на GIT Hub. Кому интересно, можете посмотреть.
Поделиться с друзьями
-->

Комментарии (8)


  1. napa3um
    22.06.2016 13:56
    +2

    «Видно, что нейронная сеть несколько хуже справляется с сжатием изображения» — не видно, не тот график в текст вставили.


    1. toruk0109
      23.06.2016 10:53

      Ошибка исправлена.


  1. Torvald3d
    22.06.2016 16:32

    PNG относительно долго кодируется/декодируется, интересно сравнить результаты по времени кодирования/декодирования с неросетью


    1. SHVV
      22.06.2016 18:18

      Очевидно, что вариант с нейросетью будет самым медленным. Так как чем проще фильтр, тем он быстрее.
      А выигрыш в размере не столь велик, чтобы ускорить последующие стадии сжатия.

      Кстати, когда разбирался с производительностью сохранения в PNG, выяснилось, что по-умолчанию кодировщик перебирает все доступные фильтры и тратит на это бОльшую часть времени. А если ограничить его одним фильтром (например для большинства синтетических изображений из нашей выборки Up фильтр оказался оптималным), то скорость возрастает в разы.


      1. toruk0109
        23.06.2016 08:45

        Если правильно написать NNFilter, допустим используя технологию OpenCL, то сеть ускорится в разы и сможет конкурировать с остальными предикторами. Над чем я собственно и занят в настоящее время на работе.


  1. sysprg
    22.06.2016 17:26
    +1

    Спасибо за перевод интересной статьи. Продажа Magic Pony за 150 миллионов долларов показывает, что у нейросетей огромный потенциал в обработке изображений. В данном случае эксперимент интересен, но не является "чистым" — для чистого теста лучше было бы заставить нейронную сеть, например, динамически выбирать лучший из существующих в стандарте предикторов. Так как встраивание нового предиктора в PNG поломает совместимость со всеми существующими декодерами, но не докажет превосходство нейронных сетей. Сейчас в PNG используются тривиальные алгоритмы предсказания, а их заменили новым, нелинейным и зависящим от большого количества пикселов. Вероятно, что и не основанный на нейронной сети, но учитывающий большое количество информации детерминированный алгоритм тоже дал бы лучшие результаты.


  1. Videoman
    24.06.2016 12:43

    Очень интересно. А вы не пробовали использовать несколько предсказателей? Например, по одному для каждой из битовых плоскостей или разложить изображение по масштабам в пирамиду и использовать свой предсказатель на каждом уровне.


    1. toruk0109
      27.06.2016 10:29

      Каков смысл раскладывать каналы на разные битовые плоскости? Это только усложнит процедуру сжатия, ровно как и увеличит время работы предикторов. То же самое касается использования двух предикторов.