Рубрики
Без рубрики

Сжатие данных с помощью изображений

Dan Ruta сжатие данных с использованием оригинальной мотивации ImageSthe для этого бокового проекта нашел лучший способ сохранения и загрузки весов, обучаемых нейронной сетью на основе браузера, при разработке JSNet. Чтобы сэкономить веса, как JSON, мне пришлось бы записать контент, в консоли или на

Дэн Рута

Оригинальная мотивация для этого бокового проекта нашел лучший способ сохранения и загрузки весов, обучающихся нейронной сетью на основе браузера, в то время как разработка jsnet Отказ Для экономии весов, как JSON, мне пришлось бы записать контент, в консоли, или на странице, и, как вы можете себе представить, он получил довольно плохо, когда сети получили большие, и было много данных.

Решение, которое я придумал, должен был кодировать данные в качестве изображений, которые обрабатываются намного лучше, чем обычный текст JSON. Непредействитенно, алгоритм, который я использовал для этого, кажется, не только сработал довольно хорошо, но возможный размер файла был так же маленьким, как сжатие GZIP, даже фактически избивает его в большинстве случаев.

Так что я думал, что я буду польски и Отпустите это в качестве автономной библиотеки, для общего пользования. Эта статья служит обзором алгоритма сжатия, для тех, кто находится в такой вещи.

Алгоритм

Без дальнейшего ADO краткий обзор высокого уровня массива к конвертации изображения выглядит следующим образом:

  • Числа преобразуются в base15, с первыми несколькими символами, являющимися метаданными
  • Результаты объединены
  • Каждая пара шестнадцатеричных символов затем преобразуется в Uint8Clamped Value
  • Наконец, это обращается на холст, затем либо вернул (браузер), либо сохраняется в файл (nodejs)

Что касается преобразования из изображения обратно в данные массива:

  • Изображение читается либо из файла, uint8ClampedArray, либо из элемента IMG HTML
  • Каждое значение в UINT8ClampedArray преобразуется в базу 16
  • После объединения в строку вывод разделен вдоль метаданных » f” персонаж
  • Каждая шестигранная строка затем проанализирована обратно в число

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

Мета данных

Если числа были преобразованы в основание 16 (от 0 до f), что использует изображения, нельзя ли дифференцировать отдельные значения, как после объединения. Следовательно, они преобразуются в базу 15 (от 0 до E), а символ F используется в качестве разделителя, для разделения значений.

Отсюда, может потребоваться немного более метаданных данных для других вещей. Но отныне это можно представить в качестве базы 15, так как он находится в начале, то есть нам не нужно больше мета-только символов.

Положительный или отрицательный Первый дополнительный бит метаданных необходимы, является ли число положительным или отрицательным. Однако это будет отходы, чтобы использовать весь символ только для двоичного значения, поэтому это объединяется в метаданные данные для того, сколько базовых 15 символов хранит левую сторону номера (слева от десятичного времени).

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

Значения в 7 или ниже представляют отрицательный номер, тогда как остальные представляют собой положительное число.

Количество базы 15 символов для левой стороны Более того, каждое из значений представляет собой количество из базовых 15 символов используются для представления левой стороны десятичного времени.

Так, например, 3 представляет собой отрицательное число, с 4 цифрами слева, как -1234.xyz Отказ И А Представляет положительное число, с 3 цифрами слева, как 123.xyz Отказ

Количество ведущих десятичных нулей Наконец, по умолчанию количество ведущих нулей в десятичном значении сохраняется. Опять же, см. Конфигурации Раздел ниже, но по умолчанию используется 1 символ, что позволяет 15 ведущих десятичных нулей, таких как 0,0000000000000000001.

Итак, с конфигурациями по умолчанию, Значение 1430.01623 будет преобразован в следующее:

F «Это разделитель», – А «представляет собой положительное значение с 3 символами (655), представляющих левую часть десятичного времени,« 1 »представляет собой 1 ведущую ноль, в 1430 году. 0 1623, а остальные представляют собой фактическое значение. Первые 3 персонажа, ‘ 655 ‘ преобразуются из основания 15 на 1430, а остальные, « 733 ‘ , преобразуется в 1623. Результат соединен, при добавлении ведущего нуля.

Конфигурации

По умолчанию только 1 мета-символ используется для кодирования того, сколько шестнадцатеричных символов используется для представления левой стороны десятичного времени (655 => 1430, в приведенном выше примере). Это помещает предел при максимальном шестнадцатеричном цене Eeeeeeee, который составляет 170859374 в десятичном периоде. Хотя для большинства случаев должно быть достаточно, все еще можно представлять больше, просто используя 2 символа.

В этом сценарии положительные числа хранятся как на что-то выше 112, а отрицательные числа являются чем-то ниже. Это означает, что есть теоретический максимум 113 шестигранных символов, которые могут представлять левую сторону числа, иначе 7912473587054163204202262246064660222224606482062446620828868288862844044480028440444220620006824802826420808608284080640028606608644. Хотя на практике, Парсент Округление становится смешным после 15 персонажей, так что 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999

Но, чтобы сохранить еще больше места, эта конфигурация может вместо этого может быть установлена на 0, чтобы полностью игнорировать эти метаданные, если вы точно не знаете, что номера положительны, и в диапазоне 0-1 (вы всегда можете нормализировать/не нормализовать Он использует включенные функции помощника). Итак, 0,123 будет преобразован в:

Где ‘ 83 «Это шестнадцатеричное преобразование 123. Нет персонажа, хранящегося для левой стороны десятичного места, поскольку число предполагается 0.

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

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

Тесты

Два самых интересных формата были PNG и WebP. Оба могут быть сохранены из холста, и оба могут использовать альфа-канал, то есть они довольно легко взаимозаменяемы (по крайней мере, в версии браузера).

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

Формат PNG делает работу, но WebP на самом деле превосходит gzip! Просто о … на 98,5% от размера, из этих 3 тестов. Использование альфа-канала не помогло уменьшить размер файла, но он уменьшил размер изображения в пикселях, поэтому он был оставлен в виде конфигурации переключения.

Следующий набор контрольных ориентиров предназначен для конфигурации емкости. Для этого и следующим набором тестов я создал случайное множество номеров в диапазоне от 0 до 1, с 1 десятичным местом, например: 0,1, 0,4, 0,7, 0,2 И так далее, чтобы убедиться, что данные были действительными для любой конфигурации и протестировали варианты PNG и WebP, из вывода браузера. 80000 номеров использовались для этого эталона.

WebP довольно легко победил формат PNG и даже GZIP, когда емкость была установлена на 0, равна ему при установке 1 и немного больше, когда установлено значение 2.

Наконец, размеры сравнивали для ведущих десятичных нулей конфигурации Zeroes, для каждой конфигурации емкости для формата WebP. На этот раз был использован набор номеров 500 000, то же типом, что и выше.

Этот конкретный конфиг, кажется, на самом деле делает хуже на самой маленькой конфигурации емкости, но немного лучше на остальных.

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

Файлы тестов можно найти в репо , на Github.

Так что же дальше?

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

Другими вещами, которые могут стоить добавления, могут быть «Автоматически», чтобы определить все конфигурации автоматически, сначала зацикливаю данные, чтобы увидеть, что на самом деле необходимо.

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

Но на данный момент, чтобы заключить, вот образ весов для нейронной сети, обученной, чтобы распознать рукописные цифры ( Mnist ). Предполагая, что среда не применяет никаких сжатий, вы должны быть в состоянии загрузить его, используя jsnet. , в структуре 784-100-10, и иметь подготовленную модель, все от изображения PNG!

Страница GitHub для этого – здесь И мой твиттер – @Dan_ruta Отказ

Оригинал: “https://www.freecodecamp.org/news/data-compression-using-images-5eaede612c28/”