Tutorial sul rilevamento web

Pubblico

L'obiettivo di questo tutorial è aiutarti a sviluppare applicazioni utilizzando Funzionalità di rilevamento web dell'API Vision. Si presume che tu abbia familiarità con le tecniche e i costrutti di programmazione di base, ma anche se sei un programmatore alle prime armi, dovresti essere in grado di seguire ed eseguire questo tutorial senza difficoltà, quindi utilizzare la documentazione di riferimento dell'API Vision per creare applicazioni di base.

Questo tutorial illustra i passaggi di un'applicazione API Vision, che mostrano come per effettuare una chiamata all'API Vision per utilizzare la funzionalità di rilevamento web.

Prerequisiti

Python

Panoramica

Questo tutorial illustra un'applicazione di base dell'API Vision che utilizza un Richiesta Web detection. Una Web detection risposta annotate l'immagine inviata nella richiesta con:

  • Etichette ottenute dal web
  • URL dei siti con immagini corrispondenti
  • URL di immagini web che corrispondono parzialmente o completamente all'immagine nella richiesta
  • URL di immagini visivamente simili

Elenco di codice

Mentre leggi il codice, ti consigliamo di seguire la procedura facendo riferimento al riferimento Python dell'API Vision.

import argparse

from google.cloud import vision



def annotate(path: str) -> vision.WebDetection:
    """Returns web annotations given the path to an image.

    Args:
        path: path to the input image.

    Returns:
        An WebDetection object with relevant information of the
        image from the internet (i.e., the annotations).
    """
    client = vision.ImageAnnotatorClient()

    if path.startswith("http") or path.startswith("gs:"):
        image = vision.Image()
        image.source.image_uri = path

    else:
        with open(path, "rb") as image_file:
            content = image_file.read()

        image = vision.Image(content=content)

    web_detection = client.web_detection(image=image).web_detection

    return web_detection


def report(annotations: vision.WebDetection) -> None:
    """Prints detected features in the provided web annotations.

    Args:
        annotations: The web annotations (WebDetection object) from which
        the features should be parsed and printed.
    """
    if annotations.pages_with_matching_images:
        print(
            f"\n{len(annotations.pages_with_matching_images)} Pages with matching images retrieved"
        )

        for page in annotations.pages_with_matching_images:
            print(f"Url   : {page.url}")

    if annotations.full_matching_images:
        print(f"\n{len(annotations.full_matching_images)} Full Matches found: ")

        for image in annotations.full_matching_images:
            print(f"Url  : {image.url}")

    if annotations.partial_matching_images:
        print(f"\n{len(annotations.partial_matching_images)} Partial Matches found: ")

        for image in annotations.partial_matching_images:
            print(f"Url  : {image.url}")

    if annotations.web_entities:
        print(f"\n{len(annotations.web_entities)} Web entities found: ")

        for entity in annotations.web_entities:
            print(f"Score      : {entity.score}")
            print(f"Description: {entity.description}")


if __name__ == "__main__":
    parser = argparse.ArgumentParser(
        description=__doc__,
        formatter_class=argparse.RawDescriptionHelpFormatter,
    )
    path_help = str(
        "The image to detect, can be web URI, "
        "Google Cloud Storage, or path to local file."
    )
    parser.add_argument("image_url", help=path_help)
    args = parser.parse_args()

    report(annotate(args.image_url))

Questa semplice applicazione esegue le seguenti attività:

  • Importa le librerie necessarie per eseguire l'applicazione
  • Prende un percorso immagine come argomento e lo passa alla funzione main()
  • Utilizza il client API di Google Cloud per eseguire il rilevamento web
  • Esegue un ciclo sulla risposta e stampa i risultati
  • Stampa l'elenco di entità web con descrizione e punteggio
  • Stampa un elenco di pagine corrispondenti
  • Stampa un elenco di immagini con corrispondenze parziali
  • Consente di stampare un elenco di immagini completamente corrispondenti

Un'occhiata più da vicino

Importazione di librerie

import argparse

from google.cloud import vision

Importiamo le librerie standard:

  • argparse per consentire all'applicazione di accettare i nomi file di input come argomenti
  • io per leggere da file

Altre importazioni:

  • La classe ImageAnnotatorClient all'interno della libreria google.cloud.vision per accedere all'API Vision.
  • Il modulo types all'interno della libreria google.cloud.vision per la creazione delle richieste.

Esecuzione dell'applicazione

parser = argparse.ArgumentParser(
    description=__doc__,
    formatter_class=argparse.RawDescriptionHelpFormatter,
)
path_help = str(
    "The image to detect, can be web URI, "
    "Google Cloud Storage, or path to local file."
)
parser.add_argument("image_url", help=path_help)
args = parser.parse_args()

report(annotate(args.image_url))

Qui, analizziamo semplicemente l'argomento pass-in che specifica l'URL del dell'immagine web e passarla alla funzione main().

Autenticazione nell'API

Prima di comunicare con il servizio API Vision, è necessario di autenticare il servizio utilizzando le credenziali acquisite in precedenza. All'interno di un'applicazione, il modo più semplice per ottenere le credenziali è utilizzare le credenziali predefinite dell'applicazione (ADC). La libreria client ottiene le credenziali automaticamente. Per impostazione predefinita, questo viene fatto ottenendo le credenziali dalla variabile di ambiente GOOGLE_APPLICATION_CREDENTIALS, che deve essere impostata in modo da puntare al file della chiave JSON del tuo account di servizio (per ulteriori informazioni, consulta Configurare un account di servizio).

Creazione della richiesta

client = vision.ImageAnnotatorClient()

if path.startswith("http") or path.startswith("gs:"):
    image = vision.Image()
    image.source.image_uri = path

else:
    with open(path, "rb") as image_file:
        content = image_file.read()

    image = vision.Image(content=content)

web_detection = client.web_detection(image=image).web_detection

Ora che il servizio API Vision è pronto, possiamo creare una richiesta al servizio.

Questo snippet di codice esegue le seguenti attività:

  1. Crea un'istanza ImageAnnotatorClient come client.
  2. Costruisce un oggetto Image da un file locale o da un URI.
  3. Passa l'oggetto Image al metodo web_detection del client.
  4. Restituisce le annotazioni.

Stampa della risposta

if annotations.pages_with_matching_images:
    print(
        f"\n{len(annotations.pages_with_matching_images)} Pages with matching images retrieved"
    )

    for page in annotations.pages_with_matching_images:
        print(f"Url   : {page.url}")

if annotations.full_matching_images:
    print(f"\n{len(annotations.full_matching_images)} Full Matches found: ")

    for image in annotations.full_matching_images:
        print(f"Url  : {image.url}")

if annotations.partial_matching_images:
    print(f"\n{len(annotations.partial_matching_images)} Partial Matches found: ")

    for image in annotations.partial_matching_images:
        print(f"Url  : {image.url}")

if annotations.web_entities:
    print(f"\n{len(annotations.web_entities)} Web entities found: ")

    for entity in annotations.web_entities:
        print(f"Score      : {entity.score}")
        print(f"Description: {entity.description}")

Una volta completata l'operazione, procediamo WebDetection, e stampare le entità e gli URL contenuti nell'annotazione (i primi due risultati di ciascun tipo di annotazione sono riportati nella prossima sezione).

Esecuzione dell'applicazione

Per eseguire l'applicazione, passiamo l'URL web (http://www.photos-public-domain.com/wp-content/uploads/2011/01/old-vw-bug-and-van.jpg) della seguente immagine dell'auto.

Ecco il comando Python con l'URL web passato dell'immagine dell'auto, seguito dall'output della console. Tieni presente che il punteggio di pertinenza viene aggiunto dopo il tag per le entità elencate. Tieni presente che i punteggi non sono normalizzati o confrontabili tra diverse query a immagini.

python web_detect.py "http://www.photos-public-domain.com/wp-content/uploads/2011/01/old-vw-bug-and-van.jpg"
5 Pages with matching images retrieved
Url   : http://www.photos-public-domain.com/2011/01/07/old-volkswagen-bug-and-van/
Url   : http://pix-hd.com/old+volkswagen+van+for+sale
...

2 Full Matches found:
Url  : http://www.photos-public-domain.com/wp-content/uploads/2011/01/old-vw-bug-and-van.jpg
Url  : http://www.wbwagen.com/media/old-volkswagen-bug-and-van-picture-free-photograph-photos-public_s_66f487042adad5a6.jpg

4 Partial Matches found:
Url  : http://www.photos-public-domain.com/wp-content/uploads/2011/01/old-vw-bug-and-van.jpg
Url  : http://www.wbwagen.com/media/old-vw-bug-and-vanjpg_s_ac343d7f041b5f8d.jpg
...

5 Web entities found:
Score      : 5.35028934479
Description: Volkswagen Beetle
Score      : 1.43998003006
Description: Volkswagen
Score      : 0.828279972076
Description: Volkswagen Type 2
Score      : 0.75271999836
Description: Van
Score      : 0.690039992332
Description: Car

Complimenti! Hai eseguito il rilevamento web utilizzando l'API Vision.