Лабораторная работа №4. Сжатие изображения ... алгоритма нейронного газа Формулировка задания

advertisement
Лабораторная работа №4. Сжатие изображения с помощью
алгоритма нейронного газа
Формулировка задания
Реализовать алгоритм сжатия изображений на базе сети на основе конкуренции. В рамках работы
рассматриваются только изображения в градации серого цвета. Все изложенные рассуждения
учитывают этот факт.
Описание реализованного алгоритма
Кадр
Кадром в подобных алгоритмах называют часть изображения, полученную путём разделения
исходного цельного изображения на равные по площади прямоугольные части. Осуществляя
работу с кадрами, а не с цельным изображением мы получаем возможность расширить круг
принимаемых к рассмотрению алгоритмов, а также повысить качество их работы, как это будет
показано далее.
Введение в алгоритмы сжатия на основе нейросетей
Задача сжатия изображения в контексте нейросетей формулируется в разных постановках.
Наиболее аккуратным, классическим подходом тут является решение, построенное на
двухслойной сети, входной слой которой обучается на сжатие изображений, а выходной слой на
восстановление данных. Соответственно, размерность вектора входных данных совпадает с
количеством пикселей кадра, а количество нейронов входного слова определяется желаемой
степенью сжатия. Для хранения изображения, сжатого таким образом достаточно хранить
результаты сжатия и веса выходного слоя нейронов. Причем, в рамках этого подхода
используются нейроны с линейной функцией активации, что позволяет перевести задачу
реализации в контекст матричных операций. В данной работе реализован другой алгоритм.
Подход, использованный в рамках данного рассмотрения предполагает использование только
одного слоя нейронов, причем тривиальным образом нейроны не используются вовсе, то есть не
осуществляется подача данных на входы нейронов. Таким образом слой нейронов служит
иллюстрацией к комбинаторным процессам, а не к матричным.
Структура алгоритма
Итак, хранение изображения осуществляется на базе единственного слоя нейронов. Основным
паттерном хранения информации являются веса одного нейрона. В процессе обучения сети веса
должны быть подобраны таким образом, чтобы максимально близко соответствовать по
значениям цвета одного из кадров. Причем накладывается требование, в соответствии с которым
для каждого кадра была рассмотрена задача минимизации различия цветов данного кадра и
весов нейрона. Легко понять, что при соблюдении рационального подхода к разработке
алгоритма потеря качества изображения при сжатии будет тем больше, чем меньше будет
использовано нейронов.
Алгоритм нейронного газа
В рамках данной работы был реализован алгоритм нейронного газа, базирующийся на
следующем подходе к уточнению весов:
Где Wi – вектор входных весов, η – коэффициент обучения, X – вектор цветов кадра, G – функция
соседства. Как можно понять из названия, функция соседства определяет коэффициент,
выражающий близость к некоему базовому. Понятие соседства раскрывается введением меры
расстояния между нейроном и кадром изображения. Существует несколько способов введения
меры расстояния. В данной работе использовалась евклидова норма. То есть расстояние
вычислялось по формуле
Вычислив такую характеристику для каждого нейрона, слой сортируется по возрастанию от
наиболее «близкого» нейрона к наиболее «удалённому».
Где m(i) соответствует порядковому номер в полученном отсортированном массиве, а от
аргумента Xk используется только индекс k, связывающий масштабирующий коэффициент σ с
конкретной итерацией уточнения. В рамках данной работы значение σ тождественно равно
единице, а η = 0.5. Были рассмотрены как другие значения коэффициентов, так и их поведение в
ходе уточнения, однако манипуляции с коэффициентами не привели к улучшению результатов.
Такой выбор коэффициентов гарантированно не дадут окончательного результата, следовательно,
процедуру уточнения весов следует производить несколько раз. В ходе разработки стало ясно, что
по завершении десятой итерации результаты перестают меняться ощутимым образом.
Проблема мёртвых нейронов
Как будет показано в дальнейшем, проблема мёртвых нейронов в значительной степени
ограничивает качество сжатого изображения. При повышении объёма, занимаемого сжимаемым
изображением, качество возрастает до определённого, соответствующего достаточно большому
коэффициенту сжатия, предела, после чего итоговая картинка перестаёт меняться.
Восстановление изображения
После «обучения» нейронов с помощью выбранной метрики для каждого кадра изображения
выбирается ближайший нейрон. Данные весов именно этого нейрона и будут использованы для
восстановления изображения.
Реализация
В связи с тем, что в ряде случаев были задействованы классы, разработка которых выходит за
рамки данной работы, рассмотрим только часть кода, реализующую непосредственно алгоритм
сжатия изображений. Класс NeuronCompressor получает в качестве входных данных
представленное в виде массива векторов изображение. Роль вспомогательной функциональной
обёртки над векторами входных данных обеспечивает класс TainingSet.
Исходный код основного алгоритма
NeuralCompressor::NeuralCompressor(const TrainingSet& s, int l, const CSize
frameSize, const CSize imageSize)
: weights(s.front().size(), l)
, image(imageSize)
, frame(frameSize)
{
assert(frameSize.width() * frameSize.height() ==
static_cast<int>(s.front().size()));
const double SIGMA(1);
for (int CKOKA_PA3(10); CKOKA_PA3--;) {
for (TrainingSet::const_iterator it(s.begin());
{
const TrainingSample& sample(*it);
it != s.end(); ++it)
NeuralSpan::Distances g(weights.distance(sample));
std::sort(g.begin(), g.end(), DistanceItemCompare());
for (int i(0); i != g.size(); ++i) {
CMatrix::T* datum(weights[g[i].first]);
const CMatrix::T dK(exp(-static_cast<double>(i) / SIGMA));
for (int j(0); j != sample.size(); ++j) {
datum[j] += ETA * dK * (sample[j] - datum[j]);
}
}
}
weights.clearPotential();
}
for (TrainingSet::const_iterator it(s.begin()); it != s.end(); ++it) {
conformity.insert(ConformityItem(weights.nearest(*it), it s.begin()));
}
}
Результаты сжатия
При количестве нейронов l = 2, размере кадра 4х4 пикселя:
При l = 10
При l = 30
При l = 300
При l = 4096, то есть при количестве нейронов, совпадающем с количеством кадров:
Как легко видеть, алгоритм даёт удовлетворительный результат при значительных, но не
предельных степенях сжатия, однако конвертации без потери качества не обеспечивает. Однако
качество работы алгоритма сильно снижается при повышении размера кадра. При выборе кадров
площадью 256 пикселей выходное изображение выглядит не отчетливо:
Download