MobileNet — это серия легковесных сверточных нейронных сетей, специально разработанных для мобильных и встраиваемых устройств. Основная идея MobileNet заключается в использовании глубоких сепарабельных сверток (depthwise separable convolutions) вместо стандартных сверток.
Глубокая сепарабельная свертка состоит из двух шагов:
Преимущества этого подхода:
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 предобработка включает несколько этапов:
<img> в
tf.Tensor.Пример предобработки:
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 }
]
MobileNet можно использовать не только для классификации, но и для извлечения признаков. Это полезно для:
Для этого необходимо вызвать метод infer с параметром
embedding:
const features = model.infer(preprocessedTensor, true);
Возвращаемый features — это тензор фиксированной
размерности, который содержит вектор признаков изображения.
TensorFlow.js позволяет обучать новые слои поверх MobileNet:
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 на мобильных устройствах применяются следующие методы оптимизации:
alpha — уменьшение числа
каналов сверточных слоев.В TensorFlow.js легко переключать backend:
import * as tf from '@tensorflow/tfjs';
await tf.setBackend('webgl'); // Использование GPU
MobileNet в TensorFlow.js поддерживается:
tensorflow или cpu.Это позволяет интегрировать модели в веб-приложения, десктопные приложения и мобильные решения без потери производительности.
alpha = 0.5 или 0.25.infer
для получения признаков, что снижает потребление ресурсов.MobileNet сочетает в себе компактность, высокую точность и гибкость, что делает его идеальным инструментом для компьютерного зрения в браузере и на мобильных платформах.