Депс-сепарабельные свёртки и MobileNet

Keras.js представляет собой библиотеку для выполнения предварительно обученных моделей Keras непосредственно в браузере с использованием JavaScript. Она обеспечивает возможность работы с нейронными сетями без необходимости задействовать серверную часть или Python-окружение, что делает её особенно полезной для приложений, требующих мгновенной обратной связи, таких как распознавание изображений или интерактивные веб-интерфейсы.

Модель Keras сохраняется в формате JSON с отдельными бинарными файлами весов. Keras.js поддерживает большинство слоёв Keras, включая свёрточные, полностью связанные, нормализацию и активаторы, а также специальные архитектуры вроде MobileNet, оптимизированные для мобильных устройств.


Депс-сепарабельные свёртки

Депс-сепарабельная свёртка (Depthwise Separable Convolution) — это ключевой элемент легковесных архитектур, таких как MobileNet. Она состоит из двух этапов:

  1. Depthwise Convolution Каждое входное канальное изображение свёртывается отдельно с собственным фильтром. Такой подход снижает количество вычислений, так как фильтры применяются к каждому каналу отдельно, а не ко всем одновременно.

  2. Pointwise Convolution (1×1 Convolution) На выходе depthwise-конволюции применяется свёртка 1×1 для объединения каналов и получения нового набора признаков. Это позволяет модели обучать комбинации каналов без большой нагрузки на вычисления.

Преимущества:

  • Снижение количества параметров и операций по сравнению с обычной свёрткой.
  • Поддержка мобильных и веб-приложений с ограниченными ресурсами.
  • Сохраняет достаточную точность для большинства задач классификации и распознавания объектов.

Пример расчёта сокращения параметров:

Для стандартной свёртки с входным размером (H W M) и N фильтров размером (K K):

[ = K K M N]

Для депс-сепарабельной свёртки:

[ = K K M] [ = 1 M N = M N]

Итого:

[ = K^2 M + M N]

Для типичных размеров фильтров 3×3 сокращение может достигать 8–9 раз.


MobileNet

MobileNet — архитектура, специально разработанная для устройств с ограниченными вычислительными ресурсами. Основная идея — использование депс-сепарабельных свёрток для снижения количества параметров при сохранении высокой точности.

Структура MobileNet:

  1. Базовый блок

    • Depthwise Conv → BatchNorm → ReLU6
    • Pointwise Conv → BatchNorm → ReLU6
  2. Последовательность блоков Архитектура строится из повторяющихся блоков с постепенным увеличением числа каналов и уменьшением пространственного разрешения.

  3. Финальные слои После последовательности блоков добавляется глобальный average pooling и полностью связанный слой для классификации.

Особенности:

  • ReLU6 вместо стандартного ReLU: ограничивает выходное значение до 6, что стабилизирует обучение на мобильных устройствах с низкой точностью чисел.
  • Width multiplier (α): позволяет уменьшать ширину сети (число каналов) для ещё меньшего количества вычислений.
  • Resolution multiplier (ρ): уменьшает разрешение входного изображения, что дополнительно снижает нагрузку.

Использование Keras.js для MobileNet

Keras.js позволяет загружать и использовать MobileNet в браузере. Основные шаги:

  1. Загрузка модели
const KerasJS = require('keras-js');

const model = new KerasJS.Model({
  filepath: 'mobilenet-model/model.json',
  gpu: true
});
await model.ready();
  1. Подготовка данных
  • Изображения преобразуются в массивы чисел (float32) с нормализацией в диапазоне ([0,1]) или ([-1,1]).
  • Формат данных должен соответствовать входу модели (например, [1, 224, 224, 3] для MobileNet).
const inputData = new Float32Array(224 * 224 * 3);
// заполнение inputData пикселями изображения
const input = { input_1: inputData };
  1. Прогон через модель
const output = await model.predict(input);
console.log(output.output_1);
  1. Интерпретация результатов
  • Для классификации изображений output содержит вероятности классов.
  • Можно использовать top-k алгоритм для выбора наиболее вероятных категорий.

Оптимизация работы в браузере

  • WebGL ускорение: Keras.js поддерживает выполнение на GPU через WebGL, что критично для MobileNet с большим числом операций.
  • Минификация модели: сжатие весов и использование float16 позволяет снизить размер передаваемых данных и ускорить загрузку.
  • Пакетная обработка: можно обрабатывать несколько изображений одновременно, если позволяет память.

Практическая архитектура проекта

При интеграции MobileNet через Keras.js обычно выделяют следующие слои:

  1. Frontend

    • Canvas или video элемент для получения изображений.
    • Предобработка изображений в формате Float32Array.
  2. Модуль Keras.js

    • Загрузка модели и весов.
    • Выполнение инференса и нормализация входных данных.
  3. Обработка результатов

    • Преобразование выходного массива в вероятности.
    • Выбор top-k классов.

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