Разработка системы автоматической инвентаризации через камеры
Представьте: склад с 10 000 SKU, ручная инвентаризация раз в квартал останавливает отгрузки на три дня. Расхождения обнаруживаются постфактум — исправлять их уже поздно. Мы решаем эту проблему системой на компьютерном зрении: камеры анализируют полки в реальном времени, алгоритмы YOLO (You Only Look Once) детектируют каждый товар. Такая система работает без остановки склада и даёт точность до 98%. Для склада с 10 000 SKU экономия от внедрения превышает $18k–26k в год. Ultralytics YOLOv8: Instance Segmentation, Object Detection, and Image Classification.
Как работает камерная инвентаризация?
Стационарные камеры над полками делают снимки по расписанию (каждые 6–12 часов). Изображения проходят через модель обнаружения объектов — мы используем YOLOv8 (обучена на 100+ классах товаров). Результат — список SKU с количеством по каждой полке. Эти данные сверяются с ожидаемыми остатками из ERP. Расхождения фиксируются автоматически, а система может инициировать заказ недостающих позиций. YOLOv8 обрабатывает кадр в 2 раза быстрее предыдущей версии, что критично при потоке в сотни полок. Опционально используется NVIDIA Triton для пакетного инференса — это снижает latency p99 до 50 мс.
Почему точность 92–96% недостаточна и как мы её повышаем?
Для большинства ритейлеров точность 95% приемлема, но при обороте в миллионы долларов каждый процент расхождения — это прямые потери. Мы поднимаем точность до 98% за счёт трёх приёмов:
- Мультиракурсная съёмка: камера делает кадры под разными углами, чтобы перекрыть тени и перекрытия.
- Аугментация данных: модель дообучается на ваших фотографиях с учётом освещения и упаковки.
- Reconciliation с кассовыми данными: система сравнивает физический подсчёт с продажами и автоматически исправляет системные остатки.
Как повысить точность до 98%?
Ключевой приём — мультиракурсная съёмка. Одна камера не видит товары за другими, поэтому мы устанавливаем 2–3 камеры на проход. Для каждого кадра применяем перспективное преобразование, чтобы получить плоский вид полки. Затем объединяем детекции с разных ракурсов, исключая дубликаты по IoU (Intersection over Union). Это снижает ошибки окклюзии на 40%.
Как происходит сверка с системой учёта?
def reconcile(camera_counts: dict, system_counts: dict, tolerance_percent: float = 5.0) -> list[dict]: """Нахождение расхождений между физическим и системным учётом""" discrepancies = [] all_skus = set(camera_counts) | set(system_counts) for sku in all_skus: camera_qty = camera_counts.get(sku, 0) system_qty = system_counts.get(sku, 0) if system_qty > 0: diff_pct = abs(camera_qty - system_qty) / system_qty * 100 else: diff_pct = 100 if camera_qty > 0 else 0 if diff_pct > tolerance_percent: discrepancies.append({ 'sku': sku, 'camera': camera_qty, 'system': system_qty, 'diff_percent': round(diff_pct, 1), 'severity': 'high' if diff_pct > 20 else 'medium' }) return sorted(discrepancies, key=lambda x: x['diff_percent'], reverse=True) Что мы делаем: архитектура и стек
Сердце системы — детектор на базе YOLO (PyTorch). Кадры передаются на сервер с GPU (NVIDIA T4 или A10), инференс занимает <100 мс на изображение. Для плоского представления полок применяем перспективное преобразование OpenCV. Для edge-устройств используем TensorRT — это ускоряет инференс в 1,5 раза без потери точности.
class AutoInventorySystem: def __init__(self, detector_path: str, inventory_db_path: str): self.detector = YOLO(detector_path) self.db = InventoryDatabase(inventory_db_path) def run_inventory_cycle(self, shelf_images: dict) -> InventoryReport: """ shelf_images: {shelf_id: image} - фото всех полок """ report = InventoryReport() for shelf_id, image in shelf_images.items(): shelf_counts = self._count_shelf(image, shelf_id) report.add_shelf(shelf_id, shelf_counts) # Сравнение с ожидаемым остатком expected = self.db.get_expected_quantities() report.discrepancies = self._find_discrepancies( report.actual_counts, expected ) # Автоматическое обновление в ERP self.db.update_inventory(report.actual_counts) return report def _count_shelf(self, image: np.ndarray, shelf_id: str) -> dict: """Подсчёт товаров на одной полке""" detections = self.detector(image, conf=0.45) counts = {} for box in detections[0].boxes: sku = self.detector.model.names[int(box.cls)] counts[sku] = counts.get(sku, 0) + 1 return counts Обработка перспективных искажений
Для shelf-камер с широким углом — коррекция искажений и создание плоского вида полки:
def create_shelf_rectified_view(image: np.ndarray, shelf_corners: list, output_size: tuple = (2000, 400)) -> np.ndarray: """ Плоское (top-down) представление полки для удобного анализа shelf_corners: 4 угла полки в изображении """ pts_src = np.array(shelf_corners, dtype='float32') w, h = output_size pts_dst = np.array([ [0, 0], [w - 1, 0], [w - 1, h - 1], [0, h - 1] ], dtype='float32') M = cv2.getPerspectiveTransform(pts_src, pts_dst) rectified = cv2.warpPerspective(image, M, (w, h)) return rectified Инвентаризация через дроны
Для складов с высокими стеллажами — дрон с камерой:
class DroneInventoryController: def __init__(self, drone_api, inventory_system): self.drone = drone_api self.inventory = inventory_system self.waypoints = [] # заранее запрограммированные точки съёмки async def run_inventory_mission(self) -> InventoryReport: images = {} await self.drone.takeoff() for waypoint in self.waypoints: await self.drone.fly_to(waypoint) await self.drone.stabilize(seconds=1.0) # Фото с нескольких ракурсов для лучшего покрытия for angle_offset in [0, -15, 15]: await self.drone.rotate(angle_offset) image = await self.drone.capture_image() images[f"{waypoint['shelf_id']}_{angle_offset}"] = image await self.drone.land() return self.inventory.run_inventory_cycle(images) Интеграция с ERP/WMS системами
Обновление остатков через API:
import requests class ERPIntegration: def __init__(self, erp_url: str, api_key: str): self.base_url = erp_url self.headers = {'Authorization': f'Bearer {api_key}'} def update_stock_levels(self, inventory: dict, location_id: str) -> dict: """Обновление остатков в ERP системе""" stock_updates = [ { 'sku': sku, 'quantity': qty, 'location_id': location_id, 'source': 'camera_inventory', 'timestamp': get_iso_timestamp() } for sku, qty in inventory.items() ] response = requests.post( f'{self.base_url}/api/inventory/bulk-update', json={'updates': stock_updates}, headers=self.headers ) return response.json() | Тип инвентаризации | Точность | Время |
|---|---|---|
| Стационарные камеры (ритейл) | 92–96% | Постоянно |
| Дрон (склад 1000 м²) | 90–95% | 20–40 мин |
| Мобильный робот | 94–98% | 30–60 мин |
Процесс работы
- Аналитика: обследуем склад, определяем количество полок, ракурсы, освещение. Выбираем оборудование.
- Проектирование: разрабатываем архитектуру (камеры → сервер → ERP). Настраиваем модель YOLO под ваш ассортимент.
- Реализация: монтируем камеры, разворачиваем ПО, пишем интеграцию.
- Тест: пилотный запуск, сверка с ручной инвентаризацией, калибровка.
- Деплой: ввод в промышленную эксплуатацию, обучение персонала.
- Мониторинг и оптимизация: после запуска отслеживаем точность, при необходимости дообучаем модель под новые SKU.
Что входит в работу
- Документация: схема установки камер, API-спецификация, инструкция оператора.
- Обучение: 2 дня для команды склада и 1 день для IT-специалистов.
- Поддержка: гарантия 12 месяцев на ПО, 3 месяца бесплатного сопровождения.
- Метрики: дашборд с точностью, количеством расхождений, временем инвентаризации.
Типичные ошибки и как их избегаем
- Окклюзия: товары перекрывают друг друга. Решение — мультиракурсная съёмка.
- Изменение освещения: модель дообучается на ночных кадрах.
- Новые SKU: автоматическая регистрация через image-поиск (embeddings).
| Масштаб | Срок |
|---|---|
| Склад/магазин, стационарные камеры | 6–9 недель |
| Дроновая система + ERP | 10–16 недель |
| Полноценная автономная система | 16–24 недели |
Стартовая стоимость пилотного проекта для одного склада — от $6k–12k в зависимости от количества камер и сложности интеграции. С нашим опытом (50+ проектов по автоматизации складов) мы гарантируем точность не ниже 95% с первого запуска. Экономия времени на инвентаризацию — до 80%, снижение потерь от расхождений — до 30%. Свяжитесь с нами для предварительной оценки вашего склада — бесплатно. Получите индивидуальный расчёт и пилотный проект — убедитесь в точности системы на реальных данных.







