Разработка системы распознавания товаров на полках (Shelf Monitoring)

Shelf Monitoring — автоматический контроль выкладки товаров в рознице. Мы строим системы компьютерного зрения, которые анализируют каждую полку каждые 15 минут, используя существующие камеры или автономных роботов. По данным IHL Group, out-of-stock обходится ритейлу в $1 трлн в год глобально — это п

Направления AI-разработки

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1441
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1301
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    998
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1267
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    713
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    1006

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%.

Что входит в нашу работу

  1. Аудит текущих процессов и камер — оценка качества изображений, освещения, углов обзора.
  2. Сбор и разметка датасета — минимум 5000 изображений на категорию, контроль качества разметки.
  3. Обучение модели с метриками mAP > 0.9 и recall > 0.85.
  4. Интеграция с WMS/ERP (SAP, 1С, Oracle) через REST API.
  5. Разработка мобильного приложения для Android/iOS с онлайн-анализом.
  6. Визуализация результатов в дашбордах (Grafana, Power BI).
  7. Документация и обучение команды заказчика.
  8. Поддержка 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 недели. Закажите консультацию для обсуждения вашего проекта.