Розробка системи автоматичної інвентаризації через камери
Уявіть: склад з 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%. Зв'яжіться з нами для попередньої оцінки вашого складу — безкоштовно. Отримайте індивідуальний розрахунок і пілотний проект — переконайтеся в точності системи на реальних даних.







