Görüntü arşivleme, analiz ve rapor oluşturma Google Workspace ve Google Cloud

1. Genel Bakış

Bu codelab'de görüntü arşivleme, analiz ve rapor oluşturma şeklinde olası bir kurumsal iş akışı sunulmaktadır. Kuruluşunuzun kısıtlı bir kaynakta yer kaplayan bir dizi resim olduğunu düşünün. Bu verileri arşivlemek, bu resimleri analiz etmek ve en önemlisi, arşivlenen konumlarla birlikte analiz sonuçlarını özetleyen, harmanlanmış ve yönetim tarafından kullanılmaya hazır bir rapor oluşturmak istiyorsunuz. Google Cloud, iki ürün serisi olan Google Workspace (önceki adıyla G Suite veya Google Apps) ve Google Cloud (eski adıyla GCP) API'lerinden yararlanarak bunu başarmak için gerekli araçları sunuyor.

Senaryomuzda, işletme kullanıcısının Google Drive'da resimleri olacaktır. Bunları "daha soğuk" olarak destekleyebiliriz. Google Cloud Storage'da sunulan depolama sınıfları gibi daha ucuz depolama alanı seçenekleri. Google Cloud Vision, geliştiricilerin nesne ve önemli nokta algılama, optik karakter tanıma (OCR) gibi görme algılama özelliklerini uygulamalara kolayca entegre etmesine olanak tanır. Son olarak, Google E-Tablolar e-tablosu, tüm bunları patronunuz için özetlemek amacıyla faydalı bir görselleştirme aracıdır.

Google Cloud'un tamamından yararlanan bir çözüm geliştirmek için bu codelab'i tamamladıktan sonra, kuruluşunuz veya müşterileriniz için daha da etkili bir çözüm geliştirmek üzere ilham alabileceğinizi umuyoruz.

Neler öğreneceksiniz?

  • Cloud Shell'i kullanma
  • API isteklerinin kimliğini doğrulama
  • Python için Google API'leri istemci kitaplığını yükleme
  • Google API'lerini etkinleştirme
  • Google Drive'dan dosya indirme
  • Cloud Storage'a nesne/blob yükleme
  • Cloud Vision ile verileri analiz etme
  • Google E-Tablolar'a satır yazma

Gerekenler

  • Google Hesabı (Google Workspace hesapları için yönetici onayı gerekebilir)
  • Etkin bir Google Cloud faturalandırma hesabına sahip bir Google Cloud projesi
  • İşletim sistemi terminal/kabuk komutları hakkında bilgi
  • Temel Python becerileri (2 veya 3) ancak desteklenen herhangi bir dili de kullanabilirsiniz

Yukarıda listelenen dört Google Cloud ürünüyle ilgili deneyim sahibi olmak faydalı olabilir ancak zorunlu değildir. Bunları ayrı ayrı öğrenmeniz için zaman kalırsa aşağıdaki alıştırmaya geçmeden önce her biri için codelab'ler uygulayabilirsiniz:

Anket

Bu eğiticiden nasıl yararlanacaksınız?

Yalnızca okuma Okuyun ve alıştırmaları tamamlayın

Python deneyiminizi nasıl değerlendirirsiniz?

Acemi Orta Yeterli

Google Cloud hizmetlerini kullanma deneyiminizi nasıl değerlendirirsiniz?

Acemi Orta Yeterli

Google Workspace geliştirici hizmetlerini kullanma deneyiminizi nasıl değerlendirirsiniz?

Acemi Orta Yeterli

Daha çok "işletme odaklı" bir yaklaşım mı görmek istersiniz? Codelab'ler mi yoksa ürün özelliği tanıtımları olanların mı?

Evet Hayır Her ikisinden de daha fazla

2. Kurulum ve Gereksinimler

Kendi hızınızda ortam kurulumu

  1. Google Cloud Console'da oturum açıp yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. Gmail veya Google Workspace hesabınız yoksa hesap oluşturmanız gerekir.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Proje adı, bu projenin katılımcıları için görünen addır. Google API'leri tarafından kullanılmayan bir karakter dizesidir. İstediğiniz zaman güncelleyebilirsiniz.
  • Proje Kimliği, tüm Google Cloud projelerinde benzersiz olmalıdır ve değiştirilemez (belirlendikten sonra değiştirilemez). Cloud Console, otomatik olarak benzersiz bir dize oluşturur. bunun ne olduğunu umursamıyorsunuz. Çoğu codelab'de proje kimliğini (genellikle PROJECT_ID olarak tanımlanır) referans almanız gerekir. Oluşturulan kimliği beğenmezseniz rastgele bir kimlik daha oluşturabilirsiniz. Alternatif olarak, kendi ölçümünüzü deneyip mevcut olup olmadığına bakabilirsiniz. Bu adımdan sonra değiştirilemez ve proje süresince kalır.
  • Bilginiz için bazı API'lerin kullandığı üçüncü bir değer, yani Proje Numarası daha vardır. Bu değerlerin üçü hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
  1. Sonraki adımda, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i çalıştırmanın maliyeti, yüksek değildir. Bu eğitim dışında faturalandırma yapılmaması için kaynakları kapatmak isterseniz oluşturduğunuz kaynakları silebilir veya projenin tamamını silebilirsiniz. Yeni Google Cloud kullanıcıları, 300 ABD doları değerindeki ücretsiz denemeden yararlanabilir.

Cloud Shell'i Başlatma

Özet

Dizüstü bilgisayarınızda yerel olarak kod geliştirebilirsiniz. Ancak bu codelab'in ikinci hedefi, modern web tarayıcınız aracılığıyla bulutta çalışan bir komut satırı ortamı olan Google Cloud Shell'i nasıl kullanacağınızı öğretmektir.

Cloud Shell'i etkinleştirme

  1. Cloud Console'da, Cloud Shell'i etkinleştir 853e55310c205094.png simgesini tıklayın.

55efc1aaa7a4d3ad.png

Cloud Shell'i daha önce hiç başlatmadıysanız ne olduğunu açıklayan bir ara ekran (ekranın alt kısmında) gösterilir. Bu durumda Devam'ı tıklayın (bunu bir daha görmezsiniz). Tek seferlik ekran şöyle görünür:

9c92662c6a846a5c.png

Temel hazırlık ve Cloud Shell'e bağlanmak yalnızca birkaç dakika sürer.

9f0e51b578fecce5.png

İhtiyaç duyduğunuz tüm geliştirme araçları bu sanal makinede yüklüdür. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud'da çalışarak ağ performansını ve kimlik doğrulamasını büyük ölçüde iyileştirir. Bu codelab'deki çalışmalarınızın tamamı olmasa bile büyük bir kısmı yalnızca bir tarayıcı veya Chromebook'unuzla yapılabilir.

Cloud Shell'e bağlandıktan sonra kimliğinizin doğrulandığını ve projenin proje kimliğinize ayarlandığını görürsünüz.

  1. Kimlik doğrulamanızın tamamlandığını onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud auth list

Komut çıkışı

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. gcloud komutunun projenizi bildiğini onaylamak için Cloud Shell'de aşağıdaki komutu çalıştırın:
gcloud config list project

Komut çıkışı

[core]
project = <PROJECT_ID>

Doğru değilse aşağıdaki komutla ayarlayabilirsiniz:

gcloud config set project <PROJECT_ID>

Komut çıkışı

Updated property [core/project].

3. Python ortamını onaylayın

Bu codelab'de, Python dilini kullanmanız gerekir (Google API'leri istemci kitaplıkları, birçok dil tarafından desteklenmektedir. Bu nedenle, en sevdiğiniz geliştirme aracında eşdeğer bir uygulama geliştirebilir ve gerçek kod olarak Python'u kullanabilirsiniz). Bu codelab'de özellikle Python 2 ve 3 desteklenir ancak en kısa sürede 3.x'e geçmenizi öneririz.

Cloud Shell, kullanıcıların doğrudan Cloud Console üzerinden kullanabileceği pratik bir araçtır. Yerel bir geliştirme ortamı gerektirmez. Dolayısıyla, bu eğitim tamamen bulutta bir web tarayıcısıyla yapılabilir. Daha açık belirtmek gerekirse bu codelab'de Cloud Shell'e Python'un her iki sürümü de önceden yüklenmiştir.

Cloud Shell'de IPython da yüklüdür. Bu, özellikle veri bilimi veya makine öğrenimi topluluğunun bir parçasıysanız kullanmanızı önerdiğimiz üst düzey bir etkileşimli Python çeviricidir. Bu durumda IPython, Jupyter Notebooks'un yanı sıra Google Research tarafından barındırılan Colab, Jupyter Notebooks için de varsayılan çevirmendir.

IPython, öncelikle Python 3 çevirmenini tercih eder ancak 3.x mevcut değilse Python 2'ye geri döner. IPython'a Cloud Shell'den erişilebilir, ancak yerel bir geliştirme ortamında da yüklenebilir. ^D (Ctrl-d) tuşlarına basarak çıkın ve çıkış teklifini kabul edin. ipython başlangıcının örneği şu şekilde görünür:

$ ipython
Python 3.7.3 (default, Mar  4 2020, 23:11:43)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.13.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]:

IPython tercih etmiyorsanız standart bir Python etkileşimli yorumlayıcısının (Cloud Shell veya yerel geliştirme ortamınız) kullanılması mükemmel bir şekilde kabul edilebilir (aynı zamanda ^D ile çıkış yapın):

$ python
Python 2.7.13 (default, Sep 26 2018, 18:42:22)
[GCC 6.3.0 20170516] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 
$ python3
Python 3.7.3 (default, Mar 10 2020, 02:33:39)
[GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

Codelab'de ayrıca pip yükleme aracına (Python paket yöneticisi ve bağımlılık çözümleyici) sahip olduğunuz varsayılır. 2.7.9 ve sonraki sürümler ile paket halinde gelir. Eski bir Python sürümünüz varsa yükleme talimatları için bu rehberi inceleyin. İzinlerinize bağlı olarak sudo veya süper kullanıcı erişiminiz olması gerekebilir ancak genellikle durum böyle değildir. Belirli Python sürümlerinde pip yürütmesi için açıkça pip2 veya pip3 kullanabilirsiniz.

Codelab'in geri kalanında, Python 3 kullandığınız varsayılır. 3.x'ten önemli ölçüde farklıysa Python 2 için özel talimatlar sağlanır.

[isteğe bağlı] Sanal ortamlar oluşturma ve kullanma

Bu bölüm isteğe bağlıdır ve yalnızca bu codelab için sanal ortam kullanması gereken kullanıcılar için gereklidir (yukarıdaki uyarı kenar çubuğuna göre). Bilgisayarınızda yalnızca Python 3 varsa my_env adlı bir virtualenv oluşturmak için şu komutu vermeniz yeterlidir (isterseniz başka bir ad seçebilirsiniz):

virtualenv my_env

Ancak, hem Python 2 hem de 3'ü bilgisayarınıza yüklemek için, -p flag ile aşağıdaki şekilde yapabileceğiniz bir Python 3 virtualenv yüklemenizi öneririz:

virtualenv -p python3 my_env

"Etkinleştirerek" yeni oluşturulan virtualenv'nizi girin bu şekildedir:

source my_env/bin/activate

Kabuk isteminizin önüne ortamınızın adını (ör.

(my_env) $ 

Artık gerekli tüm paketleri pip install veya bu belge içinde kod yürütebiliyor olmanız gerekir. vs. Bir başka avantaj da, işinizi tamamen bozarsanız, Python kurulumunuzun bozuk olduğu bir durumla karşılaşırsanız sisteminizin geri kalanını etkilemeden bu ortamı baştan sona karmaşaya sokmanızdır.

4. Python için Google API'leri istemci kitaplığını yükleme

Bu codelab'de Python için Google API'leri istemci kitaplığının kullanılması gerekir. Bu nedenle, basit bir yükleme işlemi olabilir veya hiçbir şey yapmanız gerekmeyebilir.

Daha önce, kolaylık olması için Cloud Shell'i kullanmanızı önermiştik. Eğitimin tamamını buluttaki bir web tarayıcısından tamamlayabilirsiniz. Cloud Shell'i kullanmanın diğer bir nedeni de birçok popüler geliştirme aracının ve gerekli kitaplığın önceden önceden yüklü olmasıdır.

*İstemci kitaplıklarını yükleme

(isteğe bağlı) Cloud Shell'i veya istemci kitaplıklarını önceden yüklediğiniz bir yerel ortamı kullanıyorsanız bu adımı atlanabilir. Bunu yalnızca yerel olarak geliştirme yapıyorsanız ve uygulama yüklemediyseniz (veya yüklemediğinizden emin değilseniz) yapmanız gerekir. En kolay yol, yüklemeyi yapmak için pip (veya pip3) kullanmaktır (gerekirse pip öğesinin kendisini güncellemek de dahil):

pip install -U pip google-api-python-client oauth2client

Yüklemeyi onayla

Bu komut, istemci kitaplığının yanı sıra bağımlı olduğu paketleri yükler. İster Cloud Shell'i ister kendi ortamınızı kullanın, gerekli paketleri içe aktararak istemci kitaplığının yüklü olduğunu doğrulayın ve içe aktarma hatası (veya çıkış) olmadığından emin olun:

python3 -c "import googleapiclient, httplib2, oauth2client"

Bunun yerine Python 2 kullanıyorsanız (Cloud Shell'den) bu desteğin sonlandırıldığını belirten bir uyarı alırsınız:

*******************************************************************************
Python 2 is deprecated. Upgrade to Python 3 as soon as possible.
See https://cloud.google.com/python/docs/python2-sunset

To suppress this warning, create an empty ~/.cloudshell/no-python-warning file.
The command will automatically proceed in  seconds or on any key.
*******************************************************************************

Bu içe aktarma "test"i çalıştırdıktan sonra komutunu başarıyla kullandığınızdan (hata/çıktı olmadan) Google API'leriyle konuşmaya hazırsınız.

Özet

Bunun orta düzey bir codelab'de olduğunu ve her ne kadarının projenize dahil olduğunu ve konsolda projeler kullanarak. Google API'lerini ve özellikle Google Workspace API'lerini kullanmaya yeni başladıysanız önce Google Workspace API'leri tanıtım codelab'ini deneyin. Ayrıca, kullanıcı hesabı (hizmet hesabı değil ) kimlik bilgilerinin nasıl oluşturulacağını (veya yeniden kullanılacağını) biliyorsanız client_secret.json dosyasını iş dizininize bırakın, bir sonraki modüle geçin ve "Google API'lerini Etkinleştir" bölümüne geçin.

5. *API isteklerini yetkilendirme (kullanıcı yetkilendirme)

Kullanıcı hesabı yetkilendirme kimlik bilgilerini daha önce oluşturduysanız ve işlem hakkında bilgi sahibiyseniz bu bölümü atlanabilir. Bu, tekniği farklı olan hizmet hesabı yetkilendirmesinden farklıdır, bu nedenle lütfen aşağıdan devam edin.

Yetkilendirmeye giriş (artı bazı kimlik doğrulama işlemleri)

API'lere istek gönderilebilmesi için uygulamanızın uygun yetkilendirmeye sahip olması gerekir. Kimlik doğrulama, benzer bir kelime olan giriş kimlik bilgilerini tanımlar. Giriş kimlik bilgilerinden yararlanarak Google Hesabınıza giriş yaparken siz de kendi kimliğinizi doğrularsınız. şifre. Kimlik doğrulamasından sonraki adım, Cloud Storage'daki blob dosyaları veya kullanıcının Google Drive'daki kişisel dosyaları gibi verilere erişim yetkisine sahip olup olmadığınızı veya daha doğrusu kodunuzun olup olmadığını belirlemektir.

Google API'leri çeşitli yetkilendirme türlerini destekler ancak bu codelab'deki örnek uygulama son kullanıcılara ait verilere eriştiğinden G Suite API kullanıcıları için en yaygın olanı kullanıcı yetkilendirmedir. Bu son kullanıcılar uygulamanıza, verilerine erişmek için izin vermelidir. Bu, kodunuzun kullanıcı hesabı OAuth2 kimlik bilgilerini alması gerektiği anlamına gelir.

Kullanıcı yetkilendirmesi için OAuth2 kimlik bilgilerini almak üzere API yöneticisine dönün ve "Kimlik bilgileri"ni seçin sekmesinden:

635af008256d323.png

Bu sayfaya ulaştığınızda tüm kimlik bilgilerinizi üç ayrı bölümde görürsünüz:

fd2f4133b406d572.png

İlki API anahtarları, ikinci OAuth 2.0 istemci kimlikleri ve son OAuth2 hizmet hesapları içindir. Ortadakini kullanıyoruz.

Kimlik bilgileri oluşturuluyor

Kimlik Bilgileri sayfasında, üst taraftaki + Kimlik Bilgisi Oluştur düğmesini tıklayın, ardından "OAuth istemci kimliği:" seçeneğini belirleyeceğiniz bir iletişim kutusu görüntülenir.

b17b663668e38787.png

Sonraki ekranda 2 işleminiz var: Uygulamanızın yetkilendirme "izin ekranı"nı yapılandırma ve uygulama türünü seçerek:

4e0b967c9d70d262.png

İzin ekranı ayarlamadıysanız konsolda bu uyarıyı görürsünüz. Bu işlemi şimdi yapmanız gerekir. (İzin ekranınız zaten ayarlanmışsa bu sonraki adımları atlayın.)

"Configure consent screen" (İzin ekranını yapılandır) seçeneğini tıklayın. Burada "Harici"yi uygulama (veya G Suite müşterisiyseniz "Dahili"):

f17e97b30d994b0c.png

Codelab örneğinizi yayınlamadığınızdan, bu alıştırmada hangisini seçtiğinizin önemli olmadığını unutmayın. Çoğu kullanıcı "Harici"yi seçer bir ekrana geçebileceğini unutmayın ancak burada yalnızca "Uygulama adı"nı alanına girin:

b107ab81349bdad2.png

Şu an için tek ihtiyacınız uygulama adıdır. Bu nedenle, yaptığınız codelab'i yansıtan birini seçip Kaydet'i tıklayın.

OAuth istemci kimliği (kullanıcı hesabı kimlik doğrulaması) oluşturuluyor

Kimlik bilgileri sekmesine geri dönün ve bir OAuth2 istemci kimliği oluşturun. Burada, oluşturabileceğiniz çeşitli OAuth istemci kimlikleri gösterilir:

5ddd365ac0af1e34.png

Diğer adlı bir komut satırı aracı geliştiriyoruz. Bu aracı seçip Oluştur düğmesini tıklayın. Oluşturduğunuz uygulamayı yansıtan bir istemci kimliği adı seçin veya varsayılan adı (genellikle "Diğer istemci N") alın.

Kimlik bilgileriniz kaydediliyor

  1. Yeni kimlik bilgilerinin yer aldığı bir iletişim kutusu görüntülenir; kapatmak için Tamam'ı tıklayın

8bec84d82cb104d7.png

  1. Kimlik Bilgileri sayfasında "OAuth2 İstemci Kimlikleri" bölümüne ilerleyin bölümünde, yeni oluşturulan istemci kimliğinizin en sağındaki indir simgesini f54b28417901b3aa.png bulup tıklayın. 1b4e8d248274a338.png
  2. Bu işlem, muhtemelen İndirilenler klasörünüze düşecek şekilde client_secret-LONG-HASH-STRING.apps.googleusercontent.com.json adlı bir dosyanın kaydedileceği bir iletişim kutusu açar. Daha kolay olacak şekilde kısaltarak adı client_secret.json (örnek uygulamada kullanılır) olacak şekilde kısaltıp bu codelab'de örnek uygulamayı oluşturacağınız dizine/klasöre kaydetmenizi öneririz.

Özet

Artık bu codelab'de kullanılan Google API'lerini etkinleştirmeye hazırsınız. Ayrıca, OAuth izin ekranındaki uygulama adı için "Vision API demo"yu seçtik. Bu adı gelecek ekran görüntülerinde görebilirsiniz.

6. Google API'lerini etkinleştirin

Bu codelab'de dört (4) Google Cloud API, bir çift Google Cloud'dan (Cloud Storage ve Cloud Vision) ve diğeri Google Workspace'ten (Google Drive ve Google E-Tablolar) kullanılır. Aşağıda, Google API'lerini etkinleştirmeyle ilgili genel talimatları bulabilirsiniz. Bir API'yi nasıl etkinleştireceğinizi öğrendiğinizde diğerleri de benzer şekilde çalışır.

Uygulamanızda kullanmak istediğiniz Google API'sinden bağımsız olarak, bunların etkinleştirilmesi gerekir. API'ler komut satırından veya Cloud Console'dan etkinleştirilebilir. API'leri etkinleştirme süreci aynıdır. Bu nedenle, bir API'yi etkinleştirdikten sonra diğerlerini de benzer şekilde etkinleştirebilirsiniz.

1. seçenek: gcloud komut satırı arayüzü (Cloud Shell veya yerel ortam)

API'leri Cloud Console'dan etkinleştirmek daha yaygın olsa da bazı geliştiriciler her şeyi komut satırından yapmayı tercih eder. Bunu yapmak için bir API'nin "hizmet adını" aramanız gerekir. Bu URL şuna benziyor: SERVICE_NAME.googleapis.com. Bunları Desteklenen ürünler grafiğinde bulabilir veya Google Discovery API ile programlı bir şekilde sorgulayabilirsiniz.

Bu bilgilere sahip olduğunuzda, Cloud Shell'i (veya gcloud komut satırı aracının yüklü olduğu yerel geliştirme ortamınızı) kullanarak bir API'yi veya hizmeti aşağıdaki şekilde etkinleştirebilirsiniz:

gcloud services enable SERVICE_NAME.googleapis.com

1. Örnek: Cloud Vision API'yi etkinleştirin

gcloud services enable vision.googleapis.com

2. Örnek: Google App Engine sunucusuz bilgi işlem platformunu etkinleştirin

gcloud services enable appengine.googleapis.com

3. Örnek: Tek bir istekle birden çok API'yi etkinleştirme. Örneğin, bu codelab'de Cloud Translation API'yi kullanarak bir uygulamayı App Engine, Cloud Functions ve Cloud Run'a dağıtan görüntüleyiciler varsa komut satırı şöyle olur:

gcloud services enable appengine.googleapis.com cloudfunctions.googleapis.com artifactregistry.googleapis.com run.googleapis.com translate.googleapis.com

Bu komut App Engine, Cloud Functions, Cloud Run ve Cloud Translation API'yi etkinleştirir. Ayrıca Cloud Artifact Registry'yi etkinleştirir çünkü container görüntülerinin Cloud Run'a dağıtılabilmesi için Cloud Build sistemi tarafından kaydedilmesi gerekir.

Ayrıca, etkinleştirilecek API'leri sorgulamak veya projenizde zaten hangi API'lerin etkinleştirildiğini sorgulamak için kullanabileceğiniz birkaç komut vardır.

4. Örnek: Projenizde etkinleştirilebilecek Google API'leri için sorgu

gcloud services list --available --filter="name:googleapis.com"

5. Örnek: Projenizde etkinleştirilen Google API'leri için sorgu

gcloud services list

Yukarıdaki komutlarla ilgili daha fazla bilgi için hizmetleri etkinleştirme ve devre dışı bırakma ile hizmetleri listeleme dokümanlarına bakın.

2. Seçenek: Cloud Console

Google API'lerini API Yöneticisi'nden de etkinleştirebilirsiniz. Cloud Console'dan API Yöneticisi'ne gidin. Bu kontrol paneli sayfasında uygulamanıza ilişkin bazı trafik bilgilerinin yanı sıra uygulama isteklerini, uygulamanız tarafından oluşturulan hataları ve uygulamanızın yanıt sürelerini gösteren grafikleri görürsünüz:

df4a0a5e00d29ffc.png

Aşağıdaki grafiklerin altında projeniz için etkinleştirilen Google API'lerinin listesi bulunmaktadır:

5fcf10e5a05cfb97.png

API'leri etkinleştirmek (veya devre dışı bırakmak) için en üstteki API'leri ve Hizmetleri Etkinleştir'i tıklayın:

eef4e5e863f4db66.png

Alternatif olarak, sol gezinme çubuğuna gidin ve API'ler ve HizmetlerKitaplık:

6eda5ba145b30b97.png

Her iki durumda da API Kitaplığı sayfasına ulaşırsınız:

5d4f1c8e7cf8df28.png

Eşleşen sonuçları aramak ve görmek için bir API adı girin:

35bc4b9cf72ce9a4.png

Etkinleştirmek istediğiniz API'yi seçin ve Etkinleştir düğmesini tıklayın:

9574a69ef8d9e8d2.png

Hangi Google API'sini kullanmak istediğinize bakılmaksızın, tüm API'leri etkinleştirme süreci benzerdir.

Maliyet

Birçok Google API'si ücretsiz olarak kullanılabilir. Ancak Google Cloud ürünlerinin ve API'lerinin çoğunun kullanımı için ücret ödemeniz gerekir. Cloud APIs'i etkinleştirirken, etkin bir faturalandırma hesabı girmeniz istenebilir. Ancak bazı Google Cloud ürünlerinde "Daima Ücretsiz" katmanını kullanın.

Yeni Google Cloud kullanıcıları ücretsiz denemeden yararlanabilir. Şu anda ilk 90 gün için 300 ABD doları tutarındadır. Codelab'ler genellikle herhangi bir ücret ödemez veya herhangi bir ücret ödemez. Bu nedenle, özellikle tek seferlik bir teklif olduğundan, test sürüşü yapmaya hazır olana kadar Ücretsiz Deneme'yi ertelemenizi öneririz. Ücretsiz Katman kotalarının süresi dolmaz ve bu kotalar, Ücretsiz Deneme'yi kullanıp kullanmadığınıza bakılmaksızın uygulanır.

Kullanıcılar, etkinleştirmeden önce API'lerin fiyatlandırma bilgilerine (ör. Cloud Vision API fiyatlandırma sayfası) başvurmalıdır. Özellikle API'nin ücretsiz katmanı olup olmadığını ve varsa ne olduğunu belirtmesi gerekir. Toplamda belirtilen günlük veya aylık sınırları aşmadığınız sürece herhangi bir ücret ödemezsiniz. Fiyatlandırma ve ücretsiz katmanlar, Google ürün grubu API'leri arasında farklılık gösterir. Örnekler:

Farklı Google ürünleri farklı şekilde faturalandırılır. Bu nedenle, bu bilgiler için uygun dokümanlara başvurduğunuzdan emin olun.

Özet

Cloud Vision etkinleştirildiğine göre diğer üç API'yi de (Google Drive, Cloud Storage, Google E-Tablolar) aynı şekilde etkinleştirin. Cloud Shell'den gcloud services enable işlemini kullanın veya Cloud Console'dan:

  1. API Kitaplığı'na geri dön
  2. Adının birkaç harfini yazarak arama başlatın
  3. İstediğiniz API'yi seçin ve
  4. Etkinleştir

Köpürt, durulayın ve tekrarlayın. Cloud Storage için birkaç seçenek vardır: "Google Cloud Storage JSON API"yi seçin. Cloud Storage API'de ayrıca etkin bir faturalandırma hesabı da olacaktır.

7. 0. Adım: İçe aktarma işlemlerini ve yetkilendirme kodu

Bu, orta boyutlu bir kod parçasının başlangıcıdır. Bu nedenle, çevik uygulamalardan yararlanarak ana uygulamaya geçmeden önce ortak, sağlam ve çalışan bir altyapı sağlamanıza yardımcı olur. client_secret.json öğesini geçerli dizininizde ve ipython başlangıcında mevcut yeniden kontrol edin ve aşağıdaki kod snippet'ini girin veya analyze_gsimg.py dosyasına kaydedip kabuktan çalıştırın (kod örneğine eklemeye devam edeceğimiz için ikincisi tercih edilir):

from __future__ import print_function

from googleapiclient import discovery, http
from httplib2 import Http
from oauth2client import file, client, tools

# process credentials for OAuth2 tokens
SCOPES = 'https://www.googleapis.com/auth/drive.readonly'
store = file.Storage('storage.json')
creds = store.get()
if not creds or creds.invalid:
    flow = client.flow_from_clientsecrets('client_secret.json', SCOPES)
    creds = tools.run_flow(flow, store)

# create API service endpoints
HTTP = creds.authorize(Http())
DRIVE  = discovery.build('drive',   'v3', http=HTTP)

Bu temel bileşen, modül/paket içe aktarmaları için kod blokları, kullanıcı kimlik doğrulaması kimlik bilgilerini işleme ve API hizmeti uç noktaları oluşturma içerir. İncelemeniz gereken bu kod temel parçaları şunlardır:

  • print() işlevinin içe aktarılması, bu örnek Python 2-3'ü uyumlu hale getirir ve Google kitaplığı içe aktarma işlemleri, Google API'leriyle iletişim kurmak için gereken tüm araçları sağlar.
  • SCOPES değişkeni, kullanıcıdan istenecek izinleri temsil eder. Şimdilik tek bir değişken var: Kullanıcının Google Drive'ındaki verileri okuma izni.
  • Kimlik bilgisi işleme kodunun geri kalanı, önbelleğe alınmış OAuth2 jetonlarında okunur. Orijinal erişim jetonunun süresi dolmuşsa yenileme jetonuyla yeni bir erişim jetonuna güncelleme işlemi yapılması olasıdır.
  • Hiçbir jeton oluşturulmadıysa veya geçerli bir erişim jetonu başka bir nedenden dolayı alınamadıysa kullanıcının OAuth2 3 aşamalı akışını (3LO) yapması gerekir: İstenen izinlerin bulunduğu iletişim kutusunu oluşturun ve kullanıcıdan kabul etmesini isteyin. Bunu yaptığınızda uygulama devam eder. Aksi takdirde tools.run_flow(), bir istisna atar ve yürütme durdurulur.
  • Kullanıcı izin verdikten sonra, sunucuyla iletişim kurmak için bir HTTP istemcisi oluşturulur ve tüm istekler güvenlik amacıyla kullanıcının kimlik bilgileriyle imzalanır. Ardından, HTTP istemcisiyle Google Drive API'ye (sürüm 3) bir hizmet uç noktası oluşturulur ve bu uç nokta DRIVE öğesine atanır.

Uygulamayı çalıştırma

Komut dosyasını ilk kez çalıştırdığınızda, komut dosyası kullanıcının Drive'daki (sizinki) dosyalarına erişme yetkisine sahip olmaz. Yürütme duraklatılmış durumdayken çıkış şu şekilde görünür:

$ python3 ./analyze_gsimg.py
/usr/local/lib/python3.6/site-packages/oauth2client/_helpers.py:255: UserWarning: Cannot access storage.json: No such file or directory
  warnings.warn(_MISSING_FILE_MESSAGE.format(filename))

Your browser has been opened to visit:
    https://accounts.google.com/o/oauth2/auth?client_id=LONG-STRING.apps.googleusercontent.com&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2F&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive.readonly&access_type=offline&response_type=code

If your browser is on a different machine then exit and re-run this
application with the command-line parameter

  --noauth_local_webserver

Cloud Shell'den çalıştırıyorsanız "Cloud Shell'den" bölümüne atlayın bölümüne gidin ve "Yerel geliştirme ortamından" bölümünde ilgili ekranları inceleyin. gerektiğini unutmayın.

Yerel geliştirme ortamından

Komut satırı komut dosyası, tarayıcı penceresi açıldığında duraklatılır. Aşağıdaki gibi, korkutucu görünümlü bir uyarı sayfası alabilirsiniz:

149241d33871a141.png

Kullanıcı verilerine erişen bir uygulamayı çalıştırmaya çalıştığınız için bu, geçerli bir endişedir. Bu sadece bir demo uygulama olduğundan ve geliştirici olduğunuzdan devam etmek için kendinize güveneceğinizi umuyorum. Bunu daha iyi anlamak için kendinizi kullanıcılarınızın yerine koyun: Başka birisinin kodunun sizin verilerinize erişmesine izin vermeniz istenir. Bunun gibi bir uygulama yayınlamayı planlıyorsanız doğrulama sürecinden geçeceksiniz. Böylece kullanıcılarınız bu ekranı görmeyecektir.

"Güvenli olmayan sürüme git"i tıkladıktan sonra uygulama" bağlantısını tıkladığınızda aşağıdakine benzer bir OAuth2 izinleri iletişim kutusu görürsünüz. Kullanıcı arayüzümüzü sürekli olarak geliştiriyoruz. Bu nedenle tam eşleşme yoksa endişelenmeyin:

a122eb7468d0d34e.png

OAuth2 akışı iletişim kutusu, geliştiricinin istediği izinleri gösterir (SCOPES değişkeni aracılığıyla). Bu durumda, kullanıcının Google Drive'ını görüntüleme ve indirme yeteneğidir. Uygulama kodunda, bu izin kapsamları URI olarak görünür, ancak kullanıcının yerel ayarında belirtilen dile çevrilir. Burada kullanıcı, istenen izinler için açık yetki vermelidir. Aksi takdirde, komut dosyasının işleme devam etmemesi için bir istisna oluşturulur.

Onayınızı isteyen bir iletişim daha bile alabilirsiniz:

bf171080dcd6ec5.png

NOT: Bazıları, farklı hesaplara giriş yapılmış birden çok web tarayıcısı kullanır. Bu nedenle, bu yetkilendirme isteği yanlış tarayıcı sekmesine/penceresine gidebilir ve bu isteğin bağlantısını kesip doğru hesapla giriş yapılan bir tarayıcıya yapıştırmanız gerekebilir.

Cloud Shell'den

Cloud Shell'de hiçbir tarayıcı penceresi açılarak takılıp kalırsınız. Alttaki teşhis mesajının size yönelik olduğunu fark edeceksiniz:

If your browser is on a different machine then exit and re-run this
application with the command-line parameter

  --noauth_local_webserver

Komut dosyasının yürütülmesini durdurmak için ^C (Ctrl-C veya başka bir tuşa basma) ve ekstra flag ile onu kabuktan çalıştırmanız gerekir. Bu şekilde çalıştırdığınızda aşağıdaki çıkışı alırsınız:

$ python3 analyze_gsimg.py --noauth_local_webserver
/usr/local/lib/python3.7/site-packages/oauth2client/_helpers.py:255: UserWarning: Cannot access storage.json: No such file or directory
  warnings.warn(_MISSING_FILE_MESSAGE.format(filename))

Go to the following link in your browser:

    https://accounts.google.com/o/oauth2/auth?client_id=LONG-STRING.apps.googleusercontent.com&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive.readonly&access_type=offline&response_type=code

Enter verification code:

(storage.json adresinin henüz oluşturulmadığını bildiğimiz için uyarıyı yoksayıyoruz ve) başka bir tarayıcı sekmesinde bu URL'ye sahip talimatları izlediğinizde, yerel geliştirme ortamları için yukarıda açıklananlarla neredeyse aynı deneyime sahip olacaksınız (yukarıdaki ekran görüntülerine bakın). Son olarak, Cloud Shell'e girilecek doğrulama kodunun yer aldığı son bir ekran daha bulunur:

40a567cda0f31cc9.png

Bu kodu kopyalayıp terminal penceresine yapıştırın.

Özet

"Authentication successful" dışında bir ek çıkış olması gerekmez. Bunun yalnızca kurulum olduğunu unutmayın. Henüz hiçbir şey yapmadınız. Yaptığınız şey, ilk seferde doğru şekilde yürütülme olasılığı daha yüksek olan bir şeye doğru yolculuğunuza başarıyla başladınız. (En iyi yanı da sizden yalnızca bir kez yetkilendirme yapmanızın istenmesidir. Sonraki tüm yürütmeler, izinleriniz önbelleğe alınmış olduğundan yetkilendirme atlanır.) Şimdi kodu gerçek çıktıyla sonuçlanacak şekilde yapalım.

Sorun giderme

Çıkış yok yerine bir hata alıyorsanız bunun bir veya daha fazla nedeni olabilir. Bunun nedeni aşağıdakilerden biri olabilir:

8. 1. Adım: Google Drive'dan resim indirin

Önceki adımda, kodu analyze_gsimg.py olarak oluşturmanızı ve buradan düzenlemenizi önermiştik. Her şeyi kesip doğrudan iPython veya standart Python kabuğuna yapıştırmak da mümkün. Ancak uygulamayı parça parça geliştirmeye devam edeceğimiz için bu süreç daha zahmetli olacak.

Uygulamanızın yetkilendirildiğini ve API hizmeti uç noktasının oluşturulduğunu varsayalım. Bu değer, kodunuzda DRIVE değişkeniyle gösterilir. Şimdi Google Drive'ınızda bir resim dosyası bulalım ve

onu NAME adlı bir değişkene ayarlayın. Bu değeri ve aşağıdaki drive_get_img() işlevini 0. Adım'daki kodun hemen altına girin:

FILE = 'YOUR_IMG_ON_DRIVE'  # fill-in with name of your Drive file

def drive_get_img(fname):
    'download file from Drive and return file info & binary if found'

    # search for file on Google Drive
    rsp = DRIVE.files().list(q="name='%s'" % fname,
            fields='files(id,name,mimeType,modifiedTime)'
    ).execute().get('files', [])

    # download binary & return file info if found, else return None
    if rsp:
        target = rsp[0]  # use first matching file
        fileId = target['id']
        fname = target['name']
        mtype = target['mimeType']
        binary = DRIVE.files().get_media(fileId=fileId).execute()
        return fname, mtype, target['modifiedTime'], binary

files() Drive koleksiyonu, belirtilen dosya için sorgu gerçekleştiren bir list() yöntemine (q parametresi) sahiptir. fields parametresi, ilgilendiğiniz değer döndürdüğü değerleri belirtmek için kullanılır. Diğer değerleri umursamıyorsanız neden her şeyi geri alıp işleri yavaşlatabilirsiniz? API döndürme değerlerini filtrelemek için alan maskelerini kullanmaya yeni başladıysanız bu blog yayınına ve videosunu izleyin. Aksi takdirde, sorguyu yürütün ve eşleşen files özelliğini alın. Eşleşme olmazsa varsayılan olarak boş bir liste dizisi kullanılır.

Sonuç yoksa işlevin geri kalanı atlanır ve None döndürülür (dolaylı olarak). Aksi takdirde, eşleşen ilk yanıtı (rsp[0]) alın; dosya adını, MIME türünü, son değiştirme zaman damgasını ve son olarak da files() koleksiyonundaki get_media() işlevi tarafından (dosya kimliği aracılığıyla) alınan ikili yükünü döndürün. (Yöntem adları diğer dillerdeki istemci kitaplıklarından biraz farklı olabilir.)

Son kısım ise “ana” tüm uygulamayı yönlendiren gövde:

if __name__ == '__main__':
    # download img file & info from Drive
    rsp = drive_get_img(FILE)
    if rsp:
        fname, mtype, ftime, data = rsp
        print('Downloaded %r (%s, %s, size: %d)' % (fname, mtype, ftime, len(data)))
    else:
        print('ERROR: Cannot download %r from Drive' % fname)

Drive'da section-work-card-img_2x.jpg adlı bir resmin FILE olarak ayarlandığını varsayarsak komut dosyası yürütme işlemi başarılı olduktan sonra, dosyanın Drive'dan okunabildiğini doğrulayan (ancak bilgisayarınıza kaydedilmeyen) bir çıkış görürsünüz:

$ python3 analyze_gsimg.py
Downloaded 'section-work-card-img_2x.jpg' (image/jpeg, 2020-02-27T09:27:22.095Z, size: 27781)

Sorun giderme

Yukarıdaki gibi başarılı bir sonuç alamazsanız bunun nedeni aşağıdakilerden biri veya birkaçı olabilir:

Özet

Bu bölümde, Drive API'ye bağlanarak belirli bir dosyayı sorgulayıp bu dosyayı nasıl indireceğinizi (2 ayrı API çağrısında) öğrendiniz. İş için kullanım alanı: Drive verilerinizi arşivleyin ve Google Cloud araçları gibi yöntemlerle analiz edin. Uygulamanızın bu aşamadaki kodu, step1-drive/analyze_gsimg.py adresindeki depoda bulunan kodla eşleşmelidir.

Google Drive'da dosya indirme hakkında daha fazla bilgiyi buradan edinebilir veya bu blog yayınına ve videosunu izleyin. Codelab'in bu bölümü, Google Workspace API'leri için giriş niteliğindeki codelab bölümüyle neredeyse aynıdır. Bu bölüm, bir dosyayı indirmek yerine kullanıcının Google Drive'ındaki ilk 100 dosyayı/klasörü gösterir ve daha kısıtlayıcı bir kapsam kullanır.

9. 2. Adım: Dosyayı Cloud Storage'da arşivleyin

Bir sonraki adım, Google Cloud Storage için destek eklemektir. Bunun için başka bir Python paketini (io) içe aktarmamız gerekir. İçe aktarma işlemlerinizin üst bölümünün artık aşağıdaki gibi göründüğünden emin olun:

from __future__ import print_function                   
import io

Drive dosya adının yanı sıra bu dosyanın Cloud Storage'da depolanacağı yerle ilgili bazı bilgilere (özellikle "paket"in adı) ihtiyacımız var ilgili "üst klasör" klasörünün içine ön ekler. Birazdan bununla ilgili daha fazla bilgi edineceğiz:

FILE = 'YOUR_IMG_ON_DRIVE'
BUCKET = 'YOUR_BUCKET_NAME'
PARENT = ''     # YOUR IMG FILE PREFIX                  

Paketler hakkında bilgi: Cloud Storage, amorf blob depolama alanı sağlar. Buraya dosya yüklerken, Google Drive'ın işleyişi gibi dosya türü, uzantı vb. kavramlarını anlamaz. Onlar sadece birer "blob" Cloud Storage'a taşıdık. Ayrıca Cloud Storage'da klasör veya alt dizin gibi bir kavram yoktur.

Evet, dosya adlarında birden fazla alt klasörün soyutlanmasını temsil edecek eğik çizgi (/) kullanabilirsiniz ancak günün sonunda tüm blob'larınız bir pakete gider ve "/"'ler dosya adlarında yalnızca karakterlerdir. Daha fazla bilgi için paket ve nesne adlandırma kuralları sayfasına göz atın.

Yukarıdaki 1. adımda Drive salt okunur kapsamı istendi. Şu anda tek ihtiyacınız olan bu. Artık Cloud Storage'a yükleme (okuma-yazma) izni gerekiyor. SCOPES değerini tek dizeli değişkenden bir izin kapsamları dizisiyle (Python tuple [veya listesi]) değiştirin. Böylece aşağıdaki gibi görünür:

SCOPES = (
    'https://www.googleapis.com/auth/drive.readonly',
    'https://www.googleapis.com/auth/devstorage.full_control',
)                  

Şimdi Drive için uç noktanın hemen altında, Cloud Storage'a yönelik bir hizmet uç noktası oluşturun. Aynı HTTP istemci nesnesini yeniden kullanmak için çağrıda küçük değişiklikler yaptığımızı unutmayın. Çünkü bu nesne paylaşılan bir kaynak olduğunda yeni bir istemci oluşturmaya gerek yoktur.

# create API service endpoints
HTTP = creds.authorize(Http())
DRIVE  = discovery.build('drive',   'v3', http=HTTP)
GCS    = discovery.build('storage', 'v1', http=HTTP)                  

Şimdi, Cloud Storage'a yükleme yapan şu işlevi (drive_get_img() tarihinden sonra) ekleyin:

def gcs_blob_upload(fname, bucket, media, mimetype):
    'upload an object to a Google Cloud Storage bucket'

    # build blob metadata and upload via GCS API
    body = {'name': fname, 'uploadType': 'multipart', 'contentType': mimetype}
    return GCS.objects().insert(bucket=bucket, body=body,
            media_body=http.MediaIoBaseUpload(io.BytesIO(media), mimetype),
            fields='bucket,name').execute()

objects.().insert() çağrısı için paket adı, dosya meta verileri ve ikili blob'un kendisi gerekir. Döndürülen değerleri filtrelemek için fields değişkeni yalnızca API'den döndürülen paket ve nesne adlarını ister. API okuma isteklerindeki bu alan maskeleri hakkında daha fazla bilgi için bu yayına ve videosunu izleyin.

Şimdi gcs_blob_upload() kullanımını ana uygulamaya entegre edin:

        # upload file to GCS
        gcsname = '%s/%s'% (PARENT, fname)
        rsp = gcs_blob_upload(gcsname, BUCKET, data, mtype)
        if rsp:
            print('Uploaded %r to GCS bucket %r' % (rsp['name'], rsp['bucket']))
        else:
            print('ERROR: Cannot upload %r to Cloud Storage' % gcsname)

gcsname değişkeni, tüm "üst alt dizini" birleştirir adlar, dosya adının kendisine eklenir ve paket adının önüne eklenirse dosyayı "/bucket/parent.../filename" konumunda arşivlediğiniz gösterimi ortaya çıkarır. Bu parçayı, ilk print() işlevinden hemen sonra, else yan tümcesinin hemen üzerine kaydırın. Böylece, "main" öğesinin tamamının şöyle görünür:

if __name__ == '__main__':
    # download img file & info from Drive
    rsp = drive_get_img(FILE)
    if rsp:
        fname, mtype, ftime, data = rsp
        print('Downloaded %r (%s, %s, size: %d)' % (fname, mtype, ftime, len(data)))

        # upload file to GCS
        gcsname = '%s/%s'% (PARENT, fname)
        rsp = gcs_blob_upload(gcsname, BUCKET, data, mtype)
        if rsp:
            print('Uploaded %r to GCS bucket %r' % (rsp['name'], rsp['bucket']))
        else:
            print('ERROR: Cannot upload %r to Cloud Storage' % gcsname)
    else:
        print('ERROR: Cannot download %r from Drive' % fname)

"vision-demo" adlı bir paket belirttiğimizi varsayalım "analyzed_imgs" ile "ana alt dizin" olarak ayarlayabilirsiniz. Bu değişkenleri ayarlayıp komut dosyasını tekrar çalıştırdığınızda, section-work-card-img_2x.jpg Drive'dan indirilip Cloud Storage'a yüklenir, değil mi? DEĞİL!

$ python3 analyze_gsimg.py 
Downloaded 'section-work-card-img_2x.jpg' (image/jpeg, 2020-02-27T09:27:22.095Z, size: 27781)
Traceback (most recent call last):
  File "analyze_gsimg.py", line 85, in <module>
    io.BytesIO(data), mimetype=mtype), mtype)
  File "analyze_gsimg.py", line 72, in gcs_blob_upload
    media_body=media, fields='bucket,name').execute()
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/googleapiclient/_helpers.py", line 134, in positional_wrapper
    return wrapped(*args, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/googleapiclient/http.py", line 898, in execute
    raise HttpError(resp, content, uri=self.uri)
googleapiclient.errors.HttpError: <HttpError 403 when requesting https://storage.googleapis.com/upload/storage/v1/b/PROJECT_ID/o?fields=bucket%2Cname&alt=json&uploadType=multipart returned "Insufficient Permission">

Dikkatli bir şekilde inceleyin. Drive indirme işlemi başarılı olsa da Cloud Storage'a yükleme başarısız oldu. Neden?

Bunun nedeni, bu uygulamayı 1. Adım için yetkilendirdiğimizde, Google Drive'a yalnızca salt okuma erişimine izin vermiş olmamızdır. Cloud Storage için okuma-yazma kapsamını eklemiş olsak da hiçbir zaman kullanıcıdan bu erişimi yetkilendirmesini istemedik. Çalıştırmak için, bu kapsamda olmayan storage.json dosyasını kaldırıp yeniden çalıştırmamız gerekir.

Yeniden yetkilendirdikten sonra (storage.json içine bakıp her iki kapsamı da orada görebilirsiniz) çıktınız aşağıdaki gibi olacaktır:

$ python3 analyze_gsimg.py

    . . .

Authentication successful.
Downloaded 'section-work-card-img_2x.jpg' (image/jpeg, 2020-02-27T09:27:22.095Z, size: 27781)
Uploaded 'analyzed_imgs/section-work-card-img_2x.jpg' to GCS bucket 'vision-demo'

Özet

Bu, iki bulut tabanlı depolama sistemi arasında dosyaları nasıl aktarabileceğinizi birkaç satır kodla gösteren önemli bir uygulamadır. Buradaki iş kullanım alanı, muhtemelen kısıtlanmış bir kaynağı "daha soğuk" olarak yedeklemektir. belirttiğimiz gibi daha ucuz depolama alanı. Cloud Storage, verilerinize düzenli, aylık, üç aylık veya yıllık olarak erişme durumunuza bağlı olarak farklı depolama sınıfları sunar.

Elbette geliştiriciler zaman zaman bize hem Google Drive'ın hem de Cloud Storage'ın neden var olduğunu soruyorlar. Sonuçta, ikisi de bulutta dosya depolama alanı değil mi? Bu nedenle bu videoyu hazırladık. Bu aşamadaki kodunuz, step2-gcs/analyze_gsimg.py adresindeki depoda bulunan kodla eşleşmelidir.

10. 3. Adım: Cloud Vision ile analiz edin

Artık verileri Google Cloud ile Google Workspace arasında taşıyabileceğinizi biliyoruz. Ancak henüz herhangi bir analiz yapmadık. Bu nedenle, etiket ek açıklaması olarak nesne algılama olarak da bilinen resmi Cloud Vision'a göndermeniz gerekir. Bunun için verileri Base64 olarak kodlamamız gerekir. Bu da base64 adlı başka bir Python modülünün bir örneğidir. Üst içe aktarma bölümünüzün artık aşağıdaki gibi göründüğünden emin olun:

from __future__ import print_function
import base64
import io

Vision API, varsayılan olarak bulduğu tüm etiketleri döndürür. İşlerin tutarlı olması için en iyi 5 özelliği isteyelim (kullanıcı tarafından ayarlanabilir). Bunun için TOP sabit değişkeni kullanacağız. bunu diğer tüm sabit değerlerin altına ekleyin:

FILE = 'YOUR_IMG_ON_DRIVE'
BUCKET = 'YOUR_BUCKET_NAME'
PARENT = ''   # YOUR IMG FILE PREFIX 
TOP = 5       # TOP # of VISION LABELS TO SAVE                 

Önceki adımlarda olduğu gibi, bu kez Vision API için başka bir izin kapsamına ihtiyacımız var. SCOPES öğesini kendi dizesiyle güncelleyin:

SCOPES = (
    'https://www.googleapis.com/auth/drive.readonly',
    'https://www.googleapis.com/auth/devstorage.full_control',
    'https://www.googleapis.com/auth/cloud-vision',
)                  

Şimdi, Cloud Vision'da aşağıdakine benzer diğerleriyle uyumlu olması için bir hizmet uç noktası oluşturun:

# create API service endpoints
HTTP = creds.authorize(Http())
DRIVE  = discovery.build('drive',   'v3', http=HTTP)
GCS    = discovery.build('storage', 'v1', http=HTTP)
VISION = discovery.build('vision',  'v1', http=HTTP)

Şimdi de görüntü yükünü Cloud Vision'a gönderen şu işlevi ekleyin:

def vision_label_img(img, top):
    'send image to Vision API for label annotation'

    # build image metadata and call Vision API to process
    body = {'requests': [{
                'image':     {'content': img},
                'features': [{'type': 'LABEL_DETECTION', 'maxResults': top}],
    }]}
    rsp = VISION.images().annotate(body=body).execute().get('responses', [{}])[0]

    # return top labels for image as CSV for Sheet (row)
    if 'labelAnnotations' in rsp:
        return ', '.join('(%.2f%%) %s' % (
                label['score']*100., label['description']) \
                for label in rsp['labelAnnotations'])

images().annotate() çağrısı, verilerin yanı sıra istenen API özelliklerini gerektirir. İlk 5 etiket sınırı da yükün bir parçasıdır (ancak tamamen isteğe bağlıdır). Çağrı başarılı olursa yük, ilk 5 nesne etiketini ve bir nesnenin resimdeki güven puanını döndürür. (Yanıt gelmezse aşağıdaki if ifadesinin başarısız olması için boş bir Python sözlüğü atayın.) Bu işlev, raporumuzda nihai kullanım için bu verileri bir CSV dizesinde birleştirir.

vision_label_img() çağrısı yapan şu 5 satır, Cloud Storage'a başarılı yükleme işleminden hemen sonra yerleştirilmelidir:

            # process w/Vision
            rsp = vision_label_img(base64.b64encode(data).decode('utf-8'), TOP)
            if rsp:
                print('Top %d labels from Vision API: %s' % (TOP, rsp))
            else:
                print('ERROR: Vision API cannot analyze %r' % fname)

Bu eklemeyle, ana sürücünün tamamı aşağıdaki gibi görünmelidir:

if __name__ == '__main__':
    # download img file & info from Drive
    rsp = drive_get_img(FILE)
    if rsp:
        fname, mtype, ftime, data = rsp
        print('Downloaded %r (%s, %s, size: %d)' % (fname, mtype, ftime, len(data)))

        # upload file to GCS
        gcsname = '%s/%s'% (PARENT, fname)
        rsp = gcs_blob_upload(gcsname, BUCKET, data, mtype)
        if rsp:
            print('Uploaded %r to GCS bucket %r' % (rsp['name'], rsp['bucket']))

            # process w/Vision
            rsp = vision_label_img(base64.b64encode(data).decode('utf-8'), TOP)
            if rsp:
                print('Top %d labels from Vision API: %s' % (TOP, rsp))
            else:
                print('ERROR: Vision API cannot analyze %r' % fname)
        else:
            print('ERROR: Cannot upload %r to Cloud Storage' % gcsname)
    else:
        print('ERROR: Cannot download %r from Drive' % fname)

Kapsamları yenilemek için storage.json politikasını silmek ve güncellenmiş uygulamayı yeniden çalıştırmak, Cloud Vision analizinin eklendiğine dair şuna benzer bir çıkışla sonuçlanacaktır:

$ python3 analyze_gsimg.py

    . . .

Authentication successful.
Downloaded 'section-work-card-img_2x.jpg' (image/jpeg, 2020-02-27T09:27:22.095Z, size: 27781)
Uploaded 'analyzed_imgs/section-work-card-img_2x.jpg' to GCS bucket 'vision-demo'
Top 5 labels from Vision API: (89.94%) Sitting, (86.09%) Interior design, (82.08%) Furniture, (81.52%) Table, (80.85%) Room

Özet

Herkes, verilerini analiz etmek için kendi makine öğrenimi modellerini oluşturup eğitmek için gereken makine öğrenimi uzmanlığına sahip değildir. Google Cloud Ekibi, Google'ın önceden eğitilmiş bazı modellerini genel kullanım için kullanıma sundu ve bunları API'lerin arkasına yerleştirerek yapay zekanın ve herkesin Herkes için makine öğrenimi.

Geliştiriciyseniz ve API çağırabiliyorsanız makine öğrenimini kullanabilirsiniz. Cloud Vision, verilerinizi analiz etmek için kullanabileceğiniz API hizmetlerinden yalnızca biridir. Diğer özellikler hakkında buradan bilgi edinebilirsiniz. Kodunuz step3-vision/analyze_gsimg.py adresindeki kod deposunda bulunan kodla eşleşmelidir.

11. 4. Adım: Google E-Tablolar ile rapor oluşturun

Bu noktada, kurumsal verileri arşivleyip analiz edebiliyorsunuz, ancak bu çalışmanın bir özeti eksik. Tüm sonuçları patronunuza verebileceğiniz tek bir rapor halinde düzenleyelim. Hangisi yönetim açısından e-tablodan daha görünürdür?

Google Sheets API için ek içe aktarma işlemi gerekmez. Gereken tek yeni bilgi, halihazırda biçimlendirilmiş ve yeni bir veri satırı bekleyen mevcut bir e-tablonun dosya kimliğidir. Dolayısıyla SHEET sabitidir. Aşağıdakine benzer yeni bir e-tablo oluşturmanızı öneririz:

4def78583d05300.png

Bu e-tablonun URL'si şöyle görünür: https://docs.google.com/spreadsheets/d/FILE_ID/edit. FILE_ID öğesini al ve SHEET adlı kullanıcıya bir aralık olarak atayın.

Ayrıca, baytları kilobayta dönüştüren ve 1 satırlık basit bir kod olduğu için Python lambda olarak tanımlayan k_ize() adlı küçük bir işlevin içine girdik. Bunların her ikisi de diğer sabit değerlerle entegre şu şekilde görünür:

k_ize =  lambda b: '%6.2fK' % (b/1000.)  # bytes to kBs
FILE = 'YOUR_IMG_ON_DRIVE'
BUCKET = 'YOUR_BUCKET_NAME'
PARENT = ''     # YOUR IMG FILE PREFIX
SHEET = 'YOUR_SHEET_ID'
TOP = 5       # TOP # of VISION LABELS TO SAVE                 

Önceki adımlarda olduğu gibi, başka bir izin kapsamına, şu anda Sheets API için okuma-yazma işlemine ihtiyacımız var. SCOPES artık şunları da ihtiyaç duyuyor:

SCOPES = (
    'https://www.googleapis.com/auth/drive.readonly',
    'https://www.googleapis.com/auth/devstorage.full_control',
    'https://www.googleapis.com/auth/cloud-vision',
    'https://www.googleapis.com/auth/spreadsheets',
)                  

Şimdi, diğerlerinin yakınında Google E-Tablolar'a yönelik bir hizmet uç noktası oluşturun. Böylece şu şekilde görünür:

# create API service endpoints
HTTP = creds.authorize(Http())
DRIVE  = discovery.build('drive',   'v3', http=HTTP)
GCS    = discovery.build('storage', 'v1', http=HTTP)
VISION = discovery.build('vision',  'v1', http=HTTP)
SHEETS = discovery.build('sheets',  'v4', http=HTTP)

sheet_append_row()'nin işlevi oldukça basittir: Bir veri satırı ile bir E-tablonun kimliğini alın, ardından söz konusu satırı söz konusu Sayfaya ekleyin:

def sheet_append_row(sheet, row):
    'append row to a Google Sheet, return #cells added'

    # call Sheets API to write row to Sheet (via its ID)
    rsp = SHEETS.spreadsheets().values().append(
            spreadsheetId=sheet, range='Sheet1',
            valueInputOption='USER_ENTERED', body={'values': [row]}
    ).execute()
    if rsp:
        return rsp.get('updates').get('updatedCells')

spreadsheets().values().append() çağrısı için e-tablonun dosya kimliği, hücre aralığı, verilerin nasıl girileceği ve verilerin kendisi gerekir. Dosya kimliği basittir, hücre aralığı A1 gösteriminde verilmiştir. "Sheet1" aralığı sayfanın tamamı anlamına gelir. Bu, API'ye, e-tablodaki tüm verilerden sonra satırı eklemesi için sinyal gönderir. Verilerin e-tabloya nasıl eklenmesi gerektiğiyle ilgili iki seçenek bulunur: "RAW" (dize verilerini aynen girin) veya "USER_ENTERED" (verileri, Google E-Tablolar uygulamasını kullanarak klavyeden girmiş gibi yazarak hücre biçimlendirme özelliklerini koruyarak) yapabilirsiniz.

Çağrı başarılı olursa döndürülen değerin hiçbir faydası olmayacaktır. Bu nedenle, API isteği tarafından güncellenen hücre sayısını almayı tercih ettik. Bu işlevi çağıran kod aşağıda yer almaktadır:

                # push results to Sheet, get cells-saved count
                fsize = k_ize(len(data))
                row = [PARENT,
                        '=HYPERLINK("storage.cloud.google.com/%s/%s", "%s")' % (
                        BUCKET, gcsname, fname), mtype, ftime, fsize, rsp
                ]
                rsp = sheet_append_row(SHEET, row)
                if rsp:
                    print('Updated %d cells in Google Sheet' % rsp)
                else:
                    print('ERROR: Cannot write row to Google Sheets')

Google E-Tablosu'nda, üst "alt dizin" gibi verileri temsil eden sütunlar bulunur. arşivlenmiş dosyanın Cloud Storage'daki konumu (paket + dosya adı), dosyanın MIME türü, dosya boyutu (başlangıçta bayt cinsinden ancak k_ize() ile kilobayta dönüştürülmüştür) ve Cloud Vision etiket dizesi gösterilir. Ayrıca, arşivlenen konumun bir köprü olduğunu ve yöneticinizin güvenli bir şekilde yedeklendiğini onaylamak için tıklamasını istediğinizi unutmayın.

Cloud Vision'ın sonuçlarını gösterdikten hemen sonra yukarıdaki kod bloğunu eklemek, uygulamayı yönlendiren ana kısmın tamamlanmasına rağmen yapısal olarak biraz karmaşık hale gelmiştir:

if __name__ == '__main__':
    # download img file & info from Drive
    rsp = drive_get_img(FILE)
    if rsp:
        fname, mtype, ftime, data = rsp
        print('Downloaded %r (%s, %s, size: %d)' % (fname, mtype, ftime, len(data)))

        # upload file to GCS
        gcsname = '%s/%s'% (PARENT, fname)
        rsp = gcs_blob_upload(gcsname, BUCKET, data, mtype)
        if rsp:
            print('Uploaded %r to GCS bucket %r' % (rsp['name'], rsp['bucket']))

            # process w/Vision
            rsp = vision_label_img(base64.b64encode(data).decode('utf-8'))
            if rsp:
                print('Top %d labels from Vision API: %s' % (TOP, rsp))

                # push results to Sheet, get cells-saved count
                fsize = k_ize(len(data))
                row = [PARENT,
                        '=HYPERLINK("storage.cloud.google.com/%s/%s", "%s")' % (
                        BUCKET, gcsname, fname), mtype, ftime, fsize, rsp
                ]
                rsp = sheet_append_row(SHEET, row)
                if rsp:
                    print('Updated %d cells in Google Sheet' % rsp)
                else:
                    print('ERROR: Cannot write row to Google Sheets')
            else:
                print('ERROR: Vision API cannot analyze %r' % fname)
        else:
            print('ERROR: Cannot upload %r to Cloud Storage' % gcsname)
    else:
        print('ERROR: Cannot download %r from Drive' % fname)

storage.json uygulamasını son bir kez silip güncellenen uygulamayı yeniden çalıştırmak, aşağıdakine benzer bir çıkışla sonuçlanır. Cloud Vision analizine de ek olarak şunları dikkate alın:

$ python3 analyze_gsimg.py

    . . .

Authentication successful.
Downloaded 'section-work-card-img_2x.jpg' (image/jpeg, 2020-02-27T09:27:22.095Z, size: 27781)
Uploaded 'analyzed_imgs/section-work-card-img_2x.jpg' to GCS bucket 'vision-demo'
Top 5 labels from Vision API: (89.94%) Sitting, (86.09%) Interior design, (82.08%) Furniture, (81.52%) Table, (80.85%) Room
Updated 6 cells in Google Sheet

Ek çıktı satırı kullanışlı olmakla birlikte, güncellenmiş Google E-Tablosu'na göz attığınızda daha iyi görselleştirilir. Son satır (aşağıdaki örnekte 7. satır) önceden eklenmiş mevcut veri kümesine eklenir:

b53a5bc944734652.png

Özet

Bu eğiticinin ilk 3 adımında, tüm çalışmaların% 80'ini temsil ederek verileri taşımak ve analiz etmek için Google Workspace ve Google Cloud API'leriyle bağlantı kurdunuz. Ancak nihayetinde, elde ettiğiniz her şeyi yönetime sunamıyorsanız bunların hiçbiri bir anlam ifade etmez. Sonuçları daha iyi görselleştirmek için oluşturulan bir rapordaki tüm sonuçları özetlemek çok önemlidir.

Analizin yararlılığını daha da artırmak için, sonuçları bir e-tabloya yazmaya ek olarak, olası bir geliştirme, her resim için bu en iyi 5 etiketin dizine eklenmesidir. Böylece, yetkili çalışanların arama ekibi tarafından resim sorgulamasına olanak tanıyan dahili bir veritabanı oluşturulabilir. Ancak bunu, okuyuculara yönelik bir alıştırma olarak bırakıyoruz.

Şu an için sonuçlarımız bir e-tabloda yer almaktadır ve yönetim tarafından erişilebilir. Uygulamanızın bu aşamadaki kodu, step4-sheets/analyze_gsimg.py adresindeki depoda bulunan kodla eşleşmelidir. Son adım, kodu temizlemek ve kullanılabilir bir komut dosyasına dönüştürmektir.

12. *Son adım: yeniden düzenleme

(isteğe bağlı) Çalışan bir uygulamanın olması iyi ancak bunu iyileştirebilir miyiz? Evet, özellikle karmakarışık görünen ana uygulama. Bunu kendi işlevine koyalım ve sabit sabit değerler yerine kullanıcı girişine olanak tanıyalım. Bunu argparse modülüyle yapacağız. Ayrıca, veri satırımızı girdikten sonra E-tabloyu görüntülemek için bir web tarayıcısı sekmesi başlatalım. Bunu webbrowser modülüyle yapabilirsiniz. Bu içe aktarmaları diğerleriyle dokundurarak en iyi içe aktarma işlemlerinin aşağıdaki gibi görünmesini sağlayın:

from __future__ import print_function
import argparse
import base64
import io
import webbrowser

Bu kodu diğer uygulamalarda kullanabilmek için çıkışı engelleme yeteneğine ihtiyacımız var. Bunun gerçekleşmesi için bu satırı üst tarafa yakın sabit değerler bölümünün sonuna ekleyerek bir DEBUG işareti ekleyelim:

DEBUG = False

Şimdi ana gövde bölümüne gelelim. Bu örneği oluştururken, muhtemelen kendinizi rahatsız etmeniz gerekirdi. ekleyebilirsiniz. Böyle düşünüyorsanız yalnız değilsiniz. Bu Google Test Blogu yayınında açıklandığı şekilde kod karmaşıklığı da artar.

Bu en iyi uygulamadan yola çıkarak uygulamanın ana bölümünü bir fonksiyon olacak ve her bir "ara" noktası için return olacak şekilde yeniden düzenleyelim. (herhangi bir adım başarısız olursa None ve tümü başarılı olursa True değeri döndürülür):

def main(fname, bucket, sheet_id, folder, top, debug):
    '"main()" drives process from image download through report generation'

    # download img file & info from Drive
    rsp = drive_get_img(fname)
    if not rsp:
        return
    fname, mtype, ftime, data = rsp
    if debug:
        print('Downloaded %r (%s, %s, size: %d)' % (fname, mtype, ftime, len(data)))

    # upload file to GCS
    gcsname = '%s/%s'% (folder, fname)
    rsp = gcs_blob_upload(gcsname, bucket, data, mtype)
    if not rsp:
        return
    if debug:
        print('Uploaded %r to GCS bucket %r' % (rsp['name'], rsp['bucket']))

    # process w/Vision
    rsp = vision_label_img(base64.b64encode(data).decode('utf-8'))
    if not rsp:
        return
    if debug:
        print('Top %d labels from Vision API: %s' % (top, rsp))

    # push results to Sheet, get cells-saved count
    fsize = k_ize(len(data))
    row = [folder,
            '=HYPERLINK("storage.cloud.google.com/%s/%s", "%s")' % (
            bucket, gcsname, fname), mtype, ftime, fsize, rsp
    ]
    rsp = sheet_append_row(sheet_id, row)
    if not rsp:
        return
    if debug:
        print('Added %d cells to Google Sheet' % rsp)
    return True

Hem daha düzenli hem de daha düzenli olup yinelenen if-else zinciri hissini geride bırakır ve yukarıda açıklandığı gibi kod karmaşıklığını azaltır. Yapbozun son parçası, gerçek bir "gerçek" Kullanıcı özelleştirmesine olanak tanıyarak ve çıktıyı en aza indirerek (istenmediği sürece):

if __name__ == '__main__':
    # args: [-hv] [-i imgfile] [-b bucket] [-f folder] [-s Sheet ID] [-t top labels]
    parser = argparse.ArgumentParser()
    parser.add_argument("-i", "--imgfile", action="store_true",
            default=FILE, help="image file filename")
    parser.add_argument("-b", "--bucket_id", action="store_true",
            default=BUCKET, help="Google Cloud Storage bucket name")
    parser.add_argument("-f", "--folder", action="store_true",
            default=PARENT, help="Google Cloud Storage image folder")
    parser.add_argument("-s", "--sheet_id", action="store_true",
            default=SHEET, help="Google Sheet Drive file ID (44-char str)")
    parser.add_argument("-t", "--viz_top", action="store_true",
            default=TOP, help="return top N (default %d) Vision API labels" % TOP)
    parser.add_argument("-v", "--verbose", action="store_true",
            default=DEBUG, help="verbose display output")
    args = parser.parse_args()

    print('Processing file %r... please wait' % args.imgfile)
    rsp = main(args.imgfile, args.bucket_id,
            args.sheet_id, args.folder, args.viz_top, args.verbose)
    if rsp:
        sheet_url = 'https://docs.google.com/spreadsheets/d/%s/edit' % args.sheet_id
        print('DONE: opening web browser to it, or see %s' % sheet_url)
        webbrowser.open(sheet_url, new=1, autoraise=True)
    else:
        print('ERROR: could not process %r' % args.imgfile)

Tüm adımlar başarılı olursa komut dosyası, yeni veri satırının eklendiği yeri belirtilen e-tabloya bir web tarayıcısı başlatır.

Özet

Kapsam değişikliği gerçekleşmediğinden storage.json öğesini silmenize gerek yoktur. Güncellenen uygulamayı yeniden çalıştırmanız, değiştirilmiş e-tabloya açılan yeni bir tarayıcı penceresinin açıldığını, daha az çıkış satırının bulunduğunu ve -h seçeneği belirlediğinizde kullanıcılara seçeneklerini gösterir. Buna -v, daha önce gösterilen şu anda engellenmiş durumda olan çıkış satırlarını geri yükleme seçenekleri de dahildir:

$ python3 analyze_gsimg.py
Processing file 'section-work-card-img_2x.jpg'... please wait
DONE: opening web browser to it, or see https://docs.google.com/spreadsheets/d/SHEET_ID/edit

$ python3 analyze_gsimg.py -h
usage: analyze_gsimg.py [-h] [-i] [-t] [-f] [-b] [-s] [-v]

optional arguments:
  -h, --help       show this help message and exit
  -i, --imgfile    image file filename
  -t, --viz_top    return top N (default 5) Vision API labels
  -f, --folder     Google Cloud Storage image folder
  -b, --bucket_id  Google Cloud Storage bucket name
  -s, --sheet_id   Google Sheet Drive file ID (44-char str)
  -v, --verbose    verbose display output

Diğer seçenekler, kullanıcıların farklı Drive dosyası adları (Cloud Storage "alt dizini") seçmesine olanak tanır. ve paket adlarına, üst "N"ye Cloud Vision'dan alınan sonuçları ve e-tablo (E-Tablolar) dosya kimliklerini kapsar. Bu son güncellemelerle birlikte, kodunuzun son sürümü artık final/analyze_gsimg.py adresindeki depoda ve buradaki kod deposunda bulunanlarla tamamen eşleşmelidir:

'''
analyze_gsimg.py - analyze Google Workspace image processing workflow

Download image from Google Drive, archive to Google Cloud Storage, send
to Google Cloud Vision for processing, add results row to Google Sheet.
'''

from __future__ import print_function
import argparse
import base64
import io
import webbrowser

from googleapiclient import discovery, http
from httplib2 import Http
from oauth2client import file, client, tools

k_ize = lambda b: '%6.2fK' % (b/1000.) # bytes to kBs
FILE = 'YOUR_IMG_ON_DRIVE'
BUCKET = 'YOUR_BUCKET_NAME'
PARENT = ''     # YOUR IMG FILE PREFIX
SHEET = 'YOUR_SHEET_ID'
TOP = 5       # TOP # of VISION LABELS TO SAVE
DEBUG = False

# process credentials for OAuth2 tokens
SCOPES = (
    'https://www.googleapis.com/auth/drive.readonly',
    'https://www.googleapis.com/auth/devstorage.full_control',
    'https://www.googleapis.com/auth/cloud-vision',
    'https://www.googleapis.com/auth/spreadsheets',
)
store = file.Storage('storage.json')
creds = store.get()
if not creds or creds.invalid:
    flow = client.flow_from_clientsecrets('client_secret.json', SCOPES)
    creds = tools.run_flow(flow, store)

# create API service endpoints
HTTP = creds.authorize(Http())
DRIVE  = discovery.build('drive',   'v3', http=HTTP)
GCS    = discovery.build('storage', 'v1', http=HTTP)
VISION = discovery.build('vision',  'v1', http=HTTP)
SHEETS = discovery.build('sheets',  'v4', http=HTTP)


def drive_get_img(fname):
    'download file from Drive and return file info & binary if found'

    # search for file on Google Drive
    rsp = DRIVE.files().list(q="name='%s'" % fname,
            fields='files(id,name,mimeType,modifiedTime)'
    ).execute().get('files', [])

    # download binary & return file info if found, else return None
    if rsp:
        target = rsp[0]  # use first matching file
        fileId = target['id']
        fname = target['name']
        mtype = target['mimeType']
        binary = DRIVE.files().get_media(fileId=fileId).execute()
        return fname, mtype, target['modifiedTime'], binary


def gcs_blob_upload(fname, bucket, media, mimetype):
    'upload an object to a Google Cloud Storage bucket'

    # build blob metadata and upload via GCS API
    body = {'name': fname, 'uploadType': 'multipart', 'contentType': mimetype}
    return GCS.objects().insert(bucket=bucket, body=body,
            media_body=http.MediaIoBaseUpload(io.BytesIO(media), mimetype),
            fields='bucket,name').execute()


def vision_label_img(img, top):
    'send image to Vision API for label annotation'

    # build image metadata and call Vision API to process
    body = {'requests': [{
                'image':     {'content': img},
                'features': [{'type': 'LABEL_DETECTION', 'maxResults': top}],
    }]}
    rsp = VISION.images().annotate(body=body).execute().get('responses', [{}])[0]

    # return top labels for image as CSV for Sheet (row)
    if 'labelAnnotations' in rsp:
        return ', '.join('(%.2f%%) %s' % (
                label['score']*100., label['description']) \
                for label in rsp['labelAnnotations'])


def sheet_append_row(sheet, row):
    'append row to a Google Sheet, return #cells added'

    # call Sheets API to write row to Sheet (via its ID)
    rsp = SHEETS.spreadsheets().values().append(
            spreadsheetId=sheet, range='Sheet1',
            valueInputOption='USER_ENTERED', body={'values': [row]}
    ).execute()
    if rsp:
        return rsp.get('updates').get('updatedCells')


def main(fname, bucket, sheet_id, folder, top, debug):
    '"main()" drives process from image download through report generation'

    # download img file & info from Drive
    rsp = drive_get_img(fname)
    if not rsp:
        return
    fname, mtype, ftime, data = rsp
    if debug:
        print('Downloaded %r (%s, %s, size: %d)' % (fname, mtype, ftime, len(data)))

    # upload file to GCS
    gcsname = '%s/%s'% (folder, fname)
    rsp = gcs_blob_upload(gcsname, bucket, data, mtype)
    if not rsp:
        return
    if debug:
        print('Uploaded %r to GCS bucket %r' % (rsp['name'], rsp['bucket']))

    # process w/Vision
    rsp = vision_label_img(base64.b64encode(data).decode('utf-8'), top)
    if not rsp:
        return
    if debug:
        print('Top %d labels from Vision API: %s' % (top, rsp))

    # push results to Sheet, get cells-saved count
    fsize = k_ize(len(data))
    row = [folder,
            '=HYPERLINK("storage.cloud.google.com/%s/%s", "%s")' % (
            bucket, gcsname, fname), mtype, ftime, fsize, rsp
    ]
    rsp = sheet_append_row(sheet_id, row)
    if not rsp:
        return
    if debug:
        print('Added %d cells to Google Sheet' % rsp)
    return True


if __name__ == '__main__':
    # args: [-hv] [-i imgfile] [-b bucket] [-f folder] [-s Sheet ID] [-t top labels]
    parser = argparse.ArgumentParser()
    parser.add_argument("-i", "--imgfile", action="store_true",
            default=FILE, help="image file filename")
    parser.add_argument("-b", "--bucket_id", action="store_true",
            default=BUCKET, help="Google Cloud Storage bucket name")
    parser.add_argument("-f", "--folder", action="store_true",
            default=PARENT, help="Google Cloud Storage image folder")
    parser.add_argument("-s", "--sheet_id", action="store_true",
            default=SHEET, help="Google Sheet Drive file ID (44-char str)")
    parser.add_argument("-t", "--viz_top", action="store_true",
            default=TOP, help="return top N (default %d) Vision API labels" % TOP)
    parser.add_argument("-v", "--verbose", action="store_true",
            default=DEBUG, help="verbose display output")
    args = parser.parse_args()

    print('Processing file %r... please wait' % args.imgfile)
    rsp = main(args.imgfile, args.bucket_id,
            args.sheet_id, args.folder, args.viz_top, args.verbose)
    if rsp:
        sheet_url = 'https://docs.google.com/spreadsheets/d/%s/edit' % args.sheet_id
        print('DONE: opening web browser to it, or see %s' % sheet_url)
        webbrowser.open(sheet_url, new=1, autoraise=True)
    else:
        print('ERROR: could not process %r' % args.imgfile)

Bu eğiticinin içeriğini güncel tutmak için elimizden geleni yapacağız ancak depoda kodun en son sürümü bulunacaktır.

13. Tebrikler!

Bu codelab'de çok fazla şey öğrendiğiniz için bunu başardınız ve uzun codelab'lerden birinde kaldınız. Sonuç olarak yaklaşık 130 satır Python ile olası bir kurumsal senaryonun üstesinden geldiniz. Google Cloud ve Google Workspace'in tamamından yararlanarak bunlar arasında verileri taşıyıp işe yarayan bir çözüm geliştirdiniz. Bu uygulamanın tüm sürümleri için açık kaynak kod deposunu keşfedebilirsiniz (daha fazla bilgiyi aşağıda bulabilirsiniz).

Temizleme

  1. Google Cloud API'lerinin kullanımı ücretsiz değildir. Google Workspace API'lerinin kullanımı aylık Google Workspace abonelik ücretinizin kapsamındadır (tüketici Gmail kullanıcılarının aylık ücreti sıfırdır). Bu nedenle, Google Workspace kullanıcıları için API'lerin temizlenmesi veya devre dışı bırakılması gerekmez. Google Cloud için Cloud Console kontrol panelinize gidip Faturalandırma "kartını" kontrol edebilirsiniz (tahmini ücretler için)
  2. Cloud Vision için ayda sabit sayıda API çağrısına ücretsiz olarak izin verilir. Bu sınırların altında kaldığınız sürece herhangi bir şeyi kapatmaya ya da projenizi devre dışı bırakmanıza/silmenize gerek yoktur. Vision API'nin faturalandırma ve ücretsiz kotası hakkında daha fazla bilgiyi fiyatlandırma sayfasında bulabilirsiniz.
  3. Bazı Cloud Storage kullanıcıları, her ay ücretsiz olarak depolama alanı alır. Bu codelab'i kullanarak arşivlediğiniz görüntüler kotayı aşmanıza neden olmazsa sizden herhangi bir ücret alınmaz. GCS faturalandırması ve ücretsiz kota hakkında daha fazla bilgiyi fiyatlandırma sayfasında bulabilirsiniz. Blobları Cloud Storage tarayıcısından görüntüleyebilir ve kolayca silebilirsiniz.
  4. Google Drive kullanımınızda da bir depolama alanı kotası vardır. Bu kotayı aşarsanız (veya kotaya yakınsanız), Drive'da daha fazla alan elde etmek üzere bu resimleri Cloud Storage'da arşivlemek için bu codelab'de oluşturduğunuz aracı kullanmayı düşünebilirsiniz. Google Drive depolama alanı hakkında daha fazla bilgiyi, Google Workspace Basic kullanıcıları veya Gmail/tüketici kullanıcıları için uygun fiyatlandırma sayfasında bulabilirsiniz.

Google Workspace Business ve Enterprise planlarının çoğunda sınırsız depolama alanı olsa da bu durum Drive klasörlerinizin karmaşık ve/veya yorucu olmasına neden olabilir. Bu eğitimde oluşturduğunuz uygulama, gereksiz dosyaları arşivlemek ve Google Drive'ınızı temizlemek için mükemmel bir yöntemdir.

Alternatif sürümler

final/analyze_gsimg.py "sonuncu" olsa da resmi sürümünü kullanmayı tercih ederseniz bu hikayenin sonu değildir. Uygulamanın son sürümüyle ilgili sorunlardan biri, kullanımdan kaldırılan eski kimlik doğrulama kitaplıklarının kullanılmasıdır. Bu yolu seçmemizin nedeni, bu yazının yazıldığı sırada yeni kimlik doğrulama kitaplıklarının OAuth jetonu depolama yönetimi ve iş parçacığı güvenliği gibi bazı temel unsurları desteklememesidir.

Mevcut (daha yeni) kimlik doğrulama kitaplıkları

Ancak bir noktada eski kimlik doğrulama kitaplıkları artık desteklenmeyecektir. Bu nedenle, iş parçacığı güvenli olmasalar bile deponun alt klasöründe daha yeni (mevcut) kimlik doğrulama kitaplıklarını kullanan sürümleri incelemenizi öneririz (ancak kendi çözümünüzü oluşturabilirsiniz). Adlarında *newauth* bulunan dosyaları arayın.

Google Cloud ürün istemci kitaplıkları

Google Cloud, tüm geliştiricilerin Google Cloud API'lerini kullanırken ürün istemci kitaplıklarını kullanmasını önerir. Maalesef Google Cloud API olmayan API'lerin şu anda böyle bir kitaplığı yoktur. Alt düzey kitaplıkların kullanılması, tutarlı API kullanımına olanak tanır ve daha iyi okunabilirlik özellikleri sunar. Yukarıdaki öneriye benzer şekilde, Google Cloud ürün istemci kitaplıklarının kullanıldığı alternatif sürümleri deponun alt klasöründe bulabilirsiniz. Adlarında *-gcp* bulunan dosyaları arayın.

Hizmet hesabını yetkilendirme

Yalnızca bulutta çalışırken genellikle insan veya (insan) kullanıcıya ait veri bulunmaz. Bu nedenle, hizmet hesapları ve hizmet hesabı yetkilendirmesi öncelikli olarak Google Cloud'da kullanılır. Ancak, Google Workspace dokümanları genellikle (insan) kullanıcılara aittir. Bu nedenle, bu eğitimde kullanıcı hesabı yetkilendirmesi kullanılmaktadır. Bu durum, Google Workspace API'lerini hizmet hesaplarıyla kullanmanın mümkün olmadığı anlamına gelmez. Bu hesaplar uygun erişim düzeyine sahip olduğu sürece kesinlikle uygulamalarda kullanılabilir. Yukarıdakine benzer şekilde, hizmet hesabı yetkilendirmesini kullanan alternatif sürümler, incelemeniz için deponun alt klasöründe bulunmaktadır. Adlarında *-svc* bulunan dosyaları arayın.

Alternatif sürüm kataloğu

Aşağıda, her biri yukarıdaki özelliklerden en az birine sahip olan tüm alternatif final/analyze_gsimg.py sürümlerini bulabilirsiniz. Her sürümün dosya adında şunları arayın:

  • "oldauth" eski kimlik doğrulama kitaplıklarını (final/analyze_gsimg.py ek olarak) kullanan sürümler için
  • "newauth" mevcut/yeni kimlik doğrulama kitaplıklarını kullananlar için
  • "gcp" google-cloud-storage gibi Google Cloud ürün istemci kitaplıkları
  • "svc" Kullanıcı hesabı yerine hizmet hesabı ("svc acct") kimlik doğrulaması kullananlar için

Tüm sürümler şunlardır:

Dosya adı

Açıklama

final/analyze_gsimg.py

Birincil örneklem: eski kimlik doğrulama kitaplıklarını kullanır

alt/analyze_gsimg-newauth.py

final/analyze_gsimg.py ile aynı ancak daha yeni kimlik doğrulama kitaplıklarını kullanır

alt/analyze_gsimg-oldauth-gcp.py

final/analyze_gsimg.py ile aynı olsa da Google Cloud ürününün istemci kitaplıklarını kullanır

alt/analyze_gsimg-newauth-gcp.py

alt/analyze_gsimg-newauth.py ile aynı olsa da Google Cloud ürününün istemci kitaplıklarını kullanır

alt/analyze_gsimg-oldauth-svc.py

final/analyze_gsimg.py ile aynı ancak kullanıcı hesabı yerine svc hesabı kullanıyor

alt/analyze_gsimg-newauth-svc.py

alt/analyze_gsimg-newauth.py ile aynı ancak kullanıcı hesabı yerine svc hesap kimlik doğrulamasını kullanır

alt/analyze_gsimg-oldauth-svc-gcp.py

alt/analyze_gsimg-oldauth-svc.py ile aynı ancak Google Cloud ürün istemci kitaplıklarını kullanır ve alt/analyze_gsimg-oldauth-gcp.py ile aynıdır ancak kullanıcı hesabı yerine svc hesap kimlik doğrulamasını kullanır

alt/analyze_gsimg-newauth-svc-gcp.py

alt/analyze_gsimg-oldauth-svc-gcp.py ile aynı ancak daha yeni kimlik doğrulama kitaplıklarını kullanır

Orijinal final/analyze_gsimg.py ile birlikte, Google API geliştirme ortamınızdan bağımsız olarak nihai çözümün tüm olası kombinasyonlarına sahip olursunuz ve ihtiyaçlarınıza en uygun olanı seçebilirsiniz. Benzer bir açıklama için alt/README.md sayfasına da bakabilirsiniz.

Ek Çalışma

Aşağıda, bu alıştırmayı bir veya iki adım ileriye nasıl taşıyacağınıza dair birkaç fikir verilmiştir. Mevcut çözümün ele alabileceği problem grubu genişletilebilir ve böylece şu geliştirmeleri yapabilirsiniz:

  1. (klasörlerde birden fazla resim) Tek bir resmi işlemek yerine Google Drive klasörlerinde resimleriniz olduğunu varsayalım.
  2. (ZIP dosyalarında birden çok resim) Bir resim klasörü yerine, resim dosyası içeren ZIP arşivlerini nasıl kullanabilirsiniz? Python kullanıyorsanız zipfile modülünü kullanabilirsiniz.
  3. (Vizyon etiketlerini analiz edin) Benzer görüntüleri birlikte kümeleyebilirsiniz. Bunun için öncelikle en yaygın etiketleri, ardından ikinci en yaygın etiketleri ve benzeri öğeleri bulmaya çalışın.
  4. (grafik oluşturun) 3. takip numarası, Vision API analizine ve sınıflandırmaya göre Sheets API ile grafik oluşturma
  5. (belgeleri kategorize etme) Görüntüleri Cloud Vision API ile analiz etmek yerine, Cloud Natural Language API ile kategorize edebileceğiniz PDF dosyalarınız olduğunu varsayalım. Yukarıda sağladığınız çözümleri kullanarak bu PDF'ler, Drive klasörlerinde veya Drive'daki ZIP arşivlerinde bulunabilir.
  6. (sunu oluşturma) Google E-Tablolar raporunun içeriğinden bir slayt kümesi oluşturmak için Slaytlar API'sini kullanın. İlham almak için bu blog yayınına ve başlıklı videomuzu izleyin.
  7. (PDF olarak dışa aktarın) E-tabloyu ve/veya slayt kümesini PDF olarak dışa aktarın. Ancak bu, E-Tablolar veya Slaytlar API'lerinin bir özelliği değildir. İpucu: Google Drive API. Ekstra kredi: Hem E-Tablolar hem de Slaytlar PDF'lerini Ghostscript (Linux, Windows) veya Combine PDF Pages.action (Mac OS X) gibi araçlarla tek bir ana PDF dosyasında birleştirin.

Daha Fazla Bilgi

Codelab uygulamaları

Genel

Google Workspace

Google Cloud

Lisans

Bu çalışma, Creative Commons Attribution 2.0 Genel Amaçlı Lisans ile lisans altına alınmıştır.