Зачем вообще это нужно?
Представьте: у вас есть планшет, который работает как умная камера в квартире. Он должен не просто детектировать движение, а понимать, что именно находится в кадре: телевизор, диван, стол, лампа. И все одновременно. Это multi-label классификация - задача, где одно изображение может принадлежать нескольким классам сразу.
И вот здесь начинается боль: большинство туториалов показывают multi-label на мощных GPU, но как быть, когда у вас встроенное устройство с ограниченной памятью и процессором? Давайте разбираться.
Важно: все примеры и инструменты актуальны на 12 марта 2026 года. Если вы читаете это позже - проверяйте версии. MobileNetV4 уже вышел, EfficientNet-Lite обновился, а TensorFlow Lite получил новые оптимизации.
1Определяем задачу и собираем данные
Первая ошибка - начать с модели. Не делайте так. Сначала ответьте: какие объекты вы хотите распознавать? Конкретно. "Мебель" - плохо. "Кресло, стол, диван, торшер" - лучше.
Сбор данных для встраиваемого устройства имеет специфику: снимайте в условиях, максимально близких к эксплуатации. Если камера будет висеть под углом 45 градусов - собирайте фото именно с таких ракурсов. Используйте сам планшет для съемки, чтобы учесть особенности его камеры (широкоугольник, дисторсию, цветопередачу).
2Размечаем как профи
Multi-label разметка - это не bounding boxes. Это бинарные флаги для каждого класса. На изображении с диваном и столом отмечаете оба класса. Звучит просто, но здесь поджидают две ловушки.
Ловушка первая: частичная видимость. Виден только угол дивана - это диван или нет? Решайте заранее и документируйте правила. Ловушка вторая: контекстные объекты. На столе стоит ваза - отмечать вазу как отдельный класс или считать частью стола?
Используйте инструменты с поддержкой multi-label. Например, Roboflow (да, это партнерская ссылка, но я действительно им пользуюсь) Roboflow позволяет быстро размечать такие датасеты. Если бюджет нулевой - CVAT или LabelImg с доработками.
Про автоматизацию разметки я подробно писал в статье "Разметка данных: автоматизируй, экономь, избегай ошибок". Основная мысль: не размечайте вручную то, что можно предразметить моделью-учителем. Используйте предобученный классификатор для начальной разметки, потом только корректируйте.
3Выбираем архитектуру под железо
Вот здесь многие ошибаются. Берем ResNet-50 потому что "она хорошая". А потом удивляемся, почему на планшете инференс занимает 3 секунды.
Для встраиваемых устройств на 2026 год у нас есть несколько фаворитов:
- MobileNetV4 - последняя версия от Google, оптимизирована specifically для мобильных устройств. Поддержка аппаратного ускорения через делегаты TFLite.
- EfficientNet-Lite - без механизма squeeze-and-excitation для лучшей совместимости с TFLite. Выбор номер один для многих embedded проектов.
- GhostNet - легкая архитектура, которая использует дешевые операции для генерации дополнительных feature maps. Потребляет меньше памяти.
Критерии выбора простые: размер модели (MB), FLOPs (вычислительная сложность), поддержка квантования. Проверяйте benchmark для вашего конкретного устройства - производительность сильно зависит от процессора и наличия NPU.
| Архитектура | Размер (MB) | Точность на ImageNet | Поддержка TFLite |
|---|---|---|---|
| MobileNetV4 Small | 5.2 | 74.5% | Полная |
| EfficientNet-Lite0 | 6.1 | 75.1% | Полная |
| GhostNet 1.0x | 5.2 | 73.9% | Частичная |
4Готовим данные и аугментируем
Multi-label классификация ненавидит несбалансированные данные. Если у вас 1000 изображений с диваном и 50 с торшером - модель проигнорирует торшер. Решений несколько:
- Oversampling для редких классов (повторение изображений с этими объектами)
- Class weighting в функции потерь (даем больший вес ошибкам на редких классах)
- Генерация synthetic данных с помощью аугментаций
Аугментация для multi-label имеет особенность: некоторые трансформации могут сделать объект неузнаваемым, но метка останется. Повернули стол на 90 градусов - это все еще стол. Но если вырезали кусок изображения, где был только край дивана - стоит ли оставлять метку "диван"? Решайте.
Подробнее про аугментацию смотрите в моей статье "Аугментация данных для борьбы с переобучением". Там разобраны практические методы, которые работают в 2026 году.
5Обучаем с учетом multi-label
Функция потерь - binary cross-entropy для каждого класса отдельно, потом суммируем. Не используйте softmax! Softmax предполагает, что классы взаимоисключающие, а у нас они могут сосуществовать.
Важное обновление 2025-2026: появились асимметричные функции потерь для multi-label, которые по-разному штрафуют false positive и false negative. Проверяйте последние исследования - иногда они дают прирост в 2-3%.
Метрики качества: precision и recall для каждого класса отдельно. Не усредняйте слепо! Если "торшер" имеет recall 30%, а "диван" 95% - у вас проблема с редкими классами. F1-score - хороший компромисс.
Порог классификации: по умолчанию 0.5, но для каждого класса оптимальный порог может быть свой. Используйте precision-recall curve чтобы найти лучшие пороги.
6Оптимизируем для устройства
Обученная модель весит 50MB? На планшете с 2GB памяти это приемлемо, но если у вас устройство с 256MB - нужно сжимать.
- Квантование - уменьшаем точность весов с float32 до int8. TFLite поддерживает post-training quantization и quantization-aware training. Второе лучше, но требует переобучения.
- Прунинг - обрезаем малозначимые веса. В 2026 году появились методы structured pruning, которые удаляют целые каналы, а не отдельные веса. Это дает реальное ускорение на железе.
- Дистилляция - обучаем маленькую модель (студент) на предсказаниях большой (учитель). Для embedded работает хорошо.
Используйте TensorFlow Lite с аппаратными делегатами. Для Android с NPU - NNAPI Delegate. Для процессоров ARM - XNNPACK Delegate. Это может ускорить инференс в 5 раз.
7Деплоим и мониторим
Ура, модель готова! Теперь самое интересное - перенос на устройство. И здесь поджидает главная ловушка: отладка.
На десктопе модель работала с точностью 92%. На планшете - 78%. Почему? Разные препроцессинги (библиотеки ресайза изображений дают разный результат), разная арифметика с плавающей точкой, кэширование.
Решение: делайте golden tests - набор из 50-100 изображений, для которых знаете правильные ответы. Запускайте инференс на устройстве и сравнивайте с эталоном. Расхождения более 5% - ищите проблему в препроцессинге или квантовании.
Что может пойти не так (и обязательно пойдет)
Я собрал типичные ошибки, которые встречал в проектах за последний год:
| Ошибка | Симптомы | Лечение |
|---|---|---|
| Классы коррелируют | Если есть "стол", то всегда есть "стул". Модель путает | Собирать данные без корреляции или объединять классы |
| Фон слишком однообразный | Точность 95% в тесте, 60% в продакшене | Аугментировать фон, собирать разнообразные данные |
| Разрешение не соответствует железу | Инференс 2 секунды, устройство перегревается | Уменьшить input resolution, пожертвовать точностью |
| Метаданные не отслеживаются | Неизвестно, какая версия модели на устройстве | Внедрить versioning моделей и A/B тесты |
Подробнее о причинах падения моделей читайте в статье про ошибки компьютерного зрения.
Вместо заключения: что будет дальше
К 2027 году multi-label классификация на встраиваемых устройствах станет тривиальной задачей. Почему? Появятся специализированные NPU в каждом планшете и телефоне, фреймворки автоматически будут оптимизировать модели под конкретное железо, а сбор данных можно будет делать симуляцией в Unreal Engine 6.
Но пока что - вам придется пройти весь этот путь. От сбора данных до деплоя. Главный совет: начните с самого простого пайплайна. MobileNetV2 (да, второй версии, она проще), 5 классов, минимальный датасет. Получите работающий прототип за неделю. Потом улучшайте.
И последнее: не зацикливайтесь на точности. Для умной камеры точность 85% может быть достаточной, если false positive не критичны. Лучше работающая система с приемлемой точностью, чем идеальная модель, которая никогда не попадет на устройство.