Vertex AI Vision Sıra Algılama Uygulaması

1. Hedefler

Genel Bakış

Bu codelab'de, perakende satış video çekimlerini kullanarak sıra boyutunu izlemek için uçtan uca Vertex AI Vision uygulaması oluşturmaya odaklanacağız. Aşağıdakileri yakalamak için önceden eğitilmiş Özel model Doluluk analizi yerleşik özelliklerini kullanırız:

  • Sırada bekleyen kişileri sayın.
  • Kasada sipariş verilecek kişilerin sayısını sayın.

Neler öğreneceksiniz?

  • Vertex AI Vision'da uygulama oluşturma ve dağıtma
  • Video dosyası kullanarak RTSP akışı oluşturma ve Jupyter Notebook'tan vaictl kullanarak akışı Vertex AI Vision'a aktarma
  • Doluluk Analizi modelini ve farklı özelliklerini kullanma
  • Vertex AI Vision'ın Media Warehouse'ta depolama alanınızda video arama
  • Çıkışı BigQuery'ye bağlama, modelin json çıkışından analizler çıkarmak için SQL sorgusu yazma ve orijinal videoyu etiketleyip açıklama eklemek için bu çıkışı kullanma.

Maliyet:

Bu laboratuvarı Google Cloud'da çalıştırmanın toplam maliyeti yaklaşık 2 ABD dolarıdır.

2. Başlamadan Önce

Proje oluşturun ve API'leri etkinleştirin:

  1. Google Cloud konsolunun proje seçici sayfasında bir Google Cloud projesi seçin veya oluşturun. Not: Bu prosedürde oluşturduğunuz kaynakları tutmayı düşünmüyorsanız mevcut bir projeyi seçmek yerine bir proje oluşturun. Bu adımları tamamladıktan sonra projeyi silerek projeyle ilişkili tüm kaynakları kaldırabilirsiniz. Proje seçiciye git
  2. Cloud projeniz için faturalandırmanın etkinleştirildiğinden emin olun. Bir projede faturalandırmanın etkin olup olmadığını nasıl kontrol edeceğinizi öğrenin.
  3. Compute Engine, Vertex API, Notebook API ve Vision AI API'yi etkinleştirin. API'leri etkinleştirme

Bir hizmet hesabı oluşturun:

  1. Google Cloud Console'da Hizmet hesabı oluştur sayfasına gidin. Hizmet hesabı oluştur'a gidin
  2. Projenizi seçin.
  3. Hizmet hesabı adı alanına bir ad girin. Google Cloud Console, Hizmet hesabı kimliği alanını bu ada göre doldurur. Hizmet hesabı açıklaması alanına bir açıklama girin. Örneğin, hızlı başlangıç için hizmet hesabı.
  4. Oluştur ve devam et'i tıklayın.
  5. Projenize erişim sağlamak için hizmet hesabınıza aşağıdaki rolleri verin:
  • Vision AI > Vision AI Düzenleyici
  • Compute Engine > Compute Örnek Yöneticisi (beta)
  • BigQuery > BigQuery Yöneticisi .

Rol seçin listesinden bir rol seçin. Ek roller için Başka bir rol ekle'yi tıklayın ve her bir rolü ekleyin.

  1. Devam'ı tıklayın.
  2. Hizmet hesabını oluşturmayı tamamlamak için Bitti'yi tıklayın. Tarayıcı pencerenizi kapatmayın. Sonraki adımda bu adı kullanacaksınız.

3. Jupyter Notebook'u kurma

Occupancy Analytics'te Uygulama oluşturmadan önce, daha sonra Uygulama tarafından kullanılabilecek bir akış kaydetmeniz gerekir.

Bu eğiticide, video barındıran bir Jupyter Notebook örneği oluşturur ve bu video akışı verilerini not defterinden gönderirsiniz. Kabuk komutlarını yürütme ve özel ön/son işleme kodunu tek bir yerde çalıştırma esnekliği sunduğu için jupyter not defteri kullanıyoruz. Bu da hızlı denemeler yapmak için çok uygun. Bu not defterini şu amaçlarla kullanacağız:

  1. rtsp sunucusunu arka plan işlemi olarak çalıştır
  2. vaictl komutunu arka plan işlemi olarak çalıştır
  3. Doluluk analizi çıkışını analiz etmek için sorgu ve işleme kodu çalıştırma

Jupyter not defteri oluşturma

Jupyter Notebook örneğinden video göndermenin ilk adımı, önceki adımda oluşturulan hizmet hesabımızı kullanarak not defterini oluşturmaktır.

  1. Konsolda Vertex AI sayfasına gidin. Vertex AI Workbench'e gidin
  2. Kullanıcı tarafından yönetilen not defterleri'ni tıklayın

65b7112822858dce.png

  1. Yeni Not Defteri > Tensorflow Enterprise 2.6 (LTS ile) > GPU olmadan

dc156f20b14651d7.png

  1. Jupyter not defterinin adını girin. Daha fazla bilgi için Kaynak adlandırma kuralı başlıklı makaleyi inceleyin.

b4dbc5fddc37e8d9.png

  1. GELİŞMİŞ SEÇENEKLER'i tıklayın
  2. Aşağı kaydırarak İzin Bölümleri'ne gidin
  3. Compute Engine varsayılan hizmet hesabını kullan seçeneğinin işaretini kaldırın.
  4. Önceki adımda oluşturulan hizmet hesabı e-postasını ekleyin. Ardından Oluştur'u tıklayın.

ec0b9ef00f0ef470.png

  1. Örnek oluşturulduktan sonra JUPYTERLAB'I AÇ'ı tıklayın.

4. Video yayını yapmak için Not Defteri kurma

Occupancy Analytics'te Uygulama oluşturmadan önce, daha sonra Uygulama tarafından kullanılabilecek bir akış kaydetmeniz gerekir.

Bu eğiticide video barındırmak için Jupyter Notebook örneğimizi kullanacağız ve siz de bu akışlı video verilerini Notebook terminalinden göndereceksiniz.

vaictl komut satırı aracını indirin

  1. Açılan Jupyterlab örneğinde, başlatıcıdan bir Not Defteri açın.

a6d182923ae4ada3.png

  1. Aşağıdaki komutu kullanarak not defteri hücresinde Vertex AI Vision (vaictl) komut satırı aracını, rtsp sunucu komut satırı aracını ve open-cv aracını indirin:
!wget -q https://github.com/aler9/rtsp-simple-server/releases/download/v0.20.4/rtsp-simple-server_v0.20.4_linux_amd64.tar.gz
!wget -q https://github.com/google/visionai/releases/download/v0.0.4/visionai_0.0-4_amd64.deb
!tar -xf rtsp-simple-server_v0.20.4_linux_amd64.tar.gz
!pip install opencv-python --quiet
!sudo apt-get -qq remove -y visionai
!sudo apt-get -qq install -y ./visionai_0.0-4_amd64.deb
!sudo apt-get -qq install -y ffmpeg

5. Video dosyasını akış için alma

Not defteri ortamınızı gerekli komut satırı araçlarıyla ayarladıktan sonra, örnek bir video dosyasını kopyalayabilir ve video verilerini doluluk analizi uygulamanıza aktarmak için vaictl'i kullanabilirsiniz.

Yeni yayın kaydetme

  1. Vertex AI Vision'ın sol panelindeki yayınlar sekmesini tıklayın.
  2. Üst kısımdaki Kaydol düğmesini tıklayın eba418e723916514.png
  3. Akış adına "sıralı yayın" yazın
  4. Bölgede, önceki adımda not defteri oluşturma işlemi sırasında seçilen aynı bölgeyi seçin.
  5. Kaydol'u tıklayın.

Örnek videoyu sanal makinenize kopyalama

  1. Not defterinizde aşağıdaki wget komutunu kullanarak örnek bir video kopyalayın.
!wget -q https://github.com/vagrantism/interesting-datasets/raw/main/video/collective_activity/seq25_h264.mp4

Sanal makineden video akışı gerçekleştirip verileri akışınıza aktarma

  1. Bu yerel video dosyasını uygulama giriş akışına göndermek için not defteri hücrenizde aşağıdaki komutu kullanın. Aşağıdaki değişken değişikliklerini yapmanız gerekir:
  • PROJECT_ID: Google Cloud projenizin kimliği.
  • LOCATION: Yer kimliğiniz. Örneğin, us-central1. Daha fazla bilgi için Bulut konumları başlıklı makaleyi inceleyin.
  • LOCAL_FILE: Yerel bir video dosyasının dosya adı. Örneğin, seq25_h264.mp4.
PROJECT_ID='<Your Google Cloud project ID>'
LOCATION='<Your stream location>'
LOCAL_FILE='seq25_h264.mp4'
STREAM_NAME='queue-stream'
  1. Video dosyasını rtsp protokolüyle akış olarak aktaracağımız bir rtsp-simple-server başlatın.
import os
import time
import subprocess

subprocess.Popen(["nohup", "./rtsp-simple-server"], stdout=open('rtsp_out.log', 'a'), stderr=open('rtsp_err.log', 'a'), preexec_fn=os.setpgrp)
time.sleep(5)
  1. Videoyu rtsp akışında döngüye almak için ffmpeg komut satırı aracını kullanma
subprocess.Popen(["nohup", "ffmpeg", "-re", "-stream_loop", "-1", "-i", LOCAL_FILE, "-c", "copy", "-f", "rtsp", f"rtsp://localhost:8554/{LOCAL_FILE.split('.')[0]}"], stdout=open('ffmpeg_out.log', 'a'), stderr=open('ffmpeg_err.log', 'a'), preexec_fn=os.setpgrp)
time.sleep(5)
  1. Videoyu rtsp sunucu URI'sinden Vertex AI Vision akışımıza "queue-stream" aktarmak için vaictl komut satırı aracını kullanın son adımda oluşturulur.
subprocess.Popen(["nohup", "vaictl", "-p", PROJECT_ID, "-l", LOCATION, "-c", "application-cluster-0", "--service-endpoint", "visionai.googleapis.com", "send", "rtsp", "to", "streams", "queue-stream", "--rtsp-uri", f"rtsp://localhost:8554/{LOCAL_FILE.split('.')[0]}"], stdout=open('vaictl_out.log', 'a'), stderr=open('vaictl_err.log', 'a'), preexec_fn=os.setpgrp)

Valictl besleme işleminin başlatılması ve videonun kontrol panelinde gösterilmesi yaklaşık 100 saniye sürebilir.

Yayın besleme kullanılabilir hale geldikten sonra Vertex AI Vision kontrol panelinin Akışlar sekmesinde sıra akışı akışını seçerek video feed'ini görebilirsiniz.

Akışlar sekmesine gidin

1b7aac7d36552f29.png

6. Uygulama oluşturma

İlk adım, verilerinizi işleyen bir uygulama oluşturmaktır. Uygulama, aşağıdakileri birbirine bağlayan otomatik bir ardışık düzen olarak düşünülebilir:

  • Veri besleme: Video feed'i bir akışa beslenir.
  • Veri analizi: Beslemeden sonra yapay zeka(Bilgisayar Görüşü) modeli eklenebilir.
  • Veri depolama: Video feed'inin iki sürümü (orijinal akış ve yapay zeka modeli tarafından işlenen akış), medya ambarında depolanabilir.

Google Cloud konsolunda uygulamalar bir grafik olarak gösterilir.

Boş uygulama oluşturma

Uygulama grafiğini doldurmadan önce boş bir uygulama oluşturmanız gerekir.

Google Cloud Console'da uygulama oluşturun.

  1. Google Cloud konsoluna gidin.
  2. Vertex AI Vision kontrol panelinin Uygulamalar sekmesini açın. Uygulamalar sekmesine gidin
  3. Oluştur düğmesini tıklayın. 21ecba7a23e9979e.png
  4. Uygulama adı olarak "queue-app" yazın ve bölgenizi seçin.
  5. Oluştur'u tıklayın.

Uygulama bileşeni düğümleri ekleme

Boş uygulamayı oluşturduktan sonra üç düğümü uygulama grafiğine ekleyebilirsiniz:

  1. Besleme düğümü: Not defterinde oluşturduğunuz bir rtsp video sunucusundan gönderilen verileri alan akış kaynağı.
  2. İşleme düğümü: Beslenen veriler üzerinde işlem yapan doluluk analizi modeli.
  3. Depolama düğümü: İşlenen videoları depolayan ve meta veri deposu olarak hizmet veren medya ambarı. Meta veri depoları, beslenen video verileriyle ilgili analiz bilgilerini ve yapay zeka modellerinden elde edilen çıkarımları içerir.

Konsolda uygulamanıza bileşen düğümleri ekleyin.

  1. Vertex AI Vision kontrol panelinin Uygulamalar sekmesini açın. Uygulamalar sekmesine gidin

Bu işlem, sizi işleme ardışık düzeninin grafik görselleştirmesine yönlendirir.

Veri kullanımı düğümü ekleme

  1. Bir giriş akışı düğümü eklemek için yan menünün Bağlayıcılar bölümündeki Akışlar'ı seçin.
  2. Açılan Akış menüsünün Kaynak bölümünde Akış ekle'yi seçin.
  3. Akış ekle menüsünde sıra akışı'nı seçin.
  4. Akışı uygulama grafiğine eklemek için Akış ekle'yi tıklayın.

Veri işleme düğümü ekleme

  1. Doluluk sayısı modeli düğümünü eklemek için yan menünün Özel modeller bölümünde doluluk analizi seçeneğini belirleyin.
  2. Varsayılan Kişiler seçimlerini değiştirmeyin. Zaten seçiliyse Araçlar seçeneğinin işaretini kaldırın.

618b0c9dc671bae3.png

  1. Advanced Options (Gelişmiş Seçenekler) bölümünde Create Active Zones/Lines 5b2f31235603e05d.png (Etkin Bölge/Satır Oluştur) seçeneğini tıklayın.
  2. Bölgedeki kişileri saymak için Poligon aracını kullanarak etkin bölgeleri çizin. Alt bölgeyi uygun şekilde etiketleyin.

50281a723650491f.png

  1. Üstteki Geri Oku tıklayın.

2bf0ff4d029d29eb.png

  1. Tıkanıklığı tespit etmek üzere Onay Kutusu'nu tıklayarak bekleme süresi ayarlarını ekleyin.

c067fa256ca5bb96.png

Veri depolama düğümü ekleme

  1. Çıkış hedefi (depolama alanı) düğümünü eklemek için yan menünün Bağlayıcılar bölümünde VIsion AI Warehouse seçeneğini belirleyin.
  2. Menüyü açmak için Vertex AI Warehouse Connector'ı (Vertex AI Warehouse) Bağlayıcı'yı ve ardından Connect Atölyesi'ni tıklayın.
  3. Depo bağla menüsünde Yeni depo oluştur'u seçin. Depoya sıra depolama alanı adını verin ve TTL süresini 14 gün olarak bırakın.
  4. Depoyu eklemek için Oluştur düğmesini tıklayın.

7. Çıkışı BigQuery Tablosuna Bağlama

Vertex AI Vision uygulamanıza bir BigQuery bağlayıcısı eklediğinizde, tüm bağlı uygulama modeli çıkışları hedef tabloya aktarılır.

Kendi BigQuery tablonuzu oluşturup uygulamaya bir BigQuery bağlayıcısı eklediğinizde bu tabloyu belirtebilirsiniz veya Vertex AI Vision uygulama platformunun tabloyu otomatik olarak oluşturmasına izin verebilirsiniz.

Otomatik tablo oluşturma

Vertex AI Vision uygulama platformunun tabloyu otomatik olarak oluşturmasına izin verirseniz BigQuery bağlayıcı düğümünü eklerken bu seçeneği belirtebilirsiniz.

Otomatik tablo oluşturma özelliğini kullanmak istiyorsanız aşağıdaki veri kümesi ve tablo koşulları geçerlidir:

  • Veri kümesi: Otomatik olarak oluşturulan veri kümesi adı visionai_dataset şeklindedir.
  • Tablo: Otomatik olarak oluşturulan tablo adı visionai_dataset.APPLICATION_ID şeklindedir.
  • Hata işleme:
  • Aynı veri kümesi altında aynı ada sahip bir tablo varsa otomatik oluşturma işlemi gerçekleşmez.
  1. Vertex AI Vision kontrol panelinin Uygulamalar sekmesini açın. Uygulamalar sekmesine gidin
  2. Listede uygulamanızın adının yanında bulunan Uygulamayı görüntüle'yi seçin.
  3. Uygulama oluşturucu sayfasında Bağlayıcılar bölümünden BigQuery'yi seçin.
  4. BigQuery yolu alanını boş bırakın.

ee0b67d4ab2263d.png

  1. Mağaza meta verileri kaynağı: bölümünde yalnızca "doluluk analizi"ni seçin ve akışların işaretini kaldırın.

Uygulama grafiğinin son hali aşağıdaki gibi görünmelidir:

da0a1a049843572f.png

8. Uygulamanızı kullanıma sunma

Uçtan uca uygulamanızı gerekli tüm bileşenlerle derledikten sonra, uygulamayı kullanmanın son adımı uygulamayı dağıtmaktır.

  1. Vertex AI Vision kontrol panelinin Uygulamalar sekmesini açın. Uygulamalar sekmesine gidin
  2. Listede sıradaki uygulama uygulamasının yanında bulunan Uygulamayı görüntüle'yi seçin.
  3. Studio sayfasında Dağıt düğmesini tıklayın.
  4. Aşağıdaki onay iletişim kutusunda Dağıt'ı tıklayın. Dağıtma işleminin tamamlanması birkaç dakika sürebilir. Dağıtım tamamlandıktan sonra, düğümlerin yanında yeşil onay işaretleri görünür. dc514d9b9f35099d.png.

9. Depolama deposunda video içeriği arayın

Video verilerini işleme uygulamanıza besledikten sonra analiz edilen video verilerini görüntüleyebilir ve doluluk analizi bilgilerine göre verilerde arama yapabilirsiniz.

  1. Vertex AI Vision kontrol panelinin Warehouses sekmesini açın. Atölyeler sekmesine git
  2. Listede sıra deposu deposunu bulun ve Öğeleri görüntüle'yi tıklayın.
  3. Kişi sayısı bölümünde, Min. değerini 1 ve Maks. değerini 5 olarak ayarlayın.
  4. Vertex AI Vision'ın Media Warehouse'ta depolanan işlenmiş video verilerini filtrelemek için Search'ü (Ara) tıklayın.

a0e5766262443d6c.png

Google Cloud Console'daki arama ölçütleriyle eşleşen depolanan video verilerinin görünümü.

10. BigQuery tablosunu kullanarak çıkışa not ekleme ve bunları analiz etme

  1. Not Defteri'nde, hücredeki aşağıdaki değişkenleri başlatın.
DATASET_ID='vision_ai_dataset'
bq_table=f'{PROJECT_ID}.{DATASET_ID}.queue-app'
frame_buffer_size=10000
frame_buffer_error_milliseconds=5
dashboard_update_delay_seconds=3
rtsp_url='rtsp://localhost:8554/seq25_h264'
  1. Şimdi, aşağıdaki kodu kullanarak rtsp akışındaki kareleri yakalayacağız:
import cv2
import threading
from collections import OrderedDict
from datetime import datetime, timezone

frame_buffer = OrderedDict()
frame_buffer_lock = threading.Lock()

stream = cv2.VideoCapture(rtsp_url)
def read_frames(stream):
  global frames
  while True:
    ret, frame = stream.read()
    frame_ts = datetime.now(timezone.utc).timestamp() * 1000
    if ret:
      with frame_buffer_lock:
        while len(frame_buffer) >= frame_buffer_size:
          _ = frame_buffer.popitem(last=False)
        frame_buffer[frame_ts] = frame

frame_buffer_thread = threading.Thread(target=read_frames, args=(stream,))
frame_buffer_thread.start()
print('Waiting for stream initialization')
while not list(frame_buffer.keys()): pass
print('Stream Initialized')
  1. BigQuery tablosundan veri zaman damgası ile ek açıklama bilgilerini alın ve yakalanan kare görüntülerini depolamak için bir dizin oluşturun:
from google.cloud import bigquery
import pandas as pd

client = bigquery.Client(project=PROJECT_ID)

query = f"""
SELECT MAX(ingestion_time) AS ts
FROM `{bq_table}`
"""

bq_max_ingest_ts_df = client.query(query).to_dataframe()
bq_max_ingest_epoch = str(int(bq_max_ingest_ts_df['ts'][0].timestamp()*1000000))
bq_max_ingest_ts = bq_max_ingest_ts_df['ts'][0]
print('Preparing to pull records with ingestion time >', bq_max_ingest_ts)
if not os.path.exists(bq_max_ingest_epoch):
   os.makedirs(bq_max_ingest_epoch)
print('Saving output frames to', bq_max_ingest_epoch)
  1. Aşağıdaki kodu kullanarak çerçevelere ek açıklama ekleyin:
import json
import base64
import numpy as np
from IPython.display import Image, display, HTML, clear_output

im_width = stream.get(cv2.CAP_PROP_FRAME_WIDTH)
im_height = stream.get(cv2.CAP_PROP_FRAME_HEIGHT)

dashdelta = datetime.now()
framedata = {}
cntext = lambda x: {y['entity']['labelString']: y['count'] for y in x}
try:
  while True:
    try:
        annotations_df = client.query(f'''
          SELECT ingestion_time, annotation
          FROM `{bq_table}`
          WHERE ingestion_time > TIMESTAMP("{bq_max_ingest_ts}")
         ''').to_dataframe()
    except ValueError as e: 
        continue
    bq_max_ingest_ts = annotations_df['ingestion_time'].max()
    for _, row in annotations_df.iterrows():
      with frame_buffer_lock:
        frame_ts = np.asarray(list(frame_buffer.keys()))
        delta_ts = np.abs(frame_ts - (row['ingestion_time'].timestamp() * 1000))
        delta_tx_idx = delta_ts.argmin()
        closest_ts_delta = delta_ts[delta_tx_idx]
        closest_ts = frame_ts[delta_tx_idx]
        if closest_ts_delta > frame_buffer_error_milliseconds: continue
        image = frame_buffer[closest_ts]
      annotations = json.loads(row['annotation'])
      for box in annotations['identifiedBoxes']:
        image = cv2.rectangle(
          image,
          (
            int(box['normalizedBoundingBox']['xmin']*im_width),
            int(box['normalizedBoundingBox']['ymin']*im_height)
          ),
          (
            int((box['normalizedBoundingBox']['xmin'] + box['normalizedBoundingBox']['width'])*im_width),
            int((box['normalizedBoundingBox']['ymin'] + box['normalizedBoundingBox']['height'])*im_height)
          ),
          (255, 0, 0), 2
        )
      img_filename = f"{bq_max_ingest_epoch}/{row['ingestion_time'].timestamp() * 1000}.png"
      cv2.imwrite(img_filename, image)
      binimg = base64.b64encode(cv2.imencode('.jpg', image)[1]).decode()
      curr_framedata = {
        'path': img_filename,
        'timestamp_error': closest_ts_delta,
        'counts': {
          **{
            k['annotation']['displayName'] : cntext(k['counts'])
            for k in annotations['stats']["activeZoneCounts"]
          },
          'full-frame': cntext(annotations['stats']["fullFrameCount"])
        }
      }
      framedata[img_filename] = curr_framedata
      if (datetime.now() - dashdelta).total_seconds() > dashboard_update_delay_seconds:
        dashdelta = datetime.now()
        clear_output()
        display(HTML(f'''
          <h1>Queue Monitoring Application</h1>
          <p>Live Feed of the queue camera:</p>
          <p><img alt="" src="{img_filename}" style="float: left;"/></a></p>
          <table border="1" cellpadding="1" cellspacing="1" style="width: 500px;">
            <caption>Current Model Outputs</caption>
            <thead>
              <tr><th scope="row">Metric</th><th scope="col">Value</th></tr>
            </thead>
            <tbody>
              <tr><th scope="row">Serving Area People Count</th><td>{curr_framedata['counts']['serving-zone']['Person']}</td></tr>
              <tr><th scope="row">Queueing Area People Count</th><td>{curr_framedata['counts']['queue-zone']['Person']}</td></tr>
              <tr><th scope="row">Total Area People Count</th><td>{curr_framedata['counts']['full-frame']['Person']}</td></tr>
              <tr><th scope="row">Timestamp Error</th><td>{curr_framedata['timestamp_error']}</td></tr>
            </tbody>
          </table>
          <p>&nbsp;</p>
        '''))
except KeyboardInterrupt:
  print('Stopping Live Monitoring')

9426ffe2376f0a7d.png

  1. Not defteri menü çubuğundaki Durdur düğmesini kullanarak ek açıklama görevini durdurma

6c19cb00dcb28894.png

  1. Aşağıdaki kodu kullanarak kareleri tek tek yeniden ziyaret edebilirsiniz:
from IPython.html.widgets import Layout, interact, IntSlider
imgs = sorted(list(framedata.keys()))
def loadimg(frame):
    display(framedata[imgs[frame]])
    display(Image(open(framedata[imgs[frame]]['path'],'rb').read()))
interact(loadimg, frame=IntSlider(
    description='Frame #:',
    value=0,
    min=0, max=len(imgs)-1, step=1,
    layout=Layout(width='100%')))

78b63b546a4c883b.png

11. Tebrikler

Tebrikler, laboratuvarı tamamladınız.

Temizleme

Bu eğiticide kullanılan kaynaklar için Google Cloud hesabınızın ücretlendirilmesini istemiyorsanız kaynakları içeren projeyi silin veya projeyi tutup tek tek kaynakları silin.

Projeyi silme

Kaynakları tek tek silme

Kaynaklar

https://cloud.google.com/vision-ai/docs/overview

https://cloud.google.com/vision-ai/docs/occupancy-count-tutorial

Lisans

Anket

Bu eğiticiyi nasıl kullandınız?

Yalnızca okuma Okudu ve alıştırmaları tamamladım

Bu codelab'i ne kadar faydalı buldunuz?

Çok faydalı Kısmen faydalı Yararlı değil

Bu codelab'i takip etmek ne kadar kolaydı?

Kolay Orta Zor