Klasyfikacja danych obrazów za pomocą BigQuery ML

1. Wprowadzenie

W ramach tego ćwiczenia w programie omówimy zastosowanie przechowywania i analizowania obrazów pozycji jogi w BigQuery oraz implementowanie modelu klasyfikacji za pomocą BigQuery ML, aby oznaczać pozycje wyłącznie przy użyciu konstrukcji SQL, bez innej formy kodu.

BigQuery i BQML

BigQuery to bezserwerowa, wielochmurowa hurtownia danych, która może skalować się od bajtów do petabajtów bez dodatkowych kosztów operacyjnych. To świetny wybór do przechowywania danych do trenowania systemów uczących się. Wbudowane funkcje systemów uczących się BigQuery ( BQML) i możliwości analityki pozwalają też tworzyć prognozy bez kodu za pomocą zapytań SQL. Możesz też uzyskać dostęp do danych ze źródeł zewnętrznych za pomocą sfederowanych zapytań, dzięki czemu nie musisz używać skomplikowanych potoków ETL. Więcej informacji na temat wszystkich możliwości BigQuery znajdziesz na stronie BigQuery.

Jak dotąd BigQuery określamy jako w pełni zarządzaną hurtownię danych w chmurze, która pomaga użytkownikom analizować uporządkowane i częściowo uporządkowane dane. Ale:

  • Rozszerzyliśmy BigQuery o obsługę wszystkich analiz i systemów uczących się także w przypadku nieuporządkowanych danych
  • Możemy używać zapytań SQL do przeprowadzania wnikliwych analiz, analiz oraz uczenia maszynowego na dużą skalę w przypadku obrazów, filmów, plików dźwiękowych itd. bez konieczności pisania dodatkowego kodu.
  • Możemy łączyć uporządkowane i nieuporządkowane dane tak, jakby istniały one razem w tabeli

Omówimy to w następnej sekcji przy użyciu klasyfikacji pozycji jogi.

Klasyfikacja danych obrazów za pomocą BigQuery ML

Możliwość przetwarzania i analizowania obrazów za pomocą uporządkowanych zapytań w taki sposób, jakby były to uporządkowane dane, to pierwsza tego rodzaju funkcja. Teraz możemy nawet prognozować wyniki za pomocą modeli klasyfikacji systemów uczących się przy użyciu BigQuery ML. Aby ułatwić zrozumienie, zawęziłem kolejne etapy do 5 etapów:

fe97945bce996e1.jpeg

Powyższe kroki mogą być skomplikowane, jeśli spojrzymy na nie tylko jako na etykiety. Szczegółowe informacje o poszczególnych komponentach, takich jak zbiór danych BigQuery, połączenie z BigLake, zasobniki Cloud Storage (kontenery), tabela obiektów (zewnętrzne źródło danych), BQML itp., są zdefiniowane w sekcji implementacji. Nie zniechęcaj się więc, jeśli nie znasz jeszcze tych pojęć.

Co utworzysz

Utworzysz model klasyfikacji danych obrazów z użyciem BQML, który obejmuje te elementy:

  • Zbiór danych BigQuery zawierający komponenty tabeli i modelu
  • Zasobnik Google Cloud Storage (GCS) do przechowywania obrazów z jogi dla modelu
  • Tabela zewnętrzna umożliwiająca dostęp do obrazów w Cloud Storage
  • Połączenie BigLake z tabelą zewnętrzną umożliwiającą dostęp do obrazów w GCS
  • Model ResNet w BigQuery ML
  • Wnioskowanie z użyciem utworzonego modelu
  • SQL BigQuery do analizy danych obrazu
  • BigQuery SQL do wysyłania zapytań obejmujących uporządkowane i nieuporządkowane dane jednocześnie

Czego się nauczysz

  • Jak utworzyć zasobnik Cloud Storage i przechowywać obrazy
  • Jak utworzyć zbiór danych, tabelę i połączenie BigQuery
  • Jak utworzyć model klasyfikacji danych obrazów za pomocą BQML
  • Jak prognozować z użyciem utworzonego modelu przy użyciu BigQuery ML
  • Jak tworzyć zapytania dotyczące obrazów i łączyć je z uporządkowanymi danymi za pomocą zapytań SQL w BigQuery

2. Wymagania

  • przeglądarki, na przykład Chrome lub Firefox;
  • Projekt Google Cloud z włączonymi płatnościami, który obejmuje usługi BigQuery, Cloud Storage i BigLake Connection
  • W następnej sekcji znajdziesz listę czynności, które musisz wykonać, aby utworzyć aplikację do klasyfikacji danych obrazów

3. Tworzenie zbioru danych i połączenia BigLake

Na potrzeby wykrywania obrazów 5 pozycji jogi skorzystaliśmy z publicznie dostępnego zbioru danych, do którego możesz uzyskać dostęp z tego repozytorium. Pozycje jogi, które zidentyfikujemy, to Downdog, Goddess, Plank, Tree i Wojownik 2. Zanim zaczniesz tworzyć zbiór danych BigQuery, wybierz lub utwórz projekt Google Cloud i sprawdź, czy są w nim włączone płatności. Włącz BigQuery API i BigQuery Connection API. Pamiętaj, że wszystkie usługi używane w tej implementacji powinny znajdować się w tym samym regionie.

a. Tworzenie zbioru danych „yoga_set” w ten sposób:

Otwórz edytor BigQuery i wpisz polecenie:

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

b. Połączenie BigLake umożliwia nam połączenie z zewnętrznym źródłem danych przy zachowaniu szczegółowej kontroli dostępu i zabezpieczeń w BigQuery – w naszym przypadku do przechowywania danych obrazu w Cloud Storage. Użyjemy tego połączenia do odczytu obiektów z Cloud Storage. Wykonaj poniższe czynności, aby utworzyć połączenie BigLake.

W panelu Eksplorator na stronie BigQuery kliknij DODAJ DANE:

4cb42b1245bb0ba6.png„Dodaj dane zewnętrzne” w BigQuery Ekran

Kliknij Połączenia z zewnętrznymi źródłami danych i wybierz opcję BigLake i Funkcje zdalne:

9ffec2b2bfcc3cd5.pngSkonfiguruj połączenie z zewnętrznym źródłem danych

Podaj identyfikator połączenia i utwórz połączenie. Pamiętaj o zapisaniu identyfikatora konta usługi, który będzie wyświetlany na ekranie po utworzeniu połączenia <<SERVICE_ACCOUNT>>. W naszym przykładzie identyfikator połączenia to „yoga-pose-conn”. Pamiętaj o regionie.

4. Utwórz zasobnik Google Cloud Storage i przyznaj uprawnienia

Wykorzystamy zasobnik Google Cloud Storage do przechowywania plików graficznych póz jogi, na których chcemy utworzyć model. Zasobniki to kontenery Cloud Storage zawierające obrazy, które będziemy analizować.

a. Otwórz Google Cloud Storage, wyszukując go w konsoli, a potem kliknij Zasobniki, aby przejść na stronę główną zasobników, i kliknij UTWÓRZ.

a6f6b26cffb53ae0.pngStrona zasobników Google Cloud Storage

b. Na stronie „Tworzenie zasobnika” wpisz informacje o zasobniku (unikalną nazwę), a następnie upewnij się, że jest on w tym samym regionie co zbiór danych i połączenie omówione powyżej, a potem kliknij Utwórz.

1280366a42b7bdf6.pngGoogle Cloud Storage – strona tworzenia zasobnika

Zanim przejdziesz do następnego kroku, zapisz swoje konto usługi, nazwę zasobnika i ścieżkę.

c. Po utworzeniu zasobnika zapisz obrazy (za pomocą konsoli lub poleceń Cloud Shell albo automatycznie) i przyznaj kontu usługi połączenia (zapisane wcześniej) niezbędne uprawnienia, aby uzyskać do nich dostęp.

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

5. Utwórz tabelę obiektów

Utwórz zewnętrzną tabelę obiektów z BigQuery, aby uzyskać dostęp do nieuporządkowanych danych w zasobniku za pomocą utworzonego połączenia. Uruchom to polecenie CREATE SQL z edytora 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"]);

Tabela zewnętrzna jest tworzona w następujący sposób:

bda48f566e0c292f.png

Zadajmy szybkie zapytanie o pozycję z nowo utworzonej tabeli zewnętrznej:

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

Jak widać na zrzucie ekranu poniżej, możesz tworzyć obrazy nieuporządkowane i obsługiwać na nich jak uporządkowane dane:

7D1784122b5013f.png

Teraz wyeksportujmy pokazany powyżej wynik zapytania do małego fragmentu Pythona, aby zwizualizować ten wynik:

Kliknij ZAPISZ WYNIKI i wybierz „Plik lokalny CSV”. aby wyeksportować wynik. Następnie otwórz notatnik Colab (lub utwórz go) i wpisz poniższy kod:

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)

Wykonaj polecenie, by zobaczyć wynik podany poniżej:

b8edd68cb281786a.png

Utworzyliśmy tabelę zewnętrzną i uzyskaliśmy dostęp do obrazów z Cloud Storage tylko przy użyciu zapytań SQL. Teraz przejdźmy do następnej sekcji, która dotyczy tworzenia modelu klasyfikacji.

6. Tworzenie modelu i przesyłanie go do Google Cloud Storage

W tej implementacji użyjemy już wytrenowanego modelu ResNet 50 do wnioskowania na podstawie utworzonej właśnie tabeli obiektów. Model ResNet 50 analizuje pliki graficzne i generuje grupę wektorów reprezentujących prawdopodobieństwo, że obraz należy do odpowiedniej klasy (logitów).

Zanim przejdziesz do tego kroku, sprawdź, czy masz wszystkie niezbędne uprawnienia. Następnie wykonaj te czynności:

  1. Pobierz model z tej lokalizacji i zapisz go w swoim lokalnym
  2. Powinien rozpakować plik do pliku saved_model.pb i folderu zmiennych.
  3. Prześlij te 2 elementy (plik i folder) do zasobnika, który utworzyliśmy w poprzedniej sekcji

2629ff3eda214946.pngZasobnik Google Cloud Storage „yoga_images” z przesłanymi plikami modelu ResNet

Po zakończeniu tego kroku pliki związane z modelem powinny znajdować się w tym samym zasobniku co obrazy, co widać na powyższej ilustracji.

7. Wczytywanie modelu do BQML i wnioskowanie

W tym kroku wczytamy model do tego samego zbioru danych BigQuery co tabela zewnętrzna utworzona wcześniej i zastosujemy go do obrazów przechowywanych w Cloud Storage.

a. W edytorze BigQuery uruchom następującą instrukcję SQL

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

Po zakończeniu wykonywania (co może zająć trochę czasu w zależności od zbioru danych) model pojawi się na liście w sekcji Zbiór danych w BigQuery.

435fa0919aeb57a6.pngZbiór danych BigQuery wyświetlający utworzony model

b. Sprawdź model, aby zobaczyć jego pola wejściowe i wyjściowe.

Rozwiń zbiór danych i kliknij utworzony właśnie model „yoga_poses_resnet”. Kliknij kartę Schemat:

e88928764f10f6ff.pngKarta schematu definicji modelu BigQuery

W sekcji Etykiety zobaczysz atrybut „Aktywacja_49”. , które reprezentuje pole wyjściowe. W sekcji Funkcje zobaczysz „input_1”. reprezentuje pole, które powinno zawierać dane wejściowe modelu. Odwołasz się do „input_1” w zapytaniu służącym do wnioskowania (lub w zapytaniu prognozowania) jako pola przekazywanego w ramach „testu” i skalowalnych danych.

c. Określ swoją pozycję jogi

Użyjmy utworzonego właśnie modelu do klasyfikowania danych obrazów testowych. Upewnij się, że masz obrazy testowe (pozycje jogi) z zasobnika Cloud Storage, które trafiły do tabeli zewnętrznej w momencie jej utworzenia. Będziemy wybiórczo wysyłać zapytania o te obrazy testowe w BigQuery, aby przeprowadzić wnioskowanie za pomocą utworzonego właśnie modelu BQML. Aby uruchomić test, użyj zapytania poniżej.

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')));

W powyższym zapytaniu wybieramy 1 obraz testowy, który zawiera określoną wartość identyfikatora URI (00000097.jpg) w tabeli zewnętrznej. Ponadto część SELECT korzysta z konstrukcji ML.DECODE_IMAGE jako pola „input_1”. aby funkcja ML.PREDICT działała.

Po zakończeniu wykonywania zobaczysz taki efekt:

867018993845e943.png

Osoby, które znają model ResNet, powinny ułatwić zrozumienie klasyfikacji. W przeciwnym razie zakodujmy krótki fragment, który ułatwi wizualne zapoznanie się z klasyfikacją.

d. Spłaszczenie wyniku

Jednym ze sposobów wizualizacji powyższych danych wyjściowych jest spłaszczenie wartości polaActivation_49 za pomocą konstrukcji UNNEST w BigQuery SQL. Aby ujednolicić wynik z poprzedniego kroku, możesz skorzystać z poniższego zapytania. Jeśli chcesz dodatkowo oznaczyć etykietą wynikową klasę, możesz użyć logiki w miejscu obiektu zastępczego <<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;

Bez logiki etykietowania klas poniżej znajdziesz wyniki zapytania:

71f580f41f0811f3.png

W moim przypadku jednak zastosowano przykładową logikę. Oto wynik:

1c6df6ecd14fba1.png

Możesz dowiedzieć się więcej o modelu i zastosować logikę, która najlepiej sprawdzi się w przypadku Twoich danych i danych wyjściowych modelu.

e. Wizualizacja wnioskowania

Na koniec mamy krótki fragment Pythona, który zwizualizuje wynik klasyfikacji. Wyeksportuj powyższy wynik zapytania do pliku CSV i odwołaj się do niego w kodzie Pythona.

68756e7e4b8d7a29.png

Powyższy obraz wyjściowy odnosi się do pozycji jogi – „pies w dół”. to dokładnie te same dane wejściowe testowe, które przekazaliśmy do zapytania ML.PREDICT na potrzeby klasyfikacji za pomocą BQML.

8. Ujednolicenie danych uporządkowanych i nieuporządkowanych

Ulubioną częścią tej implementacji jest ujednolicenie pól z ustrukturyzowanej tabeli relacyjnej z tymi nieuporządkowanymi danymi obrazu. Utworzyłem uporządkowaną tabelę BigQuery w tym samym zbiorze danych co tabela zewnętrzna, aby przechowywać w niej pozycję i dane dotyczące stanu.

125bdf848c86fbe.pngUporządkowana tabela BigQuery „yoga_health” Schemat

Ilustracja powyżej przedstawia schemat tabeli uporządkowanych danych o nazwie „yoga_health” a te aspekty to „pozyta”, „koncentracja”, „zdrowie_korzyści” i „oddech”. To zapytanie złącza zarówno uporządkowane, jak i nieuporządkowane dane:

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)];

Oto wynik:

469bdfcffa9e19fd.png

Uwaga: wszystkie zapytania omówione na tym blogu można uruchamiać bezpośrednio z notatnika w języku Python za pomocą poleceń BigQuery Magic.

9. Czyszczenie danych

Wykonaj te czynności, aby uniknąć obciążenia konta Google Cloud opłatami za zasoby zużyte w tym poście.

  1. W konsoli Google Cloud otwórz stronę Zarządzanie zasobami.
  2. Na liście projektów wybierz projekt do usunięcia, a potem kliknij Usuń
  3. W oknie wpisz identyfikator projektu i kliknij Wyłącz, aby usunąć projekt.

10. Gratulacje

Gratulacje! Udało Ci się zapisać nieuporządkowane dane w BigQuery, wykonać zapytanie dotyczące ich nieuporządkowanych danych, utworzyć model klasyfikacji przy użyciu BQML i zaplanować testowe pozycje jogi za pomocą modelu. Jeśli chcesz to wdrożyć, zacznij od projektu Google Cloud. Jeśli chcesz dowiedzieć się więcej o bazach danych lub innych kompleksowych implementacjach aplikacji w Google Cloud, zajrzyj na moje blogi.