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 тижні. Замовте консультацію для обговорення вашого проекту.







