Классификация данных изображений с помощью BigQuery ML

1. Введение

В этой лаборатории кода мы обсудим вариант использования хранения и анализа изображений поз йоги в BigQuery и реализации модели классификации с помощью BigQuery ML для маркировки поз с использованием только конструкций SQL и никакой другой формы кода.

BigQuery и BQML

BigQuery — это бессерверное мультиоблачное хранилище данных, которое может масштабироваться от байтов до петабайтов с нулевыми эксплуатационными расходами. Это делает его отличным выбором для хранения данных обучения ML. Кроме того, встроенные возможности машинного обучения BigQuery ( BQML ) и аналитики позволяют создавать прогнозы без кода, используя только запросы SQL. Вы можете получить доступ к данным из внешних источников с помощью федеративных запросов, устраняя необходимость в сложных конвейерах ETL. Подробнее обо всем, что может предложить BigQuery, вы можете прочитать на странице BigQuery.

До сих пор мы знали BigQuery как полностью управляемое облачное хранилище данных, которое помогает пользователям анализировать структурированные и полуструктурированные данные. Но,

  • BigQuery расширился и теперь может выполнять всю аналитику и машинное обучение на неструктурированных данных.
  • Мы можем использовать SQL-запросы для выполнения глубокого анализа, аналитики и машинного обучения изображений, видео, аудио и т. д. в любом масштабе без необходимости писать дополнительный код.
  • У нас есть возможность объединять структурированные и неструктурированные данные, как если бы они все существовали вместе в таблице.

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

Классификация данных изображений с помощью BigQuery ML

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

fe97945bce996e1.jpeg

Вышеупомянутые шаги могут оказаться сложными, если рассматривать их просто как ярлыки. Детали каждого из задействованных компонентов, таких как набор данных BigQuery, соединение BigLake, сегменты облачного хранилища (контейнеры), таблица объектов (внешний источник данных), BQML и т. д., определены в разделе реализации. Так что не расстраивайтесь, если вы еще не знакомы с этими терминами.

Что ты построишь

Вы создадите модель классификации данных изображения с помощью BQML, охватывающую следующее:

  • Набор данных BigQuery, содержащий компоненты таблицы и модели.
  • Бак Google Cloud Storage (GCS) для хранения изображений Yoga для модели
  • Внешняя таблица для доступа к образам облачного хранилища
  • Соединение BigLake для внешней таблицы для доступа к изображениям в GCS.
  • Модель ResNet в BigQuery ML
  • Вывод с использованием созданной модели
  • BigQuery SQL для анализа данных изображений
  • BigQuery SQL для одновременного запроса структурированных и неструктурированных данных.

Что вы узнаете

  • Как создать корзину облачного хранилища и хранить изображения
  • Как создать набор данных, таблицу и соединение BigQuery
  • Как создать модель классификации данных изображения с помощью BQML
  • Как прогнозировать с помощью созданной модели с помощью BigQuery ML
  • Как запрашивать изображения и комбинировать их со структурированными данными с помощью BigQuery SQL

2. Требования

  • Браузер, например Chrome или Firefox.
  • Проект Google Cloud с включенной оплатой, содержащий ваши сервисы BigQuery, Cloud Storage и BigLake Connection.
  • В следующем разделе приведен список шагов по созданию приложения классификации данных изображений.

3. Создайте набор данных и подключение к BigLake.

Для нашего случая обнаружения изображений 5 поз йоги я использовал общедоступный набор данных , и вы можете получить доступ к набору данных из этого репозитория . Позы йоги, которые мы определяем, ограничены: «Собака вниз», «Богиня», «Планка», «Дерево» и «Воин2». Прежде чем приступить к созданию набора данных BigQuery, обязательно выберите или создайте проект Google Cloud и проверьте, включено ли в проекте выставление счетов . Включите BigQuery API и BigQuery Connection API. Обратите внимание, что все службы, используемые в этой реализации, должны находиться в одном и том же выбранном регионе.

а. Создайте набор данных «yoga_set», выполнив шаги, показанные ниже:

Перейдите в редактор BigQuery и введите команду:

CREATE SCHEMA `<<project_id>>.yoga_set`;

б. BigLake Connection позволяет нам подключать внешний источник данных, сохраняя при этом детальный контроль доступа и безопасность BigQuery, которым в нашем случае является облачное хранилище для данных изображения. Мы будем использовать это соединение для чтения объектов из Cloud Storage. Следуйте инструкциям ниже, чтобы создать соединение BigLake.

Нажмите «ДОБАВИТЬ ДАННЫЕ» на панели «Проводник» страницы BigQuery:

4cb42b1245bb0ba6.png Экран BigQuery «Добавить внешние данные»

Нажмите «Подключения к внешним источникам данных» и выберите опцию BigLake и удаленные функции:

9ffec2b2bfcc3cd5.png Настройка подключения к внешнему источнику данных

Укажите идентификатор соединения и создайте соединение. Не забудьте записать идентификатор учетной записи службы, который будет отображаться на экране после создания соединения <<SERVICE_ACCOUNT>>. В нашем примере идентификатор соединения — «yoga-pose-conn». Не забудьте указать регион.

4. Создайте корзину Google Cloud Storage и предоставьте разрешения.

Мы собираемся использовать корзину Google Cloud Storage для хранения файлов изображений поз йоги, на которых мы хотим создать модель. Бакеты — это контейнеры облачного хранилища, в которых хранятся изображения, которые мы собираемся проанализировать.

а. Перейдите в Google Cloud Storage, выполнив поиск в консоли, затем нажмите Buckets, чтобы перейти на домашнюю страницу Buckets, и нажмите СОЗДАТЬ.

a6f6b26cffb53ae0.png Страница сегментов облачного хранилища Google

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

1280366a42b7bdf6.png Google Cloud Storage Создать страницу корзины

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

в. После создания сегмента сохраните свои изображения (с помощью команд консоли, Cloud Shell или программно) и предоставьте необходимые разрешения сервисному аккаунту подключения (который мы сохранили ранее) для доступа к изображениям.

> export sa=<<"SERVICE_ACCOUNT">>
> gsutil iam ch serviceAccount:$sa:objectViewer "gs://<<bucket>>"

5. Создайте таблицу объектов

Создайте таблицу внешних объектов из BigQuery, чтобы получить доступ к неструктурированным данным в сегменте с помощью созданного нами соединения. Запустите приведенную ниже команду CREATE SQL из редактора BigQuery:

CREATE OR REPLACE EXTERNAL TABLE `<<dataset>>.<<table_name>>`
WITH CONNECTION `us.<<connection-name>>`
OPTIONS(
object_metadata="SIMPLE", uris=["gs://<<bucket>>/<<folder_if_exists>>/*.jpg"]);

Внешняя таблица создается, как показано ниже:

bda48f566e0c292f.png

Давайте быстро запросим позу из вновь созданной внешней таблицы:

SELECT data , uri
FROM `yoga_set.yoga_poses`
WHERE REGEXP_CONTAINS(uri, 'gs://yoga_images/Downdog')
Limit 1;

Как вы можете видеть на скриншоте ниже, вы можете создавать и работать с неструктурированными изображениями, как если бы они были структурированными данными:

7d1784122b5013f.png

Теперь давайте экспортируем результат запроса, приведенный выше, в небольшой фрагмент Python, чтобы визуализировать результат:

Нажмите СОХРАНИТЬ РЕЗУЛЬТАТЫ и выберите опцию «Локальный файл CSV», чтобы экспортировать результат. Затем откройте свой блокнот Colab (или создайте его ) и введите код ниже.

from IPython.display import display
from PIL import Image
import io
import pandas as pd
import base64
df = pd.read_csv('/content/sample_data/<<your_csv>>')
imgdata = base64.b64decode(str(df.data[0]))
image = Image.open(io.BytesIO(imgdata))
display(image)

Выполните, чтобы увидеть результат, как показано ниже:

b8edd68cb281786a.png

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

6. Создайте модель и загрузите ее в облачное хранилище Google.

В этой реализации мы собираемся использовать предварительно обученную модель ResNet 50 для выполнения вывода по только что созданной таблице объектов. Модель ResNet 50 анализирует файлы изображений и выводит пакет векторов, представляющих вероятность того, что изображение принадлежит соответствующему классу (логиты).

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

  1. Загрузите модель из этого места и сохраните ее на своем локальном компьютере.
  2. Он должен распаковаться в save_model.pb и папку переменных.
  3. Загрузите эти два файла (файл и папку) в корзину, которую мы создали в предыдущем разделе.

2629ff3eda214946.png Ведро Google Cloud Storage "yoga_images" с загруженными файлами модели ResNet.

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

7. Загрузите модель в BQML и сделайте вывод.

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

а. В редакторе BigQuery выполните следующий оператор SQL

CREATE MODEL `<<Dataset>>.<<Model_Name>>`
OPTIONS(
model_type = 'TENSORFLOW',
model_path = 'gs://<<Bucket>>/*');

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

435fa0919aeb57a6.png Набор данных BigQuery со списком созданной модели.

б. Осмотрите модель, чтобы увидеть ее поля ввода и вывода.

Разверните набор данных и щелкните только что созданную модель «yoga_poses_resnet». Откройте вкладку «Схема»:

e88928764f10f6ff.png Вкладка «Схема определения модели BigQuery»

В разделе «Метки» вы видите поле «activation_49», которое представляет поле вывода. В разделе «Функции» вы можете увидеть «вход_1», который представляет поле, которое, как ожидается, будет введено в модель. Вы будете ссылаться на «input_1» в своем запросе вывода (или запросе прогнозирования) как поле, которое вы передаете для своих «тестовых» данных.

в. Сделайте вывод о своей позе йоги!

Давайте воспользуемся только что созданной моделью для классификации данных нашего тестового изображения. Убедитесь, что у вас есть несколько тестовых изображений (поз йоги), идентифицированных из вашего сегмента облачного хранилища, которые попали во внешнюю таблицу при ее создании. Мы собираемся выборочно запросить эти тестовые изображения в BigQuery, чтобы выполнить вывод с использованием только что созданной модели BQML. Используйте приведенный ниже запрос, чтобы запустить тест.

SELECT *
FROM ML.PREDICT(
MODEL yoga_set.yoga_poses_resnet,
(SELECT uri, ML.DECODE_IMAGE(data) AS input_1
FROM yoga_set.yoga_poses where REGEXP_CONTAINS(uri,
'gs://yoga_images/Downdog/00000097.jpg')));

В приведенном выше запросе мы выбираем одно тестовое изображение, которое содержит определенное значение URI (00000097.jpg) во внешней таблице. Кроме того, часть SELECT использует конструкцию ML.DECODE_IMAGE в качестве поля «input_1», чтобы функция ML.PREDICT работала.

После завершения выполнения вы увидите результат, как показано ниже:

867018993845e943.png

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

д. Сглаживание результата

Один из способов визуализации приведенного выше вывода — сгладить значения поля активации_49 с помощью конструкции UNNEST BigQuery SQL. Пожалуйста, обратитесь к запросу ниже, чтобы сгладить результат предыдущего шага. Если вы хотите дополнительно пометить результирующий класс текстом, вы можете ввести логику вместо заполнителя <<LABEL_LOGIC>> в запросе (раскомментируйте при использовании).

with predictions as (
SELECT
Uri, data, SPLIT(uri, "/")[OFFSET(ARRAY_LENGTH(SPLIT(uri, "/")) - 1)] as img,  
i as label_i,
<<LABEL_LOGIC>> label,
Score
FROM ML.PREDICT(
MODEL yoga_set.yoga_poses_resnet,
(SELECT data, uri, ML.DECODE_IMAGE(data) AS input_1
FROM yoga_set.yoga_poses 
WHERE
REGEXP_CONTAINS(uri,'gs://yoga_images/Goddess/00000007.jpg'))),
UNNEST(activation_49) as score WITH OFFSET i)
SELECT * FROM predictions 
ORDER BY score DESC
LIMIT  5;

Без логики маркировки классов ниже приведены выходные данные запроса:

71f580f41f0811f3.png

Однако в моем случае я применил пример логики, и ниже приведен результат:

1c6df6ecd14fba1.png

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

е. Визуализация вывода

Наконец, небольшой фрагмент Python для визуализации результата классификации! Экспортируйте приведенный выше результат запроса в файл CSV и укажите его в коде Python.

68756e7e4b8d7a29.png

Вывод изображения выше относится к позе йоги «Собака вниз», которая представляет собой точно такой же тестовый ввод, который мы передали в запрос ML.PREDICT для классификации с использованием BQML!

8. Объединение структурированных и неструктурированных данных

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

125bdf848c86fbe.png Схема структурированной таблицы BigQuery «yoga_health»

На изображении выше представлена ​​схема таблицы структурированных данных с именем «yoga_health», а поля — поза, фокус, health_benefit и дыхание. Приведенный ниже запрос объединяет как структурированные, так и неструктурированные данные:

SELECT SPLIT(uri, "/")[OFFSET(ARRAY_LENGTH(SPLIT(uri, "/")) - 2)] as pose,
a.health_benefit, breath, focus, data
FROM `abis-345004.yoga_set.yoga_health` a, yoga_set.yoga_poses b
WHERE a.pose = SPLIT(uri, "/")[OFFSET(ARRAY_LENGTH(SPLIT(uri, "/")) - 2)];

Ниже приведен результат:

469bdfcffa9e19fd.png

Примечание. Все запросы, которые мы рассмотрели в этом блоге, можно выполнить непосредственно из вашего блокнота Python с помощью команд BigQuery Magic .

9. Очистка

Чтобы избежать списания средств с вашей учетной записи Google Cloud за ресурсы, используемые в этом посте, выполните следующие действия.

  1. В консоли Google Cloud перейдите на страницу «Управление ресурсами».
  2. В списке проектов выберите проект, который хотите удалить, и нажмите «Удалить».
  3. В диалоговом окне введите идентификатор проекта и нажмите «Завершить работу», чтобы удалить проект.

10. Поздравления

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