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:

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
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:
BigQuery "Harici Veri Ekle" ekranı
Harici veri kaynaklarına bağlantılar'ı tıklayın ve BigLake ile Uzak işlevler seçeneğini belirleyin:
Harici 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.
Google 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.
Google 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:

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:

Ş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:

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:
- Modeli bu konumdan indirip yerel olarak kaydedin.
- saved_model.pb ve bir değişkenler klasörüne açılmalıdır.
- Bu ikisini (dosya ve klasör) önceki bölümde oluşturduğumuz pakete yükleyin.
ResNet 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.
Oluş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:
BigQuery 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:

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:

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

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.

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.
BigQuery 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:

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.
- Google Cloud Console'da Kaynakları yönetin sayfasına gidin.
- Proje listesinde silmek istediğiniz projeyi seçin ve Sil'i tıklayın.
- İ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.