BigQuery ML ile Görüntü Verileri Sınıflandırma

1. Giriş

Bu codelab'de, BigQuery'de yoga pozlarının resimlerini depolama ve analiz etme ile pozları yalnızca SQL yapılarını kullanarak ve başka hiçbir kod biçimi kullanmadan etiketlemek için BigQuery ML ile bir sınıflandırma modeli uygulama kullanım alanını ele alacağız.

BigQuery ve BQML

BigQuery, sunucusuz ve çoklu bulut veri ambarıdır. İşletim yükü olmadan bayttan petabayta kadar ölçeklenebilir. Bu nedenle, makine öğrenimi eğitim verilerini depolamak için mükemmel bir seçimdir. Ayrıca, yerleşik BigQuery Machine Learning ( BQML) ve analiz özellikleri sayesinde yalnızca SQL sorgularını kullanarak kod yazmadan tahminler oluşturabilirsiniz. Ayrıca, birleştirilmiş sorgularla harici kaynaklardaki verilere erişebilir, böylece karmaşık ETL ardışık düzenlerine gerek kalmaz. BigQuery'nin sunduğu tüm özellikler hakkında daha fazla bilgiyi BigQuery sayfasında bulabilirsiniz.

Şimdiye kadar BigQuery'yi, kullanıcıların yapılandırılmış ve yarı yapılandırılmış verileri analiz etmesine yardımcı olan, tümüyle yönetilen bir bulut veri ambarı olarak biliyorduk. Ancak,

  • BigQuery, yapılandırılmamış verilerde de tüm analiz ve makine öğrenimi işlemlerini gerçekleştirecek şekilde genişletildi.
  • Ek kod yazmamıza gerek kalmadan resimler, videolar, sesler vb. üzerinde büyük ölçekte analiz, analiz ve makine öğrenimi yapmak için SQL sorgularını kullanabiliriz.
  • Yapılandırılmış ve yapılandırılmamış verileri, hepsi bir tabloda birlikte bulunuyormuş gibi birleştirebiliriz.

Bunları, bir sonraki bölümde ele alınan Yoga Pozu Sınıflandırması kullanım alanımızda tartışacağız.

BigQuery ML ile Görüntü Verisi Sınıflandırması

Yapılandırılmış sorgular kullanarak görüntüleri yapılandırılmış veri gibi işleme ve analiz etme özelliği, türünün ilk örneğidir. Artık BigQuery ML'yi kullanarak makine öğrenimi sınıflandırma modelleriyle sonuçları bile tahmin edebiliriz. İşlemi kolayca anlayabilmeniz için 5 adıma ayırdım:

fe97945bce996e1.jpeg

Yukarıdaki adımlar, yalnızca etiket olarak değerlendirildiğinde karmaşık olabilir. BigQuery veri kümesi, BigLake bağlantısı, Cloud Storage paketleri (kapsayıcılar), nesne tablosu (harici veri kaynağı), BQML vb. gibi ilgili bileşenlerin her birinin ayrıntıları uygulama bölümünde tanımlanmıştır. Bu nedenle, bu terimleri henüz bilmiyorsanız cesaretinizi kaybetmeyin.

Ne oluşturacaksınız?

Aşağıdaki konuları kapsayan bir BQML görüntü verisi sınıflandırma modeli oluşturacaksınız:

  • Tablo ve model bileşenlerini içerecek bir BigQuery veri kümesi
  • Model için Yoga resimlerini depolamak üzere Google Cloud Storage (GCS) paketi
  • Cloud Storage görüntülerine erişmek için harici tablo
  • GCS'deki resimlere erişmek için harici tabloya yönelik bir BigLake bağlantısı
  • BigQuery ML'deki ResNet modeli
  • Oluşturulan modeli kullanarak çıkarım yapma
  • Görüntü verilerini analiz etmek için BigQuery SQL
  • Yapılandırılmış ve yapılandırılmamış verileri birlikte sorgulamak için BigQuery SQL

Neler öğreneceksiniz?

  • Cloud Storage paketi oluşturma ve resim depolama
  • BigQuery veri kümesi, tablosu ve bağlantısı oluşturma
  • BQML kullanarak görüntü verisi sınıflandırma modeli oluşturma
  • BigQuery ML kullanarak oluşturulan modelle tahmin yapma
  • BigQuery SQL'lerini kullanarak resimleri sorgulama ve yapılandırılmış verilerle birleştirme

2. Şartlar

  • Chrome veya Firefox gibi bir tarayıcı
  • BigQuery, Cloud Storage ve BigLake Connection hizmetlerinizi içeren, faturalandırmanın etkin olduğu bir Google Cloud projesi
  • Bir sonraki bölümde, resim verisi sınıflandırma uygulamasını oluşturma adımlarının listesi yer almaktadır.

3. Veri kümesi ve BigLake bağlantısı oluşturma

5 yoga pozunun görüntü algılama kullanım alanımız için herkese açık veri kümesini kullandım. Veri kümesine bu depodan erişebilirsiniz. Tanımladığımız yoga pozları; Aşağı Bakan Köpek, Tanrıça, Plank, Ağaç ve Savaşçı 2 ile sınırlıdır. BigQuery veri kümesi oluşturma işlemine başlamadan önce bir Google Cloud projesi seçtiğinizden veya oluşturduğunuzdan ve projede faturalandırmanın etkinleştirildiğinden emin olun. BigQuery API ve BigQuery Connection API'yi etkinleştirin. Lütfen bu uygulamada kullanılan tüm hizmetlerin aynı bölgede olması gerektiğini unutmayın.

a. Aşağıda gösterilen adımları kullanarak "yoga_set" veri kümesini oluşturun:

BigQuery Düzenleyici'ye gidin ve komutu yazın:

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

b. BigLake Bağlantısı, ayrıntılı BigQuery erişim denetimini ve güvenliğini korurken harici veri kaynağını bağlamamıza olanak tanır. Bu durumda, görüntü verileri için Cloud Storage kullanılır. Cloud Storage'dan nesne okumak için bu bağlantıyı kullanacağız. BigLake bağlantısı oluşturmak için aşağıdaki adımları uygulayın.

BigQuery sayfasının Gezgin bölmesinde VERİ EKLE'yi tıklayın:

4cb42b1245bb0ba6.pngBigQuery "Harici Veri Ekle" ekranı

Harici veri kaynaklarına bağlantılar'ı tıklayın ve BigLake ile Uzak işlevler seçeneğini belirleyin:

9ffec2b2bfcc3cd5.pngHarici Veri Kaynağı Bağlantısını Yapılandırma

Bağlantı kimliğini girin ve bağlantıyı oluşturun. Bağlantı oluşturulduktan sonra ekranda gösterilecek hizmet hesabı kimliğini (<<SERVICE_ACCOUNT>>) not etmeyi unutmayın. Örneğimizde bağlantı kimliği "yoga-pose-conn"dur. Bölgeyi not etmeyi unutmayın.

4. Google Cloud Storage paketi oluşturma ve izin verme

Modeli oluşturmak istediğimiz yoga pozlarının resim dosyalarını içeren bir Google Cloud Storage paketi kullanacağız. Paketler, analiz edeceğimiz görüntüleri içeren Cloud Storage container'larıdır.

a. Konsolda arayarak Google Cloud Storage'a gidin, ardından Paketler ana sayfasına gitmek için Paketler'i ve OLUŞTUR'u tıklayın.

a6f6b26cffb53ae0.pngGoogle Cloud Storage Paketleri Sayfası

b. Bucket oluşturma sayfasında, bucket bilgilerinizi (benzersiz bir ad) girin ve devam edin. Bu bilgilerin, yukarıdaki adımlarda bahsedilen veri kümesi ve bağlantıyla aynı bölgede olduğundan emin olun ve oluştur'u tıklayın.

1280366a42b7bdf6.pngGoogle Cloud Storage paketi oluşturma sayfası

Bir sonraki adıma geçmeden önce hizmet hesabınızı, paket adınızı ve yolunuzu not aldığınızdan emin olun.

c. Paket oluşturulduktan sonra resimlerinizi depolayın (konsol veya Cloud Shell komutları ya da programatik olarak) ve bağlantının hizmet hesabının (daha önce kaydettiğimiz) resimlere erişmesi için gerekli izinleri verin.

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

5. Nesne tablosu oluşturma

Oluşturduğumuz bağlantıyı kullanarak paketteki yapılandırılmamış verilere erişmek için BigQuery'den harici bir nesne tablosu oluşturun. BigQuery Düzenleyici'den aşağıdaki CREATE SQL'i çalıştırın:

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

Harici tablo, aşağıda gösterildiği gibi oluşturulur:

bda48f566e0c292f.png

Yeni oluşturulan harici tablodan hızlıca bir poz sorgulayalım:

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

Aşağıdaki ekran görüntüsünde görebileceğiniz gibi, yapılandırılmamış resimleri yapılandırılmış veriler gibi oluşturabilir ve üzerinde işlem yapabilirsiniz:

7d1784122b5013f.png

Şimdi de sonucu görselleştirmek için yukarıdaki sorgu sonucunu küçük bir Python snippet'ine aktaralım:

SONUÇLARI KAYDET'i tıklayın ve sonucu dışa aktarmak için "CSV Localfile" (CSV Yerel Dosya) seçeneğini belirleyin. Ardından Colab not defterinizi açın (veya bir tane oluşturun) ve aşağıdaki kodu yazın.

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)

Sonucu aşağıdaki gibi görmek için yürütün:

b8edd68cb281786a.png

Harici tabloyu oluşturup Cloud Storage'daki görüntülere yalnızca SQL sorgularını kullanarak eriştiğimize göre, sınıflandırma modelini oluşturma konusunu ele aldığımız bir sonraki bölüme geçebiliriz.

6. Modeli oluşturma ve Google Cloud Storage'a yükleme

Bu uygulama için, yeni oluşturduğumuz nesne tablosunda çıkarım çalıştırmak üzere önceden eğitilmiş ResNet 50 Modelini kullanacağız. ResNet 50 modeli, resim dosyalarını analiz eder ve bir resmin ilgili sınıfa ait olma olasılığını (logits) temsil eden bir vektör grubu oluşturur.

Bu adıma geçmeden önce gerekli tüm izinlere sahip olduğunuzdan emin olun. Ardından aşağıdaki adımları uygulayın:

  1. Modeli bu konumdan indirip yerel olarak kaydedin.
  2. saved_model.pb ve bir değişkenler klasörüne açılmalıdır.
  3. Bu ikisini (dosya ve klasör) önceki bölümde oluşturduğumuz pakete yükleyin.

2629ff3eda214946.pngResNet Model dosyalarının yüklendiği "yoga_images" adlı Google Cloud Storage paketi

Bu adım tamamlandıktan sonra, modelle ilgili dosyalarınız yukarıdaki resimde gösterildiği gibi resimlerinizle aynı pakette yer almalıdır.

7. Modeli BQML'ye yükleme ve çıkarım yapma

Bu adımda, modeli daha önce oluşturduğumuz harici tabloyla aynı BigQuery veri kümesine yükleyeceğiz ve Cloud Storage'da depoladığımız resimlere uygulayacağız.

a. BigQuery Düzenleyici'den aşağıdaki SQL ifadesini çalıştırın.

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

Yürütme tamamlandıktan sonra (veri kümenize bağlı olarak biraz zaman alabilir) modeli BigQuery'deki Veri Kümesi bölümünde görürsünüz.

435fa0919aeb57a6.pngOluşturulan modeli listeleyen BigQuery veri kümesi

b. Giriş ve çıkış alanlarını görmek için modeli inceleyin.

Veri kümesini genişletin ve yeni oluşturduğumuz "yoga_poses_resnet" modelini tıklayın. Şema sekmesini tıklayın:

e88928764f10f6ff.pngBigQuery Model Tanımı Şeması Sekmesi

Etiketler bölümünde, çıkış alanını temsil eden "activation_49" alanını görürsünüz. Özellikler bölümünde, modele girilmesi beklenen alanı temsil eden "input_1"i görebilirsiniz. Çıkarım sorgunuzda (veya tahmin sorgunuzda) "test" verileriniz için ilettiğiniz alan olarak "input_1"e referans vereceksiniz.

c. Yoga pozunuzu tahmin edin

Test görüntü verilerimizi sınıflandırmak için az önce oluşturduğumuz modeli kullanalım. Cloud Storage paketinizi kullanarak tanımladığınız ve oluşturduğumuzda harici tabloya eklenen bazı test resimleriniz (yoga pozları) olduğundan emin olun. Yeni oluşturduğumuz BQML modelini kullanarak çıkarım gerçekleştirmek için BigQuery'de bu test resimlerini seçerek sorgulayacağız. Testi tetiklemek için aşağıdaki sorguyu kullanın.

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

Yukarıdaki sorguda, harici tabloda belirli bir URI değerini (00000097.jpg) içerdiği tanımlanan bir test resmi seçiyoruz. Ayrıca, SELECT bölümü, ML.PREDICT işlevinin çalışması için "input_1" alanı olarak ML.DECODE_IMAGE yapısını kullanır.

Yürütme tamamlandığında sonucu aşağıdaki gibi görürsünüz:

867018993845e943.png

ResNet modelini ayrıntılı olarak bilenler için bu, sınıflandırmayı anlamaya yardımcı olacaktır. Aksi takdirde, sınıflandırmayı görsel olarak anlamak için küçük bir snippet kodlayalım.

d. Sonucu düzleştirme

Yukarıdaki çıktıyı görselleştirmenin bir yolu, BigQuery SQL'in UNNEST yapısını kullanarak activation_49 alan değerlerini düzleştirmektir. Önceki adımdaki sonucu düzleştirmek için lütfen aşağıdaki sorguya bakın. Elde edilen sınıfı metin olarak daha fazla etiketlemek istiyorsanız sorgudaki yer tutucu <<LABEL_LOGIC>> yerine mantığı ekleyebilirsiniz (kullanırken yorum satırını kaldırın).

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;

Sınıf etiketleme mantığı olmadan sorgunun çıktısı aşağıdadır:

71f580f41f0811f3.png

Ancak benim durumumda örnek bir mantık uyguladım ve sonuç aşağıda verilmiştir:

1c6df6ecd14fba1.png

Model hakkında daha fazla bilgi edinebilir ve verilerinizle model çıktısına en uygun mantığı uygulayabilirsiniz.

e. Çıkarımı görselleştirme

Son olarak, sınıflandırmanın sonucunu görselleştirmek için kısa bir Python snippet'i. Yukarıdaki sorgu sonucunu CSV dosyasına aktarın ve Python kodunda buna referans verin.

68756e7e4b8d7a29.png

Yukarıdaki görüntü çıkışı, Yoga Pozu "Aşağı Bakan Köpek"i ifade ediyor. Bu, BQML kullanılarak sınıflandırma için ML.PREDICT sorgusuna ilettiğimiz test girişiyle tamamen aynıdır.

8. Yapılandırılmış ve Yapılandırılmamış Verileri Birleştirme

Son olarak, bu uygulamanın en sevdiğim kısmı, yapılandırılmış ilişkisel tablomdaki alanları bu yapılandırılmamış resim verileriyle birleştirmek. Pozu ve sağlıkla ilgili verilerini tutmak için harici tabloyla aynı veri kümesinde yapılandırılmış bir BigQuery tablosu oluşturdum.

125bdf848c86fbe.pngBigQuery Yapılandırılmış Tablo "yoga_health" Şeması

Yukarıdaki resimde, "yoga_health" adlı yapılandırılmış veri tablosunun şeması gösterilmektedir. Alanlar ise poz, odak, sağlık_faydası ve nefes şeklindedir. Aşağıdaki sorgu hem yapılandırılmış hem de yapılandırılmamış verileri birleştirir:

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

Sonuç aşağıda verilmiştir:

469bdfcffa9e19fd.png

Not: Bu blogda ele aldığımız tüm sorgular, BigQuery Magic komutları kullanılarak doğrudan Python not defterinizden çalıştırılabilir.

9. Temizleme

Bu yayında kullanılan kaynaklar için Google Cloud hesabınızın ücretlendirilmesini istemiyorsanız şu adımları uygulayın.

  1. Google Cloud Console'da Kaynakları yönetin sayfasına gidin.
  2. Proje listesinde silmek istediğiniz projeyi seçin ve Sil'i tıklayın.
  3. İletişim kutusunda proje kimliğini yazın ve projeyi silmek için Kapat'ı tıklayın.

10. Tebrikler

Tebrikler! BigQuery'de yapılandırılmamış verileri başarıyla depoladınız ve sorguladınız, BQML kullanarak bir sınıflandırma modeli oluşturdunuz ve modelle test yoga pozlarını tahmin ettiniz. Bu özelliği uygulamak istiyorsanız Google Cloud projenizi kullanmaya başlayın. Ayrıca, Google Cloud'daki veritabanları veya diğer uçtan uca uygulama uygulamaları hakkında daha fazla bilgi edinmek istiyorsanız lütfen bloglarımı ziyaret edin.