Tutorial sul rilevamento web

Pubblico

Lo scopo di questo tutorial è aiutarti a sviluppare applicazioni utilizzando la funzionalità di rilevamento web dell'API Vision. Si presuppone che tu abbia familiarità con i costrutti e le tecniche di programmazione di base, ma anche se sei un programmatore principiante, 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 un'applicazione dell'API Vision, mostrando come effettuare una chiamata all'API Vision per utilizzare la funzionalità di rilevamento web.

Prerequisiti

Python

Panoramica

Questo tutorial ti guida attraverso un'applicazione di base dell'API Vision che utilizza una richiesta di Web detection. Una risposta di Web detection annota l'immagine inviata nella richiesta con:

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

Elenco del codice

Durante la lettura del codice, ti consigliamo di seguire il 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
  • Accetta un percorso dell'immagine come argomento e lo passa alla main() funzione
  • Utilizza il client API Google Cloud per eseguire il rilevamento web
  • Esegue un loop sulla risposta e stampa i risultati
  • Stampa l'elenco delle entità web con descrizione e punteggio
  • Stampa un elenco di pagine corrispondenti
  • Stampa un elenco di immagini corrispondenti parzialmente
  • Stampa un elenco di immagini corrispondenti completamente

Un'occhiata più da vicino

Importazione delle librerie

import argparse

from google.cloud import vision

Importiamo le librerie standard:

  • argparse per consentire all'applicazione di accettare i nomi dei file di input come argomenti
  • io per la lettura dai file

Altri import:

  • La classe ImageAnnotatorClient all'interno della libreria google.cloud.vision per l'accesso 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 passato che specifica l'URL dell'immagine web e lo passiamo alla funzione main().

Autenticazione nell'API

Prima di comunicare con il servizio API Vision, devi 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 automaticamente le credenziali. Per impostazione predefinita, questa operazione viene eseguita ottenendo le credenziali dalla GOOGLE_APPLICATION_CREDENTIALS variabile di ambiente, che deve essere impostata in modo da puntare al file della chiave JSON dell'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 nostro 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. Crea 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, esaminiamo il WebDetection, e stampiamo le entità e gli URL contenuti nell'annotazione (nella sezione successiva vengono mostrati i primi due risultati di ogni tipo di annotazione).

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.

Di seguito è riportato il comando Python con l'URL web dell'immagine dell'auto passato, seguito dall'output della console. Tieni presente che dopo le entità elencate viene aggiunto un punteggio di pertinenza. Tieni presente che i punteggi non sono normalizzati o confrontabili tra diverse query di 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.