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:
- Google Drive (Google Workspace API'lerini kullanma) tanıtımı (Python)
- Cloud Vision'ı Python ile kullanma (Python)
- E-Tablolar API'si ile özelleştirilmiş raporlama araçları oluşturma (JS/Düğüm)
- Google Cloud Storage'a nesne yükleme (kodlama gerekmez)
Anket
Bu eğiticiden nasıl yararlanacaksınız?
Python deneyiminizi nasıl değerlendirirsiniz?
Google Cloud hizmetlerini kullanma deneyiminizi nasıl değerlendirirsiniz?
Google Workspace geliştirici hizmetlerini kullanma deneyiminizi nasıl değerlendirirsiniz?
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ı?
2. Kurulum ve Gereksinimler
Kendi hızınızda ortam kurulumu
- 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.
- 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.
- 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
- Cloud Console'da, Cloud Shell'i etkinleştir simgesini tıklayın.
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:
Temel hazırlık ve Cloud Shell'e bağlanmak yalnızca birkaç dakika sürer.
İ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.
- 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`
- 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:
Bu sayfaya ulaştığınızda tüm kimlik bilgilerinizi üç ayrı bölümde görürsünüz:
İ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.
Sonraki ekranda 2 işleminiz var: Uygulamanızın yetkilendirme "izin ekranı"nı yapılandırma ve uygulama türünü seçerek:
İ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.)
OAuth izin ekranı
"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"):
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:
Ş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:
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
- Yeni kimlik bilgilerinin yer aldığı bir iletişim kutusu görüntülenir; kapatmak için Tamam'ı tıklayın
- 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 bulup tıklayın.
- 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:
Aşağıdaki grafiklerin altında projeniz için etkinleştirilen Google API'lerinin listesi bulunmaktadır:
API'leri etkinleştirmek (veya devre dışı bırakmak) için en üstteki API'leri ve Hizmetleri Etkinleştir'i tıklayın:
Alternatif olarak, sol gezinme çubuğuna gidin ve API'ler ve Hizmetler → Kitaplık:
Her iki durumda da API Kitaplığı sayfasına ulaşırsınız:
Eşleşen sonuçları aramak ve görmek için bir API adı girin:
Etkinleştirmek istediğiniz API'yi seçin ve Etkinleştir düğmesini tıklayın:
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:
- Google Cloud: Her ürün farklı şekilde faturalandırılır ve genellikle kullanıma göre ücretlendirilir; yukarıdaki ücretsiz katman bilgilerini inceleyin.
- Google Haritalar — Bir API paketi içerir ve kullanıcılara toplam aylık 200 ABD doları değerinde ücretsiz kredi sunar.
- Google Workspace (eski adıyla G Suite) API'leri: Google Workspace aylık abonelik ücreti kapsamında (belirli sınırlara kadar) kullanım imkanı sunar. Bu sayede Gmail, Google Drive, Takvim, Dokümanlar, E-Tablolar veya Slaytlar gibi uygulamalarda API'lerin kullanımı için doğrudan faturalandırma yapılmaz.
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:
- API Kitaplığı'na geri dön
- Adının birkaç harfini yazarak arama başlatın
- İstediğiniz API'yi seçin ve
- 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:
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:
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:
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:
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:
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:
Ö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
- 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)
- 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.
- 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.
- 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 |
| Birincil örneklem: eski 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:
- (klasörlerde birden fazla resim) Tek bir resmi işlemek yerine Google Drive klasörlerinde resimleriniz olduğunu varsayalım.
- (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. - (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.
- (grafik oluşturun) 3. takip numarası, Vision API analizine ve sınıflandırmaya göre Sheets API ile grafik oluşturma
- (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.
- (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.
- (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ı
- Google Workspace API'lerine (Google Drive API) giriş (Python)
- Cloud Vision'ı Python ile kullanma (Python)
- Özelleştirilmiş raporlama araçları oluşturma (Google Sheets API) (JS/Düğüm)
- Google Cloud Storage'a nesne yükleme (kodlama gerekmez)
Genel
Google Workspace
- Google Drive API ana sayfası
- Google Sheets API ana sayfası
- Google Workspace geliştiricisine genel bakış ve belgeleri
Google Cloud
- Google Cloud Storage ana sayfası
- Google Cloud Vision ana sayfası ve canlı demo
- Cloud Vision API belgeleri
- Vision API görüntü etiketleme belgeleri
- Google Cloud'da Python
- Google Cloud ürün istemci kitaplıkları
- Google Cloud belgeleri
Lisans
Bu çalışma, Creative Commons Attribution 2.0 Genel Amaçlı Lisans ile lisans altına alınmıştır.