Пользовательское обнаружение объектов YOLOv7 с помощью TensorFlow.js

Обучение пользовательской модели YOLOv7 в PyTorch и преобразование ее в TensorFlow.js для автономного обнаружения в реальном времени в браузере.

Недавно я открыл реализацию YOLOv7 в Tensorflow.js, и самый распространенный вопрос, который я получил, был:

Как вы преобразовали модель из PyTorch в Tensorflow.js?

Этот пост расскажет об этом процессе, решив реальную проблему с помощью пользовательской модели YOLOv7, работающей непосредственно в браузере и в автономном режиме.

Мы будем заниматься физической розничной торговлей. Помимо цифровизации, которая произошла в последнее время — в основном во время пандемии — физический магазин остается самым предпочтительным местом для покупок покупателей.

В магазине все зависит от опыта. Retail Feedback Group (RFG), которая отслеживает покупательский опыт в продуктовых магазинах уже около 15 лет, постоянно приходит к выводу, что наиболее важным фактором, влияющим на удовлетворенность клиентов, является то, могут ли покупатели найти все, что им нужно, во время посещения магазина. посетите, будь то в магазине или в Интернете.

Поэтому розничные продавцы постоянно сосредоточены на обеспечении наличия товаров и правильном сочетании товаров для своих покупателей.

В предыдущей статье я показал, как создать модель TensorFlow.js для распознавания SKU. В этом посте мы рассмотрим, как определить пустые полки с помощью пользовательской модели YOLOv7 — все это работает в режиме реального времени, в автономном режиме и в браузере смартфона.

О чем будет этот пост:

  • Настройка среды;
  • Сбор данных;
  • Подготовка модели к обучению;
  • Обучение и репараметризация модели;
  • Оценка модели;
  • Преобразование в TensorFlow.js;
  • Развертывание модели в веб-браузере.

Настройка среды

Весь конвейер обучения будет выполняться с использованием бесплатного графического процессора, предоставляемого Google Colab. Если вы хотите получить доступ к блокноту со всеми объединенными шагами, нажмите здесь.

Сбор данных

Набор данных, который мы будем использовать для обучения модели, — Пустые полки в рознице — дефицит (Лицензия CC0 1.0). Он имеет 3608 аннотаций из 1155 изображений и уникальный класс: Stockout.

Аннотации должны быть в формате YOLOv7, где каждому изображению соответствует свой файл txt. Первое значение в каждой строке представляет класс — для набора данных Stockout все классы одинаковы и равны 0. Остальные четыре числа в строке указывают координаты ограничивающей рамки.

Если вы хотите создать свой собственный набор данных, вы можете использовать такой инструмент, как CVAT.

Для загрузки и извлечения набора данных об отсутствии товаров используйте следующий код:

Подготовка модели к обучению

Первый шаг — клонировать репозиторий YOLOv7 и установить зависимости:

Затем загрузите веса, предварительно обученные в COCO 2017 Dataset. Они будут использоваться для инициализации модели и ускорения обучения — этот метод известен как перенос обучения.

Поскольку мы работаем над задачей одного класса, мы выбрали YOLOv7-tiny, упрощенную версию YOLOv7.

И перед началом обучения нам нужно настроить файл .yaml с параметрами, которые мы хотим использовать.

Обучение и репараметризация модели

Процесс обучения прост и настраивается, что позволяет вам настраивать такие параметры, как количество эпох и пакетов, в соответствии с требованиями вашего набора данных.

К концу выполнения у вас будут сохранены веса в yolov7/runs/train/your-model-name/weights/best.pt.

Чтобы просмотреть показатели обучения в наглядном формате, запустите TensorBoard или откройте изображение yolov7/runs/train/your-model-name/results.png.

Теперь, когда вы обучили модель, пришло время перепараметризировать веса для логического вывода.

Наряду с оптимизацией архитектуры для обнаружения объектов в реальном времени, YOLOv7 представляет дополнительные модули и методы, которые могут повысить эффективность обучения и повысить точность обнаружения объектов. Эти модули, известные как бесплатные пакеты, должны быть оптимизированы для эффективного вывода. Для получения дополнительной информации см. Модельную бумагу.

Проверьте путь веса в приведенном ниже коде и выполните его, чтобы сгенерировать репараметризованную модель.

Оценка модели

Теперь, когда модель оптимизирована для логического вывода, пришло время запустить ее на некоторых тестовых изображениях, чтобы проверить, обнаруживает ли она пустые места на полках.

Преобразование в TensorFlow.js

Преобразование модели может быть сложной задачей, так как требует прохождения нескольких преобразований: PyTorch в ONNX, ONNX в TensorFlow и, наконец, TensorFlow в TensorFlow.js.

Следующий код будет обрабатывать все за вас. Просто убедитесь, что пути модели правильно настроены, а затем запустите его!

По завершении полученная модель TensorFlow.js будет автоматически загружена Google Colab.

Предполагая, что все выполнено успешно, модель теперь будет преобразована в формат слоев TensorFlow.js.

Папка, загруженная на ваш локальный компьютер, должна содержать файл model.json и набор файлов сегментированных весов в двоичном формате. В файле model.json есть как топология модели (она же «архитектура» или «граф»: описание слоев и их связи), так и манифест файлов весов.

└ stockout_web_model
  ├── group1-shard1of6.bin
  ├── group1-shard2of6.bin
  ├── group1-shard3of6.bin
  ├── group1-shard4of6.bin
  ├── group1-shard5of6.bin
  ├── group1-shard6of6.bin
  └── model.json

Развертывание модели

Теперь модель готова для загрузки в JavaScript. Как упоминалось в начале, я открыл исходный код YOLOv7 на JavaScript. Следовательно, мы можем использовать тот же репозиторий и заменить модель на ту, которую мы только что обучили.

Клонируем репозиторий:

git clone https://github.com/hugozanini/yolov7-tfjs.git

Установите пакеты:

npm install

Перейдите в папку public и пройдите обучение модели. У вас должна получиться такая структура:

├── git-media
├── index.html
├── LICENSE
├── node_modules
├── package.json
├── public
│    ├── stockout_web_model
│    └── yolov7_web_model
├── README.MD
└── src

Перейдите в src/App.jsx и измените название модели на line 29 на stockout:

  const modelName = "stockout";

Для запуска приложения перейдите в корневую папку и выполните следующую команду:

npm start

Локальный сервер будет запущен, и вы должны увидеть что-то похожее на это:

Эта модель также была развернута в CodesSandbox. Перейдите по ссылке ниже, чтобы увидеть, как она работает.



С YOLOv7 можно обнаружить до 80 различных классов. Для компаний, работающих в сфере розничной торговли, это дает прекрасную возможность улучшить реализацию своих продуктов в магазине.

Обучив модель распознавать все продукты своей компании, розничные продавцы могут убедиться, что их товары правильно размещены на полках, а покупатели смогут легко найти то, что ищут.

Чтобы проверить эффективность обученной модели, я пошел в продуктовый магазин и аптеку со своим телефоном и записал несколько примеров работы детектора в режиме реального времени.

На видео ниже вы можете убедиться в способности решения точно обнаруживать пустые полки в реальных условиях.

Детектор дефицита в сочетании с моделью распознавания SKU может значительно повысить эффективность и результативность розничных операций.

Хотя существуют облачные решения, иногда они могут работать медленно: обработка одного обнаружения занимает до 24 часов. Для сравнения, использование моделей TensorFlow.js в браузере смартфона обеспечивает офлайн-распознавание в режиме реального времени, что позволяет компаниям принимать более немедленные решения и быстрее реагировать на дефицит товаров.

В целом, сочетание детектора дефицита с моделью распознавания SKU может обеспечить эффективный способ оптимизации розничных операций и повышения покупательского опыта для покупателей. Используя возможности анализа в реальном времени и автономного распознавания, предприятия могут принимать обоснованные решения и быстро реагировать на меняющиеся условия.

Если у вас есть какие-либо вопросы или вы хотите поделиться пользовательским кейсом, свяжитесь со мной в Linkedin или Twitter. Весь исходный код, использованный в этом посте, доступен в репозитории проекта.

Спасибо за прочтение :)