Распознавание товаров в руках покупателя в магазине
Amazon Go открылся в 2018 году и до сих пор вызывает вопрос: как система вообще знает, что я взял с полки и положил в корзину, а не передумал и вернул? Ответ — не одна камера и не одна модель, а синхронизированная работа детекции, трекинга и распознавания на десятках потоков одновременно. Это одна из самых технически насыщенных retail-CV задач.
Что значит «распознать товар в руке»
Задача состоит из нескольких подзадач:
- Детекция факта взятия товара с полки — рука пересекла зону полки, что-то взяла
- Идентификация товара — что именно взяли: SKU-level распознавание
- Трекинг покупателя — привязать взятый товар к конкретному человеку
- Детекция возврата на полку — взяли → посмотрели → положили обратно
Каждая из этих подзадач нетривиальна. Вместе они создают задачу, которую Amazon решала 4+ лет до коммерческого запуска.
Глубокий разбор: детекция взаимодействия рука-товар
Hand detection и рука-объект контакт
Первый шаг: найти руки в кадре. MediaPipe Hands — хорошо для изолированных рук, но в ретейле руки часто частично закрыты полкой, другими товарами, телом покупателя. Специализированный hand detector: 100DOH (Hand-Object Detector) или EgoHands dataset fine-tuned модель работает лучше в заслонённых сценах.
После детекции рук — распознавание контакта рука-объект. Это не просто пространственное перекрытие боксов: нужно понять, держит ли рука объект или просто находится рядом. Подходы:
- Bounding box overlap + velocity analysis: объект движется синхронно с рукой → контакт
- Contact state classification: отдельный классификатор на паре (hand crop, object crop) → держит/не держит
- Pose estimation: ладонь сомкнута вокруг объекта — детекция захвата через hand keypoints
SKU-level recognition: самая сложная часть
Магазин — это 5 000–50 000 уникальных SKU. Классификатор на 50 000 классов — нереалистично без специальных техник.
Эффективный подход: metric learning + open-set recognition. Вместо закрытой классификации — embeddings, где похожие товары близко в пространстве. Добавление нового SKU = добавление одного эталонного embeddings без переобучения модели.
Backbone: ConvNeXt-Small или EfficientNet-B4 с ArcFace loss, обученный на каталоге товаров (студийные фото). Few-shot recognition: 1–5 эталонных фото на SKU достаточно для надёжной идентификации. На internal benchmark (2 000 SKU бакалейного магазина, условия реального магазина): top-1 accuracy 0.87, top-3 accuracy 0.96.
Дополнительно: штрихкод/QR-код как backup channel. Если товар в руке расположен удобно — CV считывает код напрямую через ZXing или ZBar интегрированный в pipeline. Confidence-based fusion: если barcode читается с confidence > 0.98 → использовать его, иначе → visual recognition.
Инфраструктура для магазина
Плотность камер: для надёжного покрытия зон полок — 1 камера на 1.5–2 м² площади полок. Это много. Магазин 200 м² торговой площади → 30–50 камер. Overhead камеры (смотрят сверху) дополняют боковые.
Вычисления: централизованный GPU сервер (4× NVIDIA A10 для магазина 200 м²) обрабатывает все потоки. DeepStream SDK для multi-stream pipeline, TensorRT для оптимизированного инференса.
Синхронизация: все камеры синхронизированы по времени (PTP, IEEE 1588) с точностью < 1 ms — критично для трекинга между камерами.
Ограничения и реалистичные ожидания
Честно о сложностях:
- Ошибки при схожих упаковках: два варианта одного товара (классический/лайт) — сложнее всего
- Частичная видимость: покупатель закрывает товар телом — inevitable gap
- Возвраты на чужую полку: детектировали взятие, трекали, но положили в другое место
Точность на уровне Amazon Go (~99%+ по их заявлению) требует дополнительных сенсоров — весовые датчики на полках снимают неопределённость: убыло N граммов → взяли 1 пачку конкретного товара. CV + весы = значительно выше точность, чем чистое CV.
Сроки
Pilot-система для зоны 20–30 м² с ограниченным ассортиментом (200–500 SKU): 10–16 недель. Полноценная система магазина 100+ м² с интеграцией в кассу/POS: 5–9 месяцев.







