Utilizzo dell'API Vision con Python

1. Panoramica

5ab7829fc22b21c4.png

L'API Vision consente agli sviluppatori di integrare facilmente le funzionalità di rilevamento visivo nelle applicazioni, tra cui etichettatura delle immagini, rilevamento di volti e punti di riferimento, riconoscimento ottico dei caratteri (OCR) e tagging dei contenuti espliciti.

In questo tutorial, ti concentrerai sull'utilizzo dell'API Vision con Python.

Cosa imparerai a fare

  • Come configurare l'ambiente
  • Come eseguire il rilevamento etichette
  • Come eseguire il rilevamento del testo
  • Come eseguire il rilevamento dei punti di riferimento
  • Come eseguire il rilevamento dei volti
  • Come eseguire il rilevamento di oggetti

Che cosa ti serve

  • Un progetto Google Cloud
  • Un browser, ad esempio Chrome o Firefox
  • Dimestichezza nell'utilizzo di Python

Sondaggio

Come utilizzerai questo tutorial?

Solo lettura Leggilo e completa gli esercizi

Come valuteresti la tua esperienza con Python?

Principiante Livello intermedio Eccellente

Come giudichi la tua esperienza con i servizi Google Cloud?

Principiante Livello intermedio Eccellente

2. Configurazione e requisiti

Configurazione dell'ambiente da seguire in modo autonomo

  1. Accedi alla console Google Cloud e crea un nuovo progetto o riutilizzane uno esistente. Se non hai ancora un account Gmail o Google Workspace, devi crearne uno.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Il Nome progetto è il nome visualizzato dei partecipanti del progetto. Si tratta di una stringa di caratteri non utilizzata dalle API di Google. Puoi sempre aggiornarla.
  • L'ID progetto è univoco in tutti i progetti Google Cloud ed è immutabile (non può essere modificato dopo essere stato impostato). La console Cloud genera automaticamente una stringa univoca. di solito non ti importa cosa sia. Nella maggior parte dei codelab, dovrai fare riferimento al tuo ID progetto (in genere identificato come PROJECT_ID). Se l'ID generato non ti soddisfa, potresti generarne un altro casuale. In alternativa, puoi provarne una personalizzata per verificare se è disponibile. Non può essere modificato dopo questo passaggio e rimane per tutta la durata del progetto.
  • Per informazione, c'è un terzo valore, un numero di progetto, utilizzato da alcune API. Scopri di più su tutti e tre questi valori nella documentazione.
  1. Successivamente, dovrai abilitare la fatturazione nella console Cloud per utilizzare risorse/API Cloud. L'esecuzione di questo codelab non ha alcun costo. Per arrestare le risorse ed evitare di incorrere in fatturazione dopo questo tutorial, puoi eliminare le risorse che hai creato o eliminare il progetto. I nuovi utenti di Google Cloud sono idonei al programma prova senza costi di 300$.

Avvia Cloud Shell

Mentre Google Cloud può essere utilizzato da remoto dal tuo laptop, in questo codelab utilizzerai Cloud Shell, un ambiente a riga di comando in esecuzione nel cloud.

Attiva Cloud Shell

  1. Dalla console Cloud, fai clic su Attiva Cloud Shell 853e55310c205094.png.

55efc1aaa7a4d3ad.png

Se è la prima volta che avvii Cloud Shell, ti verrà mostrata una schermata intermedia che descrive di cosa si tratta. Se ti è stata presentata una schermata intermedia, fai clic su Continua.

9c92662c6a846a5c.png

Il provisioning e la connessione a Cloud Shell dovrebbero richiedere solo qualche istante.

9f0e51b578fecce5.png

Questa macchina virtuale viene caricata con tutti gli strumenti di sviluppo necessari. Offre una home directory permanente da 5 GB e viene eseguita in Google Cloud, migliorando notevolmente le prestazioni di rete e l'autenticazione. Gran parte, se non tutto, del lavoro in questo codelab può essere svolto con un browser.

Una volta stabilita la connessione a Cloud Shell, dovresti vedere che hai eseguito l'autenticazione e che il progetto è impostato sul tuo ID progetto.

  1. Esegui questo comando in Cloud Shell per verificare che l'account sia autenticato:
gcloud auth list

Output comando

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Esegui questo comando in Cloud Shell per confermare che il comando gcloud è a conoscenza del tuo progetto:
gcloud config list project

Output comando

[core]
project = <PROJECT_ID>

In caso contrario, puoi impostarlo con questo comando:

gcloud config set project <PROJECT_ID>

Output comando

Updated property [core/project].

3. Configurazione dell'ambiente

Prima di poter iniziare a utilizzare l'API Vision, esegui questo comando in Cloud Shell per abilitare l'API:

gcloud services enable vision.googleapis.com

Il risultato dovrebbe essere simile a questo:

Operation "operations/..." finished successfully.

Ora puoi utilizzare l'API Vision.

Passa alla tua home directory:

cd ~

Crea un ambiente virtuale Python per isolare le dipendenze:

virtualenv venv-vision

Attiva l'ambiente virtuale:

source venv-vision/bin/activate

Installa IPython e la libreria client dell'API Vision:

pip install ipython google-cloud-vision

Il risultato dovrebbe essere simile a questo:

...
Installing collected packages: ..., ipython, google-cloud-vision
Successfully installed ... google-cloud-vision-3.4.0 ...

Ora è tutto pronto per utilizzare la libreria client dell'API Vision.

Nei passaggi successivi, utilizzerai un interprete Python interattivo chiamato IPython, che hai installato nel passaggio precedente. Avvia una sessione eseguendo ipython in Cloud Shell:

ipython

Il risultato dovrebbe essere simile a questo:

Python 3.9.2 (default, Feb 28 2021, 17:03:44)
Type 'copyright', 'credits' or 'license' for more information
IPython 8.12.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]:

Sei pronto per effettuare la tua prima richiesta...

4. Esegui rilevamento etichette

Una delle funzionalità principali dell'API Vision è l'identificazione di oggetti o entità in un'immagine, nota come annotazione delle etichette. Il rilevamento etichette identifica oggetti generici, luoghi, attività, specie animali, prodotti e altro ancora. L'API Vision prende un'immagine di input e restituisce le etichette più probabili applicabili a quell'immagine. Restituisce le etichette con maggiore corrispondenza insieme al punteggio di confidenza di una corrispondenza con l'immagine.

In questo esempio, eseguirai il rilevamento delle etichette su un'immagine (per gentile concessione di Alex Knight) di Setagaya, un famoso distretto di Tokyo:

756f97f0b1e46c38.jpeg

Copia il seguente codice nella tua sessione IPython:

from typing import Sequence

from google.cloud import vision


def analyze_image_from_uri(
    image_uri: str,
    feature_types: Sequence,
) -> vision.AnnotateImageResponse:
    client = vision.ImageAnnotatorClient()

    image = vision.Image()
    image.source.image_uri = image_uri
    features = [vision.Feature(type_=feature_type) for feature_type in feature_types]
    request = vision.AnnotateImageRequest(image=image, features=features)

    response = client.annotate_image(request=request)

    return response


def print_labels(response: vision.AnnotateImageResponse):
    print("=" * 80)
    for label in response.label_annotations:
        print(
            f"{label.score:4.0%}",
            f"{label.description:5}",
            sep=" | ",
        )
        

Dedica un momento a studiare il codice e vedere come utilizza il metodo della libreria client annotate_image per analizzare un'immagine per un insieme di determinate funzionalità.

Invia una richiesta con la funzionalità LABEL_DETECTION:

image_uri = "gs://cloud-samples-data/vision/label/setagaya.jpeg"
features = [vision.Feature.Type.LABEL_DETECTION]

response = analyze_image_from_uri(image_uri, features)
print_labels(response)

Dovrebbe essere visualizzato il seguente output:

================================================================================
 97% | Bicycle
 96% | Tire
 94% | Wheel
 91% | Automotive lighting
 89% | Infrastructure
 87% | Bicycle wheel
 86% | Mode of transport
 85% | Building
 83% | Electricity
 82% | Neighbourhood

Ecco come vengono presentati i risultati dalla demo online:

2191b0425c9c148f.png

Riepilogo

In questo passaggio, sei stato in grado di eseguire il rilevamento di etichette su un'immagine e visualizzare le etichette più probabili associate a quell'immagine. Scopri di più sul rilevamento delle etichette.

5. Esegui rilevamento testo

Il rilevamento del testo esegue il riconoscimento ottico dei caratteri (OCR). Rileva ed estrae il testo all'interno di un'immagine con il supporto di una vasta gamma di lingue. È inoltre dotata di identificazione automatica della lingua.

In questo esempio, eseguirai il rilevamento del testo sull'immagine di un segnale stradale:

4dd3fcfd9ad99b.jpeg

Copia il seguente codice nella tua sessione IPython:

def print_text(response: vision.AnnotateImageResponse):
    print("=" * 80)
    for annotation in response.text_annotations:
        vertices = [f"({v.x},{v.y})" for v in annotation.bounding_poly.vertices]
        print(
            f"{repr(annotation.description):42}",
            ",".join(vertices),
            sep=" | ",
        )
        

Invia una richiesta con la funzionalità TEXT_DETECTION:

image_uri = "gs://cloud-samples-data/vision/ocr/sign.jpg"
features = [vision.Feature.Type.TEXT_DETECTION]

response = analyze_image_from_uri(image_uri, features)
print_text(response)

Dovrebbe essere visualizzato il seguente output:

================================================================================
'WAITING?\nPLEASE\nTURN OFF\nYOUR\nENGINE' | (310,821),(2225,821),(2225,1965),(310,1965)
'WAITING'                                  | (344,821),(2025,879),(2016,1127),(335,1069)
'?'                                        | (2057,881),(2225,887),(2216,1134),(2048,1128)
'PLEASE'                                   | (1208,1230),(1895,1253),(1891,1374),(1204,1351)
'TURN'                                     | (1217,1414),(1718,1434),(1713,1558),(1212,1538)
'OFF'                                      | (1787,1437),(2133,1451),(2128,1575),(1782,1561)
'YOUR'                                     | (1211,1609),(1741,1626),(1737,1747),(1207,1731)
'ENGINE'                                   | (1213,1805),(1923,1819),(1920,1949),(1210,1935)

Ecco come vengono presentati i risultati dalla demo online:

9c70fbce871c5fe5.png

Riepilogo

In questo passaggio, hai potuto eseguire il rilevamento del testo su un'immagine e visualizzare il testo riconosciuto dall'immagine. Scopri di più sul rilevamento del testo.

6. Esegui rilevamento dei punti di riferimento

Il rilevamento dei punti di riferimento rileva strutture naturali e artificiali popolari all'interno di un'immagine.

In questo esempio, eseguirai il rilevamento dei punti di riferimento su un'immagine (per gentile concessione di John Towner) della Torre Eiffel:

fb7801e36884b875.jpeg

Copia il seguente codice nella tua sessione IPython:

def print_landmarks(response: vision.AnnotateImageResponse, min_score: float = 0.5):
    print("=" * 80)
    for landmark in response.landmark_annotations:
        if landmark.score < min_score:
            continue
        vertices = [f"({v.x},{v.y})" for v in landmark.bounding_poly.vertices]
        lat_lng = landmark.locations[0].lat_lng
        print(
            f"{landmark.description:18}",
            ",".join(vertices),
            f"{lat_lng.latitude:.5f}",
            f"{lat_lng.longitude:.5f}",
            sep=" | ",
        )
        

Invia una richiesta con la funzionalità LANDMARK_DETECTION:

image_uri = "gs://cloud-samples-data/vision/landmark/eiffel_tower.jpg"
features = [vision.Feature.Type.LANDMARK_DETECTION]

response = analyze_image_from_uri(image_uri, features)
print_landmarks(response)

Dovrebbe essere visualizzato il seguente output:

================================================================================
Trocadéro Gardens  | (303,36),(520,36),(520,371),(303,371) | 48.86160 | 2.28928
Eiffel Tower       | (458,76),(512,76),(512,263),(458,263) | 48.85846 | 2.29435

Ecco come vengono presentati i risultati dalla demo online:

2788697365670985.png

Riepilogo

In questo passaggio, hai potuto eseguire il rilevamento dei punti di riferimento su un'immagine della Torre Eiffel. Scopri di più sul rilevamento dei punti di riferimento.

7. Esegui rilevamento volto

Il rilevamento delle caratteristiche del volto rileva più volti all'interno di un'immagine, insieme alle caratteristiche principali del viso associate, come lo stato emotivo o l'indossato un copricapo.

In questo esempio, rileverai i volti nell'immagine seguente (per gentile concessione di Himanshu Singh Gurjar):

58c578ece524cf32.jpeg

Copia il seguente codice nella tua sessione IPython:

def print_faces(response: vision.AnnotateImageResponse):
    print("=" * 80)
    for face_number, face in enumerate(response.face_annotations, 1):
        vertices = ",".join(f"({v.x},{v.y})" for v in face.bounding_poly.vertices)
        print(f"# Face {face_number} @ {vertices}")
        print(f"Joy:     {face.joy_likelihood.name}")
        print(f"Exposed: {face.under_exposed_likelihood.name}")
        print(f"Blurred: {face.blurred_likelihood.name}")
        print("-" * 80)
        

Invia una richiesta con la funzionalità FACE_DETECTION:

image_uri = "gs://cloud-samples-data/vision/face/faces.jpeg"
features = [vision.Feature.Type.FACE_DETECTION]

response = analyze_image_from_uri(image_uri, features)
print_faces(response)

Dovrebbe essere visualizzato il seguente output:

================================================================================
# Face 1 @ (1077,157),(2146,157),(2146,1399),(1077,1399)
Joy:     VERY_LIKELY
Exposed: VERY_UNLIKELY
Blurred: VERY_UNLIKELY
--------------------------------------------------------------------------------
# Face 2 @ (144,1273),(793,1273),(793,1844),(144,1844)
Joy:     VERY_UNLIKELY
Exposed: VERY_UNLIKELY
Blurred: UNLIKELY
--------------------------------------------------------------------------------
# Face 3 @ (785,167),(1100,167),(1100,534),(785,534)
Joy:     VERY_UNLIKELY
Exposed: LIKELY
Blurred: VERY_LIKELY
--------------------------------------------------------------------------------

Ecco come vengono presentati i risultati dalla demo online:

cbb7f59299651b83.png

Riepilogo

In questo passaggio, hai potuto eseguire il rilevamento dei volti. Ulteriori informazioni sul rilevamento facciale.

8. Esegui rilevamento oggetti

In questo esempio, effettuerai il rilevamento di oggetti sulla stessa immagine precedente (per gentile concessione di Alex Knight) di Setagaya:

756f97f0b1e46c38.jpeg

Copia il seguente codice nella tua sessione IPython:

def print_objects(response: vision.AnnotateImageResponse):
    print("=" * 80)
    for obj in response.localized_object_annotations:
        nvertices = obj.bounding_poly.normalized_vertices
        print(
            f"{obj.score:4.0%}",
            f"{obj.name:15}",
            f"{obj.mid:10}",
            ",".join(f"({v.x:.1f},{v.y:.1f})" for v in nvertices),
            sep=" | ",
        )
        

Invia una richiesta con la funzionalità OBJECT_LOCALIZATION:

image_uri = "gs://cloud-samples-data/vision/label/setagaya.jpeg"
features = [vision.Feature.Type.OBJECT_LOCALIZATION]

response = analyze_image_from_uri(image_uri, features)
print_objects(response)

Dovrebbe essere visualizzato il seguente output:

================================================================================
 93% | Bicycle         | /m/0199g   | (0.6,0.6),(0.8,0.6),(0.8,0.9),(0.6,0.9)
 92% | Bicycle wheel   | /m/01bqk0  | (0.6,0.7),(0.7,0.7),(0.7,0.9),(0.6,0.9)
 91% | Tire            | /m/0h9mv   | (0.7,0.7),(0.8,0.7),(0.8,1.0),(0.7,1.0)
 75% | Bicycle         | /m/0199g   | (0.3,0.6),(0.4,0.6),(0.4,0.7),(0.3,0.7)
 51% | Tire            | /m/0h9mv   | (0.3,0.6),(0.4,0.6),(0.4,0.7),(0.3,0.7)

Ecco come vengono presentati i risultati dalla demo online:

e1c2ca803d874a6b.png

Riepilogo

In questo passaggio, hai potuto eseguire il rilevamento degli oggetti. Scopri di più sul rilevamento degli oggetti.

9. Più funzionalità

Hai visto come utilizzare alcune funzionalità dell'API Vision, ma ce ne sono molte altre e puoi richiedere più funzionalità in una singola richiesta.

Ecco il tipo di richiesta che puoi effettuare per ottenere tutti gli insight contemporaneamente:

image_uri = "gs://..."
features = [
    vision.Feature.Type.OBJECT_LOCALIZATION,
    vision.Feature.Type.FACE_DETECTION,
    vision.Feature.Type.LANDMARK_DETECTION,
    vision.Feature.Type.LOGO_DETECTION,
    vision.Feature.Type.LABEL_DETECTION,
    vision.Feature.Type.TEXT_DETECTION,
    vision.Feature.Type.DOCUMENT_TEXT_DETECTION,
    vision.Feature.Type.SAFE_SEARCH_DETECTION,
    vision.Feature.Type.IMAGE_PROPERTIES,
    vision.Feature.Type.CROP_HINTS,
    vision.Feature.Type.WEB_DETECTION,
    vision.Feature.Type.PRODUCT_SEARCH,
    vision.Feature.Type.OBJECT_LOCALIZATION,
]

# response = analyze_image_from_uri(image_uri, features)

E ci sono altre possibilità, come l'esecuzione di rilevamenti su un batch di immagini, in modo sincrono o asincrono. Consulta tutte le guide illustrative.

10. Complimenti

5ab7829fc22b21c4.png

Hai imparato a utilizzare l'API Vision con Python e hai testato alcune funzionalità di rilevamento di immagini.

Esegui la pulizia

Per ripulire il tuo ambiente di sviluppo, da Cloud Shell:

  • Se sei ancora nella sessione Python, torna alla shell: exit
  • Interrompi l'utilizzo dell'ambiente virtuale Python: deactivate
  • Elimina la cartella dell'ambiente virtuale: cd ~ ; rm -rf ./venv-vision

Per eliminare il tuo progetto Google Cloud, da Cloud Shell:

  • Recupera il tuo ID progetto attuale: PROJECT_ID=$(gcloud config get-value core/project)
  • Assicurati che questo sia il progetto che vuoi eliminare: echo $PROJECT_ID
  • Elimina il progetto: gcloud projects delete $PROJECT_ID

Scopri di più

Licenza

Questo lavoro è concesso in licenza ai sensi di una licenza Creative Commons Attribution 2.0 Generic.