Часть 1: исследование Google Adidas Shoe Finder
Часть 2: создание набора продуктов для поиска продуктов Google Cloud Vision
Часть 3: обнаружение и отслеживание объектов с помощью Firebase ML Kit и cameraX
Часть 4. Использование поиска продуктов Google Cloud Vision в Android

В первой части этой серии мы обсудили широкую техническую реализацию приложения, аналогичного демонстрации Google Adidas для поиска обуви от Google I / O. Мы увидели, что можем объединить готовые к использованию сервисы Google, чтобы создать мощное приложение для поиска и настроить систему таким образом, чтобы минимизировать расходы, связанные с облачным сервисом Google.

Во второй части мы рассмотрим настройку Google Cloud Vision Product Search. Как всегда, Google отлично поработал над созданием документации для сервиса, поэтому я сосредоточусь на подводных камнях, с которыми я столкнулся, и общих советах (примечание от будущего меня: Focus не сработал, это довольно полное руководство).

Шаг 1. Создайте проект Google Cloud

Поскольку в части 3 нам понадобится проект Firebase, самый простой способ создать проект Google Cloud - перейти на https://console.firebase.google.com/ и создать там новый проект. Каждый проект Firebase жестко привязан к проекту Google Cloud.

Шаг 2. Включите биллинг

Вам нужно будет активировать выставление счетов (то есть привязать кредитную карту) для этого проекта, чтобы использовать любую из служб Cloud Vision. Как обсуждалось в части 1, первые 1000 запросов и первые 1000 изображений продуктов ежемесячно бесплатны. После этого вам нужно будет платить 4,50 доллара за каждые последующие 1000 запросов. Это также означает, что услуга станет дорогостоящей в масштабе, если не будет реализована правильно!

Чтобы не использовать сложную консоль Google Cloud Console, вы можете просто обновить свой проект Firebase с плана «Spark» до плана «Blaze» в консоли (нижний левый угол). Все бесплатные бонусы по-прежнему включены, поэтому для вас нет никаких проблем.

Шаг 2. Включите API

Легкая часть. Перейдите по этой ссылке и выберите свой проект.

Шаг 3. Станьте любителем данных

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

Для каждого товара нам понадобится хотя бы одно изображение. Высокое качество и разрешение? Здорово! Несколько изображений под разными углами? Потрясающий!

Вы можете связать столько изображений с одним продуктом, сколько захотите. Продукт должен быть единственным предметом на изображении, в идеале - белым фоном и никак иначе. Имейте в виду, что бесплатно предоставляется только 1000 изображений, поэтому вы достигли предела бесплатного уровня, если у вас есть 10 продуктов по 100 изображений в каждом.

Каждому продукту можно присвоить идентификатор продукта. Товары также могут иметь набор тегов, например бренд = Adidas или бренд = Nike. Эти теги, к сожалению, не будут отображаться вместе с результатами поиска, но вы можете использовать их, чтобы позволить Google фильтровать результаты за вас, чтобы вы получали обратно только релевантные элементы.

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

Шаг 4. Загрузите изображения

Далее: перетащите все собранные изображения в корзину Google Cloud Storage. Вы также можете сделать это в консоли Firebase. Просто выберите «Хранилище» в меню навигации и используйте «Загрузить файлы», чтобы загрузить все свои изображения. Сделанный.

Шаг 5. Создайте CSV-файл с вашими продуктами

Нам нужно создать файл CSV с 8 столбцами:

  • image-uri: Uri изображения в Google Cloud. Это должен быть gs:// Uri. Вы можете найти их в консоли Firebase, выбрав изображение в разделе «Расположение файла».
  • image-id: уникальный идентификатор изображения. Вы можете установить его или оставить пустым, чтобы Google создал идентификатор.
  • product-set-id: Это важный вопрос. Он должен быть одинаковым для всех продуктов. Вы можете использовать другой идентификатор, если хотите создать второй набор продуктов.
  • product-id: идентификатор продукта. Если у вас есть несколько изображений продукта, убедитесь, что вы используете один и тот же идентификатор продукта для всех изображений.
  • product-category: Один из homegoods, apparel или toys. Мы выбрали apparel, так как обувь является подразделом этой категории согласно документации.
  • product-display-name: Необязательно для вас. Удобочитаемое название продукта.
  • labels: Необязательно. Упомянутые выше ярлыки. Вы можете указать несколько значений для одной и той же метки. Они не обязательны, поэтому вы также можете оставить этот столбец пустым. Ярлыки передаются в синтаксисе label=value,otherLabel=otherValue, поэтому они должны содержать только буквенно-цифровые символы или быть закодированы в URL-адресе. Важно: столбец метки не должен превышать 128 байт (как и любой другой столбец).
  • bounding-poly: Необязательно. Если вы выбираете хорошие изображения продуктов, на которых нет ничего другого, вы можете пропустить это. См. Документацию, если вы хотите его использовать.

Обязательно заключите столбцы в кавычки - мы не хотим, чтобы случайные запятые разрушали нашу файловую структуру. Файл CSV должен выглядеть так:

Шаг 6. Загрузите файл CSV

Легкий. Загрузите файл CSV в Google Cloud Storage, просто поместите его рядом с изображениями и скопируйте gs:// Uri.

Шаг 7. Импортируйте свой набор продуктов в Google Cloud Vision

Мы можем использовать образцы из документации. Я использовал предоставленный фрагмент node.js. Чтобы использовать это:

  • Перейдите в консоль Firebase, щелкните значок шестеренки в верхнем левом углу и выберите «Настройки проекта». Выберите «Serive Accounts» и нажмите «Generate new Keypair». Будет загружен файл JSON.
  • запустить export GOOGLE_APPLICATION_CREDENTIALS="/path/to/the/file.json" в Терминале
  • запустить npm install @google/cloud-vision
  • создайте новый файл import.js и с этим содержимым:
  • Замените your-project-id идентификатором своего проекта Google. Вы можете найти его в настройках вашего проекта Firebase.
  • Замените your-location ближайшим к вам местом в Google Cloud. Я использую europe-west1 (Бельгия)
  • Замените gs://link/to/csv на gs:// Uri загруженного файла CSV.
  • Запускаем node upload.js и ждем. Обязательно проверьте ответ на наличие кодов ошибок. Для каждой строки вашего CSV-файла будет отображаться запись об ошибках в этой строке.

Шаг 8: ожидание

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

Индексация может занять до часа (для больших наборов даже больше), и в это время вам нечего делать.

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

Обратите внимание на индексное время. Индексировать время в 1970 году? Не готов!

Шаг 9: счастье

Как только list.js сообщит нам действительное время индексации, мы сможем протестировать обнаружение продукта. Мы создаем другой файл test.js с таким содержимым:

Не забудьте заменить все заполнители в строке 1. Некоторые значения будут взяты из вашего CSV-файла, например идентификатор набора продуктов. Используйте изображение на своем компьютере и укажите путь в your-test-image-path. Если все прошло хорошо, товар подходит! Наслаждаться!

Небольшое замечание после того, как мы немного поработали с API

Шаг 10: Печаль. Я столкнулся с некоторыми проблемами с приведенным выше сценарием, поскольку он возвращает код ошибки 5 (нет подходящих продуктов) для каждого совпадения для некоторых из моих тестовых наборов продуктов. Тот же образ, запускаемый через REST Api с использованием cUrl, приводит к совпадению. Я еще не понял проблему, так как сценарий, кажется, работает для некоторых наборов продуктов, но не работает для других ... Так что будьте осторожны и в случае сомнений вернитесь к cUrl:

Дополнительные мысли и передовой опыт

Этикетки

Как обсуждалось в шаге 5, мы можем добавлять этикетки к любому продукту. Это очень мощно. Во-первых, мы можем добавить фильтр в наш поиск, чтобы сообщить Google, что мы ищем, например только «мужские» вещи или «сумочки» и таким образом не дают получить кучу нерелевантных результатов. Во-вторых, что, возможно, более важно, мы получим все ярлыки текущего продукта вместе с продуктом, если он будет сопоставлен. Это позволяет нам использовать метки для предварительного просмотра данных в нашем пользовательском интерфейсе, не запрашивая нашу базу данных о продукте. Это сэкономит нам и пользователю время ожидания.

Столбец меток в CSV (как и любой другой столбец) может содержать до 128 символов. Это то место, которое у нас есть, и мы должны его упаковать! Из-за синтаксиса столбца меток мы не можем включать запятые в наши метки. Я действительно удостоверился, что у меня нет признаков, способных нарушить синтаксис, просто URL-адресом, кодирующим все ярлыки. Возможно, в этом нет необходимости, но я избавился от необходимости проверять, какие символы нравятся Google, а какие нет (как немец, я думаю, например, об умляутах). На этом отметке: поскольку мы не можем добавлять переводы к нашим данным, мы не должны помещать сюда фактический текст, а на самом деле только метаданные, которые в идеале не меняются слишком часто.

Описания

Если вы пропустите пакетный импорт CSV, вы также можете добавлять товары по одному. Это позволяет вам также добавлять описание к вашим продуктам. Я еще не пробовал это, так как в этом не было необходимости, но это могло быть очень мощно. Данные JSON в описании? Я не уверен в максимальном размере этого поля. Как и в случае ограничения столбца CSV, в документах Google нет слова (или я не смог его найти), но я предполагаю, что применяется тот же предел в 128 байт, поскольку сообщение об ошибке казалось довольно универсальным, в котором говорилось, что нет ключа или значения ( значение кажется столбцом в CSV) может превышать 128 байт.

Если кто-то попробует это сделать, оставьте комментарий.

Обновление ваших данных

Google также предлагает API для обновления ваших продуктов. Изменения вносятся только каждые 30 минут, поэтому может пройти некоторое время, прежде чем вы увидите результаты после внесения изменений. По моему опыту, 30 минут иногда могут быть 60…

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

Время индексации

Как упоминалось выше, наборы продуктов индексируются каждые 30–60 минут. Именно столько времени требуется, чтобы любые изменения (включая первоначальное создание) стали доступны. Обязательно проверьте время индекса в ответе списка, чтобы узнать, когда набор продуктов был обновлен.

Вывод

Если вы следовали этому руководству, теперь у вас будет готовый продукт, установленный в Google Cloud, который мы сможем использовать в следующей части. Обязательно используйте метки, чтобы передать как можно больше данных в ваше приложение. Эти данные предоставляются бесплатно при каждом совпадении, и мы можем использовать их для отображения пользовательского интерфейса при загрузке дополнительной информации о сопоставленных элементах из нашей базы данных. Давайте двигаться дальше!