Shelf Monitoring — автоматический контроль выкладки товаров в рознице. Мы строим системы компьютерного зрения, которые анализируют каждую полку каждые 15 минут, используя существующие камеры или автономных роботов. По данным IHL Group, out-of-stock обходится ритейлу в $1 трлн в год глобально — это примерно 4% выручки. Традиционные инспекции: обходы сотрудников занимают часы и дают моментальный снимок. Наша автоматизация сокращает время реакции до минут и повышает точность до 95%.
Наш опыт — 12 лет в CV для ритейла и 50+ внедрений в России и СНГ. Мы используем YOLOv8 (точность mAP@50 — 0.92) и кастомные архитектуры для распознавания SKU. В этой статье разберём, как мы строим такие системы: от сбора датасета до деплоя на камеры или роботов.
Почему ритейлеры теряют миллиарды на пустых полках?
Out-of-stock — не единственная проблема. Неправильная выкладка (нарушение планограммы) снижает продажи на 3–5%. Товары не на своих местах — клиенты уходят. Ценники не совпадают — штрафы и недовольство. Ручные проверки дороги: один инспектор в среднем обходит 10 магазинов в неделю, тратя 20 минут на полку. Сеть из 200 магазинов — это 400 человеко-часов в неделю только на контроль полок. Система CV делает то же за 5 минут на весь магазин, без остановки работы. Каждый out-of-stock для популярного SKU обходится в среднем в $25 потерянной прибыли.
Как работает детекция товаров на полке?
Используем YOLOv8 — state-of-the-art детектор в реальном времени. На кастомных датасетах он даёт mAP@50 = 0.92 на типовых наборах, что на 15% выше, чем предыдущие версии. Модель обучена на изображениях с различных углов и освещения. Код ниже показывает базовый класс для анализа изображения полки.
from ultralytics import YOLO
import numpy as np
import cv2
class ShelfMonitoringSystem:
def __init__(self, product_model_path: str,
planogram_path: str = None):
self.detector = YOLO(product_model_path)
self.planogram = self._load_planogram(planogram_path) if planogram_path else None
def analyze_shelf_image(self, image: np.ndarray) -> dict:
"""Анализ одного фото полки"""
# Детекция всех SKU
detections = self.detector(image, conf=0.4, iou=0.5)
detected_products = []
for box in detections[0].boxes:
sku = self.detector.model.names[int(box.cls)]
x1, y1, x2, y2 = map(int, box.xyxy[0])
detected_products.append({
'sku': sku,
'bbox': [x1, y1, x2, y2],
'confidence': float(box.conf),
'facings': 1 # каждый bounding box = 1 facing
})
# Агрегация по SKU
sku_counts = {}
for product in detected_products:
sku = product['sku']
if sku not in sku_counts:
sku_counts[sku] = {'count': 0, 'positions': []}
sku_counts[sku]['count'] += 1
sku_counts[sku]['positions'].append(product['bbox'])
result = {
'detected_skus': sku_counts,
'total_facings': len(detected_products),
}
# Сравнение с планограммой
if self.planogram:
result['planogram_compliance'] = self._check_planogram(
sku_counts, self.planogram
)
result['out_of_stock'] = self._find_out_of_stock(
sku_counts, self.planogram
)
return result
def _find_out_of_stock(self, current: dict, planogram: dict) -> list:
"""Нахождение отсутствующих товаров"""
missing = []
for sku, expected_facings in planogram.items():
current_facings = current.get(sku, {}).get('count', 0)
if current_facings == 0:
missing.append({'sku': sku, 'status': 'out_of_stock',
'expected_facings': expected_facings})
elif current_facings < expected_facings * 0.5:
missing.append({'sku': sku, 'status': 'low_stock',
'current': current_facings,
'expected': expected_facings})
return missing
Обучение модели на каталоге из 5000+ SKU
Для крупного ритейлера мы используем иерархическую классификацию: сначала определяем категорию, затем конкретный SKU. Каждый SKU требует минимум 500 размеченных изображений. Аугментации учитывают особенности полок — повороты, масштаб, блики.
# Структура датасета: изображения кропов продуктов по папкам
# dataset/
# train/
# category_beverages/
# sku_cola_1l/
# sku_juice_orange/
# category_dairy/
# ...
from ultralytics import YOLO
model = YOLO('yolov8l.pt')
model.train(
data='shelf_products.yaml',
epochs=200,
imgsz=640,
batch=32,
workers=8,
optimizer='AdamW',
lr0=1e-3,
# Аугментации специфичные для полки
degrees=5.0, # небольшой поворот
scale=0.3, # изменение масштаба (разные расстояния до полки)
fliplr=0.5,
hsv_h=0.02, # небольшое изменение цвета
mosaic=1.0
)
Мобильное приложение для инспекторов
Сотрудник фотографирует полку через мобильное приложение, система мгновенно показывает:
- Зелёная рамка: SKU в наличии, соответствует планограмме
- Жёлтая: мало товара
- Красная: отсутствует
class ShelfInspectionAPI:
def __init__(self, monitor: ShelfMonitoringSystem):
self.monitor = monitor
def analyze_photo(self, image_bytes: bytes,
store_id: str,
shelf_id: str) -> dict:
image = cv2.imdecode(
np.frombuffer(image_bytes, np.uint8),
cv2.IMREAD_COLOR
)
result = self.monitor.analyze_shelf_image(image)
# Добавляем визуализацию
annotated = self._annotate_image(image, result)
return {
'store_id': store_id,
'shelf_id': shelf_id,
'analysis': result,
'annotated_image_base64': encode_image_b64(annotated)
}
Интеграция с роботами для автоматической инспекции
Автономные роботы (Simbe Tally, Brain Corp) объезжают магазин и фотографируют полки. CV-система обрабатывает фото в реальном времени, передаёт задания на пополнение персоналу.
Как сократить потери от пустых полок?
Автоматизация позволяет обнаруживать out-of-stock в 10 раз быстрее ручных обходов. Система сравнивает текущее состояние с планограммой и генерирует задачи для сотрудников. Типовой сценарий: робот проходит магазин за час, система выявляет 15–20 нарушений, персонал получает уведомления на мобильные устройства. Время реакции — менее 5 минут. Это снижает потери выручки на 80%.
Что входит в нашу работу
- Аудит текущих процессов и камер — оценка качества изображений, освещения, углов обзора.
- Сбор и разметка датасета — минимум 5000 изображений на категорию, контроль качества разметки.
- Обучение модели с метриками mAP > 0.9 и recall > 0.85.
- Интеграция с WMS/ERP (SAP, 1С, Oracle) через REST API.
- Разработка мобильного приложения для Android/iOS с онлайн-анализом.
- Визуализация результатов в дашбордах (Grafana, Power BI).
- Документация и обучение команды заказчика.
- Поддержка 6 месяцев, включая дообучение при добавлении новых SKU.
Сроки и метрики
| Метрика |
Значение |
| Точность распознавания SKU |
88–95% (зависит от схожести продуктов) |
| Точность детекции out-of-stock |
90–97% |
| Скорость анализа фото |
< 2 секунды |
| Точность compliance check |
85–92% |
| Масштаб |
Срок |
| 100–500 SKU, одна категория |
5–7 недель |
| 1000–5000 SKU, полный магазин |
10–16 недель |
| Сеть + роботы + аналитика |
18–28 недель |
Для небольших сетей (до 500 SKU) внедрение занимает от 5 недель, для крупных (5000+ SKU) — до 16 недель. Мы гарантируем точность детекции SKU не ниже 88% и compliance check — 85%.
Наш опыт включает интеграции с WMS SAP и 1С, а также с роботами Simbe Tally и Brain Corp. Сертифицированные инженеры по PyTorch и TensorFlow. Более 5 лет на рынке, 12 лет экспертизы в компьютерном зрении.
Хотите оценить возможность внедрения? Свяжитесь с нами — мы проведём бесплатный аудит ваших камер и предоставим proof-of-concept за 2 недели. Закажите консультацию для обсуждения вашего проекта.
Как distribution shift убивает метрики CV-модели в промышленности
На производстве ставят камеру, контролируют качество продукции. Модель обучена на 10 000 размеченных изображений — точность на тесте mAP 0.84. Запускают в продакшен — и в первую же неделю пропускают 30 % дефектов. Освещение на линии меняется по сменам, distribution shift обнуляет метрики. Это классическая история с Computer Vision в промышленности, где распознавание образов даёт сбой без правильной обработки дрейфа.
Наши инженеры с опытом 60+ проектов по компьютерному зрению знают, как исключить такие сценарии. Гарантируем стабильную работу модели под реальными условиями.
Детекция объектов: YOLO, RT‑DETR и всё что между ними
YOLO — стандарт для real‑time детекции. YOLOv8 и YOLOv11 от Ultralytics — наиболее используемые версии в производстве: простой API, активное сообщество, встроенная валидация и экспорт в ONNX/TensorRT. Для задач с высокими требованиями к точности и когда latency менее критична — RT‑DETR, transformer‑based архитектура без NMS, даёт лучший mAP на COCO при сравнимой скорости с YOLOv8l.
| Архитектура |
mAP на COCO (val2017) |
FPS (A10G, FP16) |
Сложность деплоя |
| YOLOv8n |
37.3 |
700+ |
Низкая (ONNX/TensorRT) |
| YOLOv8m |
50.2 |
250 |
Низкая |
| RT‑DETR-L |
53.0 |
140 |
Средняя (требует PyTorch) |
| Mask R‑CNN |
38.2 (bbox) |
30 |
Высокая |
Типичная ошибка при обучении детектора: датасет 8000 изображений, 3 класса, fine‑tune YOLOv8m — F1 0.73 на валидации. Смотрим confusion matrix — один класс почти никогда не детектируется. Причина: дисбаланс 1:23. Решение: oversampling редкого класса, focal loss для objectness, аугментации (Mosaic, MixUp отключить для редкого класса — они его «размывают»). Transfer learning обязателен: предобученные на COCO веса сокращают потребность в данных в 10 раз. Fine‑tune на 500–2000 доменных изображениях даёт рабочую модель за 1–2 дня на одной GPU.
Для edge deployment: экспорт в ONNX → TensorRT engine. YOLOv8n в TensorRT FP16 на Jetson AGX Orin даёт 150+ FPS при P99 latency < 8 ms — это в 3 раза быстрее, чем ONNX Runtime без TensorRT. На сервере A10G: 700+ FPS для YOLOv8n в TensorRT INT8.
Как fine‑tuning YOLO помогает в распознавании образов?
Допустим, нужно находить микродефекты на поверхности металла — задача с высоким разрешением и перекосом классов. Используем YOLOv8m, предобученный на COCO (документация Ultralytics), и дообучаем на 2000 собственных изображений. Применяем аугментации Mosaic, MixUp, random perspective. После 200 эпох mAP 0.5 достигает 0.93. Ключевые приёмы:
-
focal loss для objectness головы — уменьшает вклад легко классифицируемых примеров.
-
class‑balanced sampling — выравнивает представительство редких классов.
-
Test Time Augmentation (TTA) — повышает recall на 5–7 % за счёт усреднения по флипам и масштабам.
Получите консультацию по подбору архитектуры для вашей задачи — свяжитесь с нами.
Сегментация: SAM, Mask R‑CNN и instance segmentation
SAM (Segment Anything Model) от Meta изменил подход к сегментации. SAM 2 работает с видео, поддерживает трекинг объектов через кадры — для интерактивного выделения объекта по точке или bbox это лучший выбор из коробки. Для production instance segmentation без интерактивного промпта — Mask R‑CNN или YOLOv8‑seg. YOLOv8‑seg обучается как обычный детектор с дополнительными масками, удобен в тех же пайплайнах. Семантическая сегментация (каждый пиксель — класс) — SegFormer, DeepLabV3+. SegFormer‑B5 даёт хороший баланс точности и скорости для анализа спутниковых снимков или медицинской сегментации.
Кейс: сегментация клеток на микроскопических изображениях. Датасет 400 изображений с ручной разметкой. Обучение Mask R‑CNN на ResNet‑50 backbone дало IoU 0.61 — плохо. Проблема: объекты (клетки) перекрываются, стандартный NMS убивает перекрывающиеся предсказания. Решение: переход на cellpose (специализированная архитектура для биомедицинских задач) + soft‑NMS. IoU вырос до 0.79.
OCR: когда Tesseract не справляется
Tesseract — отправная точка для простых задач: печатный текст, хорошее освещение, ровное расположение. Как только появляются рукописные элементы, нестандартные шрифты, перспективные искажения или многоколоночный макет — Tesseract деградирует быстро.
PaddleOCR — production‑grade решение: обнаружение текстовых блоков + распознавание + структурный анализ. Работает из коробки для 80+ языков, включая русский. Поддерживает таблицы и документы со сложной структурой. Wikipedia: Оптическое распознавание символов. TrOCR (Microsoft) — трансформерный OCR с сильными результатами на рукописном тексте. Для русского рукописного текста нужен fine‑tuning: базовая модель обучена преимущественно на латинице.
Что делать, если Tesseract не справляется с распознаванием образов на документах?
Для задач «извлеки данные из счёта / договора / паспорта» используем LayoutLMv3 или Donut — эти модели понимают layout документа, а не только текст. Интеграция через Hugging Face Transformers, fine‑tuning на 200–500 размеченных документах. Типичный pipeline:
- Preprocessing: deskew, denoising, binarization через OpenCV.
- Обнаружение текстовых блоков: PaddleOCR detection или CRAFT.
- Распознавание: PaddleOCR recognition или TrOCR.
- Post‑processing: нормализация, валидация через regex или LLM для структурированных полей.
Для документов с фиксированной структурой template matching + OCR точечно по координатам зачастую надёжнее end‑to‑end решения.
Face Recognition: идентификация и верификация
Face recognition = detection + alignment + embedding + matching. Каждый этап важен.
Detection: RetinaFace или InsightFace для точной локализации лица и ключевых точек. MTCNN — более старое, но надёжное решение. Embedding: ArcFace (InsightFace) — state‑of‑the‑art для face recognition embeddings. Модели iresnet50/iresnet100 предобучены на MS1MV3 (5M идентичностей). Эмбеддинг‑вектор 512 float32, сравнение по cosine similarity. Threshold tuning: порог решения — критический параметр. При threshold 0.6 типичный FPR на LFW benchmark — 0.001, TPR — 0.985. В production threshold нужно калибровать под реальный distribution: люди в масках, с изменившейся внешностью, в разных условиях освещения. Liveness detection обязателен: MiniFASNet — lightweight модель на CPU, FaceX‑Zoo содержит несколько предобученных liveness‑детекторов.
Видеоаналитика
Видео — последовательность кадров плюс временное измерение. Наивный подход — детектировать на каждом кадре — дорого.
Трекинг: ByteTrack и BoT‑SORT — стандарт для multi‑object tracking. Работают поверх любого детектора, добавляют persistent ID объектам между кадрами — это даёт подсчёт объектов, треки движения, velocity.
Оптимизация: не нужно обрабатывать каждый кадр. Для статичных сцен детекция на каждом 5–10 кадре, между ними — трекер. Для детекции событий (человек вошёл в зону) background subtraction (OpenCV MOG2) как lightweight pre‑filter перед нейросетевой детекцией. Action Recognition: SlowFast, VideoMAE для классификации действий. Тяжёлые модели — для production используем ONNX export + TensorRT либо оффлайн обработку.
Как измерить качество модели распознавания образов в продакшене?
Мониторинг качества — ключевой элемент MLOps. Отслеживаем:
- распределение prediction confidence;
- долю low‑confidence предсказаний (индикатор OOD‑данных);
- дрейф входных изображений через feature distribution (embeddings из backbone).
Падение средней confidence с 0.87 до 0.71 за неделю — ранний сигнал о distribution shift. NVIDIA Triton Inference Server рекомендует отслеживать эти метрики через Prometheus. Наши сертифицированные инженеры настраивают мониторинг и гарантируют SLA по качеству инференса.
Деплой CV‑моделей
Для онлайн инференса используем Triton Inference Server (NVIDIA) — production‑стандарт для serving CV‑моделей. Поддерживает TensorRT, ONNX, PyTorch, dynamic batching, multiple instances. REST и gRPC API. Гарантируем стабильную работу под нагрузкой.
Edge deployment: ONNX Runtime на ARM/x86 CPU. TensorFlow Lite для мобильных устройств. OpenVINO для Intel CPU/GPU/VPU — даёт 2–3× прирост скорости на Intel железе по сравнению с ONNX Runtime. После деплоя передаём модель с документацией и обучаем персонал.
Что входит в работу
| Этап |
Содержание |
Ориентировочный срок |
| Анализ |
Техническое задание, подбор архитектуры, оценка данных |
3–5 дней |
| Разметка |
Сбор изображений, аннотирование (до 5000 объектов) |
1–3 недели |
| Обучение |
Fine‑tuning модели, валидация на тестовой выборке |
1–2 недели |
| Оптимизация |
Экспорт в ONNX/TensorRT/OpenVINO, тестирование на целевом железе |
1–2 недели |
| Интеграция |
REST/gRPC API, интеграция с существующей инфраструктурой |
1–2 недели |
| Деплой |
Развёртывание на сервере или edge‑устройстве, нагрузочное тестирование |
1 неделя |
| Документация и обучение |
Инструкции, обучение персонала, передача кода и модели |
3–5 дней |
| Поддержка |
Техническая поддержка на 3 месяца после запуска |
— |
Сроки и стоимость
Прототип детектора на существующих данных — 1–2 недели. Production‑система с оптимизацией под целевое железо — 4–8 недель. Полный цикл включая разметку данных (1000–5000 изображений) — 2–4 месяца. Стоимость рассчитывается индивидуально под каждую задачу. Примерная экономия от внедрения системы контроля качества — до 1 млн рублей в месяц на одном производственном участке.
Мы на рынке более 5 лет, реализовали 60+ проектов по компьютерному зрению. Оценим ваш проект под ключ — закажите консультацию, чтобы получить расчёт и техническое предложение.