MobileNet в TensorFlow.js

MobileNet — это серия легковесных сверточных нейронных сетей, специально разработанных для мобильных и встраиваемых устройств. Основная идея MobileNet заключается в использовании глубоких сепарабельных сверток (depthwise separable convolutions) вместо стандартных сверток.

Глубокая сепарабельная свертка состоит из двух шагов:

  1. Depthwise Convolution — применяется отдельный фильтр к каждому каналу входного изображения, что позволяет значительно снизить количество параметров.
  2. Pointwise Convolution (1×1 Convolution) — объединяет результаты depthwise свертки, создавая линейную комбинацию каналов и увеличивая выразительность модели.

Преимущества этого подхода:

  • Существенное сокращение количества вычислений (FLOPS).
  • Меньший размер модели на диске, что критично для мобильных приложений.
  • Сохраняется высокая точность при распознавании изображений, особенно на ImageNet.

Использование MobileNet в TensorFlow.js

TensorFlow.js предоставляет готовую реализацию MobileNet, которую можно загрузить через модуль @tensorflow-models/mobilenet. Модель поддерживает несколько версий и коэффициентов масштабирования (alpha):

  • alpha = 1.0 — полная точность.
  • alpha = 0.75, 0.50, 0.25 — уменьшение числа параметров и вычислений, жертвуя некоторой точностью.

Пример загрузки модели:

import * as mobilenet from '@tensorflow-models/mobilenet';
import * as tf from '@tensorflow/tfjs';

async function loadModel() {
    const model = await mobilenet.load({ version: 2, alpha: 1.0 });
    return model;
}

version определяет поколение MobileNet: версия 1 использует более простую архитектуру, версия 2 — улучшенные блоки с остаточными связями (inverted residual blocks).


Предобработка изображений

MobileNet требует изображений размером 224×224 пикселя (для версии 1) или 224×224 или 192×192 для версии 2. В TensorFlow.js предобработка включает несколько этапов:

  1. Преобразование HTML-элемента <img> в tf.Tensor.
  2. Масштабирование значений пикселей в диапазон [0,1].
  3. Нормализация по формуле, используемой при обучении модели.

Пример предобработки:

function preprocessImage(imgElement) {
    const tensor = tf.browser.fromPixels(imgElement)
        .resizeNearestNeighbor([224, 224])
        .toFloat()
        .div(tf.scalar(127.5))
        .sub(tf.scalar(1));
    return tensor.expandDims();
}

expandDims добавляет измерение батча, которое требуется для входа в модель.


Классификация изображений

После загрузки модели и предобработки изображения, классификация выполняется методом classify:

async function classifyImage(model, imgElement) {
    const tensor = preprocessImage(imgElement);
    const predictions = await model.classify(tensor);
    return predictions;
}

Возвращаемое значение — массив объектов с полями className и probability. Пример результата:

[
    { "className": "Persian cat", "probability": 0.85 },
    { "className": "Siamese cat", "probability": 0.10 }
]

Использование модели для извлечения признаков (Feature Extraction)

MobileNet можно использовать не только для классификации, но и для извлечения признаков. Это полезно для:

  • Классификации кастомных объектов (transfer learning).
  • Поиска похожих изображений.
  • Кластеризации визуальных данных.

Для этого необходимо вызвать метод infer с параметром embedding:

const features = model.infer(preprocessedTensor, true);

Возвращаемый features — это тензор фиксированной размерности, который содержит вектор признаков изображения.


Тонкая настройка модели (Transfer Learning)

TensorFlow.js позволяет обучать новые слои поверх MobileNet:

  1. Заморозка базовой модели: предотвращает изменение весов MobileNet.
  2. Добавление новых полносвязных слоев: для кастомных категорий.
  3. Компиляция и обучение:
const mobilenetModel = await mobilenet.load({ version: 2, alpha: 1.0 });
mobilenetModel.model.trainable = false;

const model = tf.sequential();
model.add(tf.layers.flatten({ inputShape: mobilenetModel.model.outputs[0].shape.slice(1) }));
model.add(tf.layers.dense({ units: 5, activation: 'softmax' }));

model.compile({
    optimizer: tf.train.adam(0.0001),
    loss: 'categoricalCrossentropy',
    metrics: ['accuracy']
});

После подготовки модели можно обучать её на собственном наборе данных, используя model.fit.


Оптимизация производительности

Для работы MobileNet на мобильных устройствах применяются следующие методы оптимизации:

  • WebGL backend — ускорение на GPU браузера.
  • Уменьшение alpha — уменьшение числа каналов сверточных слоев.
  • Квантование модели — уменьшение размера модели до 4–8 бит на вес.
  • Отложенная подгрузка — загрузка модели только при необходимости.

В TensorFlow.js легко переключать backend:

import * as tf from '@tensorflow/tfjs';
await tf.setBackend('webgl');  // Использование GPU

Совместимость с различными платформами

MobileNet в TensorFlow.js поддерживается:

  • Браузеры (Chrome, Firefox, Safari).
  • Node.js с backend tensorflow или cpu.
  • Встраиваемые решения через Electron или React Native.

Это позволяет интегрировать модели в веб-приложения, десктопные приложения и мобильные решения без потери производительности.


Практические рекомендации

  • Использовать MobileNetV2 для задач с высокой точностью при умеренном ресурсе.
  • Для мобильных устройств с ограниченной памятью лучше выбирать alpha = 0.5 или 0.25.
  • Перед обучением новых слоев использовать метод infer для получения признаков, что снижает потребление ресурсов.
  • Всегда проводить нормализацию изображений так же, как при обучении модели на ImageNet, иначе точность падает.

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