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

1. Giriş

Bu codelab'de, BigQuery'de Yoga Pozları'nın resimlerini depolayıp analiz etmenin ve pozları yalnızca SQL yapıları kullanarak ve başka hiçbir kod biçimi kullanarak etiketlemek için BigQuery ML ile sınıflandırma modeli uygulamanın kullanım alanını tartışacağız.

BigQuery ve BQML

BigQuery, ek işlem yükü olmadan baytlardan petabaytlara kadar ölçeklendirilebilen sunucusuz, çoklu bulut veri ambarıdır. Bu yönüyle makine öğrenimi eğitim verilerinin depolanması için mükemmel bir seçimdir. Ayrıca, yerleşik BigQuery Makine Öğrenimi ( BQML) ve analiz özellikleri, yalnızca SQL sorgularını kullanarak kodsuz tahminler oluşturmanıza olanak tanır. Ayrıca, birleşik sorgularla harici kaynaklardan gelen verilere erişebilir, böylece karmaşık ETL ardışık düzenlerine olan ihtiyacı ortadan kaldırabilirsiniz. BigQuery'nin sunduğu tüm özellikler hakkında daha fazla bilgiyi BigQuery sayfasında bulabilirsiniz.

BigQuery'yi bugüne kadar 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 tanıdık. Ancak,

  • BigQuery, tüm analizleri ve makine öğrenimini yapılandırılmamış veriler üzerinde de gerçekleştirecek şekilde genişletildi
  • Ek kod yazmak zorunda kalmadan görüntü, video, ses vb. üzerinde geniş ölçekte bilgilendirici analiz, analiz ve makine öğrenimi gerçekleştirmek için SQL sorgularını kullanabiliriz
  • Yapılandırılmış ve yapılandırılmamış verileri, hepsi bir tabloda varmış gibi birleştirebiliyoruz.

Bunları bir sonraki bölümde ele alınan Yoga Duru Sınıflandırma kullanım örneğimizde ele alacağız.

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

Resimleri, yapılandırılmış veriler gibi yapılandırılmış sorgular kullanarak işleyip analiz etme imkanı ilk kez yaşanmıştır. Artık BigQuery ML yardımıyla makine öğrenimi sınıflandırma modelleri aracılığıyla sonuçları tahmin edebiliyoruz. Kolay anlaşılması için ilgili aşamaları 5 adıma indirdim:

fe97945bce996e1.jpeg

Yalnızca etiketler olarak bakıyorsak yukarıdaki adımlar karmaşık olabilir. BigQuery veri kümesi, BigLake bağlantısı, Cloud Storage paketleri (Container'lar), Nesne Tablosu (Harici veri kaynağı), BQML vb. gibi bileşenlerin her birinin ayrıntıları uygulama bölümünde tanımlanmıştır. Bu nedenle, henüz bu terimlere aşina değilseniz cesaretiniz kırılmasın.

Neler oluşturacaksınız?

BQML ile bir Görüntü Veri Sınıflandırma modeli oluşturacaksınız. Bu modelde şunlar yer alıyor:

  • Tablo ve model bileşenlerini içerecek bir BigQuery veri kümesi
  • Modelle ilgili Yoga Görüntülerinin depolanması için 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 tablonun BigLake bağlantısı
  • BigQuery ML'de ResNet Modeli
  • Oluşturulan modeli kullanarak çıkarım
  • 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 görüntüleri depolama
  • BigQuery veri kümesi, tablosu ve bağlantı oluşturma
  • BQML kullanarak görüntü veri sınıflandırma modeli oluşturma
  • BigQuery ML kullanarak oluşturulan modelle tahmin yapma
  • BigQuery SQL'leri kullanarak görüntüleri 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, görüntü verisi sınıflandırma uygulamasını oluşturmaya yönelik adımların listesi yer almaktadır.

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

5 Yoga duruşunun görüntü algılama işlemi için herkese açık veri kümesini kullandım. Siz de bu depodan veri kümesine erişebilirsiniz. Tanımladığımız Yoga duruşları Downdog, Tanrıça, Plank, Ağaç ve Savaşçı2 ile sınırlıdır. BigQuery veri kümesi oluşturmaya başlamadan önce bir Google Cloud projesi seçtiğinizden veya oluşturduğunuzdan ve projede faturalandırmanın etkinleştirilip etkinleştirilmediğini kontrol ettiğinizden emin olun. BigQuery API ve BigQuery Connection API'yi etkinleştirin. Bu uygulamada kullanılan tüm hizmetlerin, seçilen aynı bölgede olması gerektiğini lütfen unutmayın.

a. "yoga_set" veri kümesini oluşturma uygulamak için aşağıdaki adımları uygulayın:

BigQuery Editor'a gidin ve şu komutu yazın:

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

b. BigLake Connection, harici veri kaynağını bağlarken son derece ayrıntılı BigQuery erişim denetimini ve güvenliğini (bu örnekte resim verileri için Cloud Storage) koruyabilmemizi sağlıyor. Bu bağlantıyı, Cloud Storage'daki nesneleri okumak için kullanacağız. BigLake bağlantısını 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ıyla kurulan bağlantılar'ı tıklayıp BigLake ve Uzak işlevler seçeneğini belirleyin:

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

Bağlantı kimliği sağlayın ve bağlantıyı oluşturun. <<SERVICE_ACCOUNT>> bağlantısı oluşturulduğunda ekranda görüntülenecek Hizmet Hesabı kimliğini not etmeyi unutmayın. Örneğimizde bağlantı kimliği "yoga-pose-conn" şeklindedir. Bölgeyi not etmeyi unutmayın.

4. Google Cloud Storage Paketi Oluşturma ve İzin Verme

Modeli oluşturmak istediğimiz Yoga pozlarının resim dosyalarını eklemek için Google Cloud Storage paketini kullanacağız. Paketler, analiz edeceğimiz görüntüleri içeren Cloud Storage kapsayıcılarıdır.

a. Konsolda arama yaparak Google Cloud Storage'a gidin. Ardından, Buckets (Paketler) ana sayfasına gitmek için Buckets (Paketler) seçeneğini tıklayın ve CREATE'i (OLUŞTUR) tıklayın.

a6f6b26cffb53ae0.pngGoogle Cloud Storage Paketleri Sayfası

b. Paket oluşturma sayfasında paket bilgilerinizi (benzersiz bir ad) girin ve devam edin. Bu işlemin, veri kümesiyle ve yukarıdaki adımlarda açıklanan bağlantıyla aynı bölgede olduğundan emin olup Oluştur'u tıklayın.

1280366a42b7bdf6.pngGoogle Cloud Storage Paket Oluşturma Sayfası

Bir sonraki adıma geçmeden önce hizmet hesabınızı, paket adınızı ve yolunu not ettiğinizden emin olun.

c. Paket oluşturulduktan sonra görüntülerinizi depolayın (konsol veya Cloud Shell komutları ya da programatik olarak) ve bağlantının hizmet hesabına (daha önce kaydettiğimiz) görüntülere 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üzenleyicisinden aşağıdaki CREATE SQL komutunu ç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ğıdaki gibi oluşturulur:

bda48f566e0c292f.png

Yeni oluşturulan harici tablodan bir pozu hızlıca 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ış veriymiş gibi oluşturabilir ve bunlar üzerinde çalışabilirsiniz:

7d1784122b5013f.png

Şimdi, 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 "CSV Yerel Dosyası"nı seçin. seçeneği sunulur. Ardından Colab Not Defteri'nizi 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şturduğumuza ve Cloud Storage'daki görüntülere yalnızca SQL sorgularını kullanarak eriştiğimize göre, Sınıflandırma Modeli'ni oluşturma ile ilgili bir sonraki bölüme geçebiliriz.

6. Modeli Oluşturma ve Google Cloud Storage'a Yükleme

Bu uygulama için, az önce oluşturduğumuz nesne tablosunda çıkarım yapmak amacıyla önceden eğitilmiş ResNet 50 Modelini kullanacağız. ResNet 50 modeli, görüntü dosyalarını analiz eder ve bir resmin karşılık gelen sınıfa (logit) ait olma olasılığını 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 konumunuza kaydedin
  2. Kayıtlı_model.pb ve değişkenler klasörü altında açılmalıdır.
  3. Bu ikisini (dosya ve klasör) önceki bölümde oluşturduğumuz pakete yükleyin

2629ff3eda214946.pngGoogle Cloud Storage Paketi "yoga_images" ve gerçek model dosyalarıyla

Bu adım tamamlandıktan sonra modelle ilgili dosyalarınız, yukarıdaki resimde görüldüğü gibi resimlerinizle aynı pakette bulunur.

7. Modeli BQML'ye Yükleme ve Çıkarım

Bu adımda, modeli daha önce oluşturduğumuz harici tabloyla aynı BigQuery Veri Kümesine yükleyecek ve Cloud Storage'da depoladığımız görüntülere uygulayacağız.

a. BigQuery Editor'dan 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 işlemi tamamlandıktan sonra (veri kümenize bağlı olarak bu işlem biraz zaman alabilir) model, BigQuery'deki Veri Kümesi bölümünde listelenir.

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 az önce oluşturduğumuz "yoga_poses_resnet" modeli tıklayın. Schema (Şema) sekmesini tıklayın:

e88928764f10f6ff.pngBigQuery Model Tanımı Şema Sekmesi

Etiketler bölümünde "activity_49", alanıdır. Özellikler bölümünde "input_1" ifadesini görebilirsiniz. modele girilmesi beklenen alanı temsil eder. "input_1" ifadesini referans alacaksınız "testiniz" için geçirdiğiniz alan olarak çıkarım sorgunuzda (veya tahmin sorgunuzda) dışı verilerdir.

c. Yoga Pozunuzu Belirleyin.

Test görüntüsü verilerimizi sınıflandırmak için az önce oluşturduğumuz modeli kullanalım. Cloud Storage Paketinizden tanımlanan ve Harici Tablo'yu oluşturduğumuzda bunu öğrenen bazı test görüntülerinizin (Yoga pozları) bulunduğundan emin olun. Az önce oluşturduğumuz BQML modelini kullanarak çıkarımda bulunmak için BigQuery'de bu test görüntülerini 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ğeri (00000097.jpg) içerdiği tespit edilen bir test resmi seçtik. Ayrıca, SELECT bölümü "input_1" alanı olarak ML.DECODE_IMAGE yapısını kullanır gerekir.

Yürütme işlemi tamamlandıktan sonra sonucu aşağıda gösterildiği gibi görürsünüz:

867018993845e943.png

ResNet modelini derinlemesine bilenler için artık sınıflandırmayı anlamak yararlı 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 çıkışı görselleştirmenin bir yolu, BigQuery SQL'in UNNEST yapısını kullanarak activity_49 alan değerlerini düzeltmektir. Önceki adımda elde edilen sonucu düzeltmek için lütfen aşağıdaki sorguya bakın. Oluşturulan sınıfı daha metinsel olarak etiketlemek istiyorsanız <<LABEL_LOGIC>> yer tutucusunun yerine mantığı kullanabilirsiniz. (kullanırken yorumu kaldır).

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ğıdaki gibidir:

71f580f41f0811f3.png

Ancak benim durumumda, örnek bir mantık uyguladım. Sonuç şu şekildedir:

1c6df6ecd14fba1.png

Model hakkında daha fazla bilgi edinebilir, verileriniz ve model çıkışı için en uygun mantığı uygulayabilirsiniz.

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

Son olarak, sınıflandırmadan elde edilen sonucu görselleştirmek için kısa bir Python snippet'i hazırladık. Yukarıdaki sorgu sonucunu bir CSV dosyasına aktarın ve Python kodunda bu dosyaya referans verin.

68756e7e4b8d7a29.png

Yukarıdaki resim çıkışı "Aşağı Doğru Köpek" adlı Yoga Pose'ine işaret eder. Bu, BQML kullanarak sınıflandırma için ML.PREDICT sorgusuna geçirdiğimiz test girdisinin aynısıdır.

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

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

125bdf848c86fbe.pngBigQuery Yapılandırılmış Tablosu "yoga_health" Şema

Yukarıdaki resimde, "yoga_health" adlı yapılandırılmış veri tablosunun şeması gösterilmektedir pozisyonlar, poz, odak, sağlık_beceri ve nefes. 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ğıdaki gibi olur:

469bdfcffa9e19fd.png

Not: Bu blogda ele aldığımız tüm sorgular, BigQuery Magic komutlarını kullanarak 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 aşağıdaki adımları uygulayın.

  1. Google Cloud konsolunda Kaynakları yönetin sayfasına gidin
  2. Proje listesinden silmek istediğiniz projeyi seçin ve ardından Sil’i tıklayın
  3. İletişim kutusuna proje kimliğini yazın ve projeyi silmek için Kapat'ı tıklayın

10. Tebrikler

Tebrikler! Yapılandırılmamış verileri BigQuery'de başarıyla depoladınız, sorguladınız, BQML kullanarak sınıflandırma modeli oluşturdunuz ve bu modelle tahmin edilen test yoga duruşları yaptınız. Bunu uygulamak isterseniz Google Cloud projenize başlayın. Ayrıca Google Cloud'daki veritabanları veya diğer uçtan uca uygulama uygulamaları hakkında daha fazla bilgi edinmek için bloglarımı ziyaret edebilirsiniz.