Разработка системы автоматической инвентаризации через камеры
Представьте: склад с 10 000 SKU, ручная инвентаризация раз в квартал останавливает отгрузки на три дня. Расхождения обнаруживаются постфактум — исправлять их уже поздно. Мы решаем эту проблему системой на компьютерном зрении: камеры анализируют полки в реальном времени, алгоритмы YOLO (You Only Look Once) детектируют каждый товар. Такая система работает без остановки склада и даёт точность до 98%. Для склада с 10 000 SKU экономия от внедрения превышает 2 млн рублей в год. 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 недели |
Стартовая стоимость пилотного проекта для одного склада — от 600 000 до 1 200 000 рублей в зависимости от количества камер и сложности интеграции. С нашим опытом (50+ проектов по автоматизации складов) мы гарантируем точность не ниже 95% с первого запуска. Экономия времени на инвентаризацию — до 80%, снижение потерь от расхождений — до 30%. Свяжитесь с нами для предварительной оценки вашего склада — бесплатно. Получите индивидуальный расчёт и пилотный проект — убедитесь в точности системы на реальных данных.







