Введение
TinyML (Tiny Machine Learning) — направление, нацеленное на запуск моделей машинного обучения на устройствах с ограниченными ресурсами: микроконтроллерах (МК), IoT‑сенсорах, носимой технике.
Компьютерное зрение в рамках TinyML решает задачи:
- распознавания объектов и жестов;
- классификации изображений;
- детекции аномалий (например, дефектов на производстве);
- отслеживания движения.
Ключевые ограничения МК:
- ОЗУ: 8–256 КБ;
- ПЗУ: 32–2048 КБ;
- тактовая частота: 16–240 МГц;
- отсутствие FPU/GPU;
- энергопотребление: единицы мВт.
В статье разберём:
- принципы адаптации CV‑алгоритмов под МК;
- популярные модели и архитектуры;
- инструменты разработки;
- оптимизацию инференса;
- примеры реальных сценариев.
1. Почему компьютерное зрение на МК?
1.1. Преимущества
- Локальная обработка — нет зависимости от облака, низкая задержка.
- Конфиденциальность — данные не уходят наружу.
- Энергоэффективность — экономия на радиомодулях.
- Масштабируемость — тысячи устройств без нагрузки на сервер.
1.2. Сценарии применения
- Умные датчики: детекция присутствия, подсчёт объектов.
- Носимые устройства: распознавание жестов для управления.
- Промышленность: контроль качества на конвейере.
- Сельское хозяйство: анализ состояния растений.
- Безопасность: обнаружение движения в камерах без интернета.
2. Принципы адаптации CV‑алгоритмов под МК
2.1. Сокращение вычислительной сложности
- Уменьшение разрешения изображений (32×32, 64×64).
- Переход на целочисленную арифметику (int8, int16) вместо float.
- Квантование весов и активаций (8‑bit, 4‑bit).
- Прореживание (pruning) — удаление малозначимых нейронов.
2.2. Оптимизация памяти
- Статическое выделение памяти — избегание malloc/free.
- Переиспользование буферов — один массив для промежуточных результатов.
- Сжатие моделей (weight sharing, Huffman coding).
2.3. Аппаратные ускорения
- SIMD‑инструкции (если поддерживаются).
- DSP‑блоки (в некоторых МК, например, STM32F4).
- Специализированные ускорители (например, Google Coral Micro).
3. Популярные модели и архитектуры
3.1. Лёгкие CNN для классификации
- MobileNetV1/V2 (с глубиной‑разделёнными свертками).
- SqueezeNet — 50× меньше AlexNet при схожей точности.
- TinyYOLO — упрощённая версия YOLO для детекции.
- EfficientNet‑Lite — масштабируемая архитектура.
Пример: MobileNetV2 на 32×32:
- параметры: ~100 тыс.;
- операции: ~1 млн MAC;
- память: ~200 КБ (после квантования).
3.2. Альтернативы CNN
- Haar‑каскады (как в OpenCV) — для детекции лиц/глаз.
- HOG + SVM — гистограмма ориентированных градиентов + классификатор.
- K‑NN на признаках — простые задачи классификации.
3.3. Модели для специфических задач
- Autoencoders — аномалия‑детекция (сжатие → реконструкция).
- LSTM/GRU — анализ видеопоследовательностей (редко из‑за памяти).
- Decision Trees — бинарные решения по признакам.
4. Инструменты разработки
4.1. Обучение и конвертация моделей
- TensorFlow Lite for Microcontrollers:
- обучение в Keras/TF;
- конвертация в
.tflite; - генерация C‑кода для МК.
- ONNX → CMSIS‑NN:
- экспорт из PyTorch/Caffe;
- оптимизация под ARM‑Cortex‑M.
- Edge Impulse:
- веб‑платформа для сбора данных, обучения, деплоя;
- поддержка Arduino, ESP32, STM32.
4.2. Фреймворки для инференса
- TensorFlow Lite Micro — ядро для запуска
.tflite. - CMSIS‑NN (от ARM) — оптимизированные функции для Cortex‑M.
- NNoM (No Neural Net on Microcontroller) — минималистичный фреймворк.
4.3. Среды разработки
- Arduino IDE + библиотеки (например,
Arduino_TensorFlowLite). - STM32CubeMX + CMSIS‑NN.
- PlatformIO — мультиплатформенная сборка.
5. Оптимизация инференса
5.1. Этапы обработки изображения
- Захват (камера, датчик):
- RAW → YUV/RGB;
- кадрирование.
- Препроцессинг:
- нормализация (0…1 или −1…1);
- изменение размера (resize);
- центрирование.
- Инференс (модель):
- свертки, пулинг, активации;
- полносвязные слои.
- Постпроцессинг:
- softmax → класс;
- NMS (Non‑Maximum Suppression) для детекции.
5.2. Оптимизации на каждом этапе
- Захват:
- пропуск строк/пикселей (decimation);
- аппаратный resize (если есть).
- Препроцессинг:
- целочисленные аппроксимации (например, деление через сдвиг);
- таблицы предрасчитанных значений (LUT).
- Инференс:
- объединение свертки и BatchNorm в один слой;
- замена ReLU на «ступенчатую» функцию.
- Постпроцессинг:
- порог уверенности (confidence threshold);
- ограничение числа объектов.
5.3. Пример оптимизации свертки
// Вместо float
for (i=0; i<H; i++)
for (j=0; j<W; j++)
output[i][j] = relu(conv2d(input, kernel));
// Целочисленная версия (int8)
for (i=0; i<H/2; i++) // Пропуск строк
for (j=0; j<W/2; j++) // Пропуск столбцов
output[i][j] = clamp((conv2d_int8(input, kernel) * scale) >> shift, 0, 127);
6. Практические примеры
6.1. Распознавание цифр (MNIST на МК)
- Модель: TinyCNN (3 свертки, 1 полносвязный слой).
- Вход: 28×28 grayscale.
- Память: ~80 КБ (int8).
- Скорость: 50–200 мс на Cortex‑M4.
Код (TensorFlow Lite Micro):
TfLiteStatus status = interpreter->Invoke();
TfLiteTensor* output = interpreter->output(0);
int predicted_digit = std::distance(
output->data.f,
std::max_element(output->data.f, output->data.f + 10)
);
6.2. Детекция лица на ESP32
- Модель: Haar‑каскад (OpenCV) или TinyYOLO.
- Камера: OV2640 (QVGA).
- Оптимизации:
- resize до 64×64;
- grayscale → бинаризация.
- Результат: 1–2 кадра/с на ESP32‑S3.
6.3. Классификация дефектов на производстве
- Задача: найти трещины на деталях.
- Модель: Autoencoder (вход 128×128).
- Метрика: MSE между входом и реконструкцией.
- Порог: если MSE > T → дефект.
7. Ограничения и «подводные камни»
7.1. Ресурсы
- ОЗУ: модели >256 КБ редко запускаются на МК без внешней памяти.
- ПЗУ: прошивка + модель + библиотека → может не влезть




