Rilevamento delle etichette

L'API Vision è in grado di rilevare ed estrarre informazioni sulle entità in un'immagine, in un ampio gruppo di categorie.

Le etichette possono identificare oggetti generici, località, attività, specie animali, prodotti e altro ancora. Se hai bisogno di etichette personalizzate scelte come target, Cloud AutoML Vision ti consente di addestrare un modello di machine learning personalizzato per classificare le immagini.

Le etichette vengono restituite solo in inglese. L'API Cloud Translation può tradurre le etichette in inglese in una serie di altre lingue.

Immagine di una strada di Setagaya
Credito immagine: Alex Knight su Unsplash.

Ad esempio, l'immagine sopra potrebbe restituire il seguente elenco di etichette:

Descrizione Punteggio
Via 0,872
Snapshot 0,852
Città 0,848
Notte 0,804
Stradina 0,713

Richieste di rilevamento etichette

Configurare il progetto GCP e l'autenticazione

Rilevamento di etichette in un'immagine locale

L'API Vision può eseguire il rilevamento delle caratteristiche in un file immagine locale inviando il contenuto del file immagine come una stringa codificata in base64 nel corpo della richiesta.

REST &CMD LINE

Prima di utilizzare uno qualsiasi dei dati della richiesta, effettua le seguenti sostituzioni:

  • BASE64_ENCODED_IMAGE: la rappresentazione base64 (stringa ASCII) dei dati immagine binari. Questa stringa deve essere simile alla seguente stringa:
    • /9j/4QAYRXhpZgAA...9tAVx/zDQDlGxn//2Q==
    Per ulteriori informazioni, visita l'argomento Codifica base64.
  • (Facoltativo) RESULTS_INT: un valore intero dei risultati da restituire. Se ometti il campo "maxResults" e il relativo valore, l'API restituisce il valore predefinito di 10 risultati. Questo campo non si applica ai seguenti tipi di funzionalità: TEXT_DETECTION, DOCUMENT_TEXT_DETECTION o CROP_HINTS.

Metodo HTTP e URL:

POST https://vision.googleapis.com/v1/images:annotate

Corpo JSON richiesta:

{
  "requests": [
    {
      "image": {
        "content": "BASE64_ENCODED_IMAGE"
      },
      "features": [
        {
          "maxResults": RESULTS_INT,
          "type": "LABEL_DETECTION"
        }
      ]
    }
  ]
}

Per inviare la richiesta, scegli una delle seguenti opzioni:

Curling

Salva il corpo della richiesta in un file denominato request.json ed esegui il seguente comando:

curl -X POST \
-H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://vision.googleapis.com/v1/images:annotate"

PowerShell

Salva il corpo della richiesta in un file denominato request.json ed esegui il seguente comando:

$cred = gcloud auth application-default print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://vision.googleapis.com/v1/images:annotate" | Select-Object -Expand Content

Se la richiesta ha esito positivo, il server restituisce un codice di stato HTTP 200 OK e la risposta in formato JSON.

Una risposta LABEL_DETECTION include le etichette rilevate, il punteggio, l'adeguatezza e un ID etichetta opaca, in cui:

  • mid: se presente, contiene un identificatore MID (generato a macchina) corrispondente alla voce Google Knowledge Graph dell'entità. Tieni presente che i valori mid rimangono univoci nelle diverse lingue, pertanto puoi utilizzarli per collegare entità tra lingue diverse. Per esaminare i valori MID, consulta la documentazione dell'API Google Knowledge Graph.
  • description: la descrizione dell'etichetta.
  • score: il punteggio di affidabilità, che va da 0 (nessuna confidenza) a 1 (affidabilità molto alta).
  • topicality: la pertinenza dell'etichetta ICA (Image Content Annotation) all'immagine. Misura quanto è importante/centrale un'etichetta rispetto al contesto complessivo di una pagina.
{
  "responses": [
    {
      "labelAnnotations": [
        {
          "mid": "/m/01c8br",
          "description": "Street",
          "score": 0.87294734,
          "topicality": 0.87294734
        },
        {
          "mid": "/m/06pg22",
          "description": "Snapshot",
          "score": 0.8523099,
          "topicality": 0.8523099
        },
        {
          "mid": "/m/0dx1j",
          "description": "Town",
          "score": 0.8481104,
          "topicality": 0.8481104
        },
        {
          "mid": "/m/01d74z",
          "description": "Night",
          "score": 0.80408716,
          "topicality": 0.80408716
        },
        {
          "mid": "/m/01lwf0",
          "description": "Alley",
          "score": 0.7133322,
          "topicality": 0.7133322
        }
      ]
    }
  ]
}

Go

Prima di provare questo esempio, segui le istruzioni per la configurazione di Go nella guida rapida di Vision che utilizza le librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Vision Go.


// detectLabels gets labels from the Vision API for an image at the given file path.
func detectLabels(w io.Writer, file string) error {
	ctx := context.Background()

	client, err := vision.NewImageAnnotatorClient(ctx)
	if err != nil {
		return err
	}

	f, err := os.Open(file)
	if err != nil {
		return err
	}
	defer f.Close()

	image, err := vision.NewImageFromReader(f)
	if err != nil {
		return err
	}
	annotations, err := client.DetectLabels(ctx, image, nil, 10)
	if err != nil {
		return err
	}

	if len(annotations) == 0 {
		fmt.Fprintln(w, "No labels found.")
	} else {
		fmt.Fprintln(w, "Labels:")
		for _, annotation := range annotations {
			fmt.Fprintln(w, annotation.Description)
		}
	}

	return nil
}

Java

Prima di provare questo esempio, segui le istruzioni di configurazione di Java nella Guida rapida all'API Vision che utilizza le librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Java dell'API Vision.


import com.google.cloud.vision.v1.AnnotateImageRequest;
import com.google.cloud.vision.v1.AnnotateImageResponse;
import com.google.cloud.vision.v1.BatchAnnotateImagesResponse;
import com.google.cloud.vision.v1.EntityAnnotation;
import com.google.cloud.vision.v1.Feature;
import com.google.cloud.vision.v1.Image;
import com.google.cloud.vision.v1.ImageAnnotatorClient;
import com.google.protobuf.ByteString;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class DetectLabels {

  public static void detectLabels() throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String filePath = "path/to/your/image/file.jpg";
    detectLabels(filePath);
  }

  // Detects labels in the specified local image.
  public static void detectLabels(String filePath) throws IOException {
    List<AnnotateImageRequest> requests = new ArrayList<>();

    ByteString imgBytes = ByteString.readFrom(new FileInputStream(filePath));

    Image img = Image.newBuilder().setContent(imgBytes).build();
    Feature feat = Feature.newBuilder().setType(Feature.Type.LABEL_DETECTION).build();
    AnnotateImageRequest request =
        AnnotateImageRequest.newBuilder().addFeatures(feat).setImage(img).build();
    requests.add(request);

    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the "close" method on the client to safely clean up any remaining background resources.
    try (ImageAnnotatorClient client = ImageAnnotatorClient.create()) {
      BatchAnnotateImagesResponse response = client.batchAnnotateImages(requests);
      List<AnnotateImageResponse> responses = response.getResponsesList();

      for (AnnotateImageResponse res : responses) {
        if (res.hasError()) {
          System.out.format("Error: %s%n", res.getError().getMessage());
          return;
        }

        // For full list of available annotations, see http://g.co/cloud/vision/docs
        for (EntityAnnotation annotation : res.getLabelAnnotationsList()) {
          annotation
              .getAllFields()
              .forEach((k, v) -> System.out.format("%s : %s%n", k, v.toString()));
        }
      }
    }
  }
}

Node.js

Prima di provare questo esempio, segui le istruzioni per la configurazione di Node.js nella guida rapida di Vision che utilizza le librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Vision Node.js.

// Imports the Google Cloud client library
const vision = require('@google-cloud/vision');

// Creates a client
const client = new vision.ImageAnnotatorClient();

/**
 * TODO(developer): Uncomment the following line before running the sample.
 */
// const fileName = 'Local image file, e.g. /path/to/image.png';

// Performs label detection on the local file
const [result] = await client.labelDetection(fileName);
const labels = result.labelAnnotations;
console.log('Labels:');
labels.forEach(label => console.log(label.description));

Python

Prima di provare questo esempio, segui le istruzioni di configurazione di Python nella guida rapida di Vision che utilizza le librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Vision Python.

def detect_labels(path):
    """Detects labels in the file."""
    from google.cloud import vision
    import io
    client = vision.ImageAnnotatorClient()

    with io.open(path, 'rb') as image_file:
        content = image_file.read()

    image = vision.Image(content=content)

    response = client.label_detection(image=image)
    labels = response.label_annotations
    print('Labels:')

    for label in labels:
        print(label.description)

    if response.error.message:
        raise Exception(
            '{}\nFor more info on error messages, check: '
            'https://cloud.google.com/apis/design/errors'.format(
                response.error.message))

Lingue aggiuntive

C#: segui le istruzioni di configurazione di C# nella pagina delle librerie client e consulta la documentazione di riferimento di Vision per .NET.

PHP: segui le istruzioni per la configurazione di PHP nella pagina delle librerie client e consulta la documentazione di riferimento di Vision per PHP.

Ruby: segui le istruzioni di configurazione di Rubby nella pagina delle librerie client e consulta la documentazione di riferimento di Vision per Ruby.

Rilevamento di etichette in un'immagine remota

Per comodità, l'API Vision può eseguire il rilevamento delle funzionalità direttamente in un file immagine situato in Google Cloud Storage o sul Web, senza dover inviare i contenuti del file immagine nel corpo della richiesta.

REST &CMD LINE

Prima di utilizzare uno qualsiasi dei dati della richiesta, effettua le seguenti sostituzioni:

  • CLOUD_STORAGE_IMAGE_URI: il percorso di un file immagine valido in un bucket Cloud Storage. Devi disporre almeno di privilegi di lettura per il file. Esempio:
    • gs://cloud-samples-data/vision/label/setagaya.jpeg
  • (Facoltativo) RESULTS_INT: un valore intero dei risultati da restituire. Se ometti il campo "maxResults" e il relativo valore, l'API restituisce il valore predefinito di 10 risultati. Questo campo non si applica ai seguenti tipi di funzionalità: TEXT_DETECTION, DOCUMENT_TEXT_DETECTION o CROP_HINTS.

Metodo HTTP e URL:

POST https://vision.googleapis.com/v1/images:annotate

Corpo JSON richiesta:

{
  "requests": [
    {
      "image": {
        "source": {
          "gcsImageUri": "CLOUD_STORAGE_IMAGE_URI"
        }
      },
      "features": [
        {
          "maxResults": RESULTS_INT,
          "type": "LABEL_DETECTION"
        },
      ]
    }
  ]
}

Per inviare la richiesta, scegli una delle seguenti opzioni:

Curling

Salva il corpo della richiesta in un file denominato request.json ed esegui il seguente comando:

curl -X POST \
-H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://vision.googleapis.com/v1/images:annotate"

PowerShell

Salva il corpo della richiesta in un file denominato request.json ed esegui il seguente comando:

$cred = gcloud auth application-default print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://vision.googleapis.com/v1/images:annotate" | Select-Object -Expand Content

Se la richiesta ha esito positivo, il server restituisce un codice di stato HTTP 200 OK e la risposta in formato JSON.

Una risposta LABEL_DETECTION include le etichette rilevate, il punteggio, l'adeguatezza e un ID etichetta opaca, in cui:

  • mid: se presente, contiene un identificatore MID (generato a macchina) corrispondente alla voce Google Knowledge Graph dell'entità. Tieni presente che i valori mid rimangono univoci nelle diverse lingue, pertanto puoi utilizzarli per collegare entità tra lingue diverse. Per esaminare i valori MID, consulta la documentazione dell'API Google Knowledge Graph.
  • description: la descrizione dell'etichetta.
  • score: il punteggio di affidabilità, che va da 0 (nessuna confidenza) a 1 (affidabilità molto alta).
  • topicality: la pertinenza dell'etichetta ICA (Image Content Antation) all'immagine. Misura quanto è importante/centrale un'etichetta rispetto al contesto complessivo di una pagina.
{
  "responses": [
    {
      "labelAnnotations": [
        {
          "mid": "/m/01c8br",
          "description": "Street",
          "score": 0.87294734,
          "topicality": 0.87294734
        },
        {
          "mid": "/m/06pg22",
          "description": "Snapshot",
          "score": 0.8523099,
          "topicality": 0.8523099
        },
        {
          "mid": "/m/0dx1j",
          "description": "Town",
          "score": 0.8481104,
          "topicality": 0.8481104
        },
        {
          "mid": "/m/01d74z",
          "description": "Night",
          "score": 0.80408716,
          "topicality": 0.80408716
        },
        {
          "mid": "/m/01lwf0",
          "description": "Alley",
          "score": 0.7133322,
          "topicality": 0.7133322
        }
      ]
    }
  ]
}

Go

Prima di provare questo esempio, segui le istruzioni per la configurazione di Go nella guida rapida di Vision che utilizza le librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Vision Go.


// detectLabels gets labels from the Vision API for an image at the given file path.
func detectLabelsURI(w io.Writer, file string) error {
	ctx := context.Background()

	client, err := vision.NewImageAnnotatorClient(ctx)
	if err != nil {
		return err
	}

	image := vision.NewImageFromURI(file)
	annotations, err := client.DetectLabels(ctx, image, nil, 10)
	if err != nil {
		return err
	}

	if len(annotations) == 0 {
		fmt.Fprintln(w, "No labels found.")
	} else {
		fmt.Fprintln(w, "Labels:")
		for _, annotation := range annotations {
			fmt.Fprintln(w, annotation.Description)
		}
	}

	return nil
}

Java

Prima di provare questo esempio, segui le istruzioni di configurazione di Java nella Guida rapida all'API Vision che utilizza le librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Java dell'API Vision.


import com.google.cloud.vision.v1.AnnotateImageRequest;
import com.google.cloud.vision.v1.AnnotateImageResponse;
import com.google.cloud.vision.v1.BatchAnnotateImagesResponse;
import com.google.cloud.vision.v1.EntityAnnotation;
import com.google.cloud.vision.v1.Feature;
import com.google.cloud.vision.v1.Image;
import com.google.cloud.vision.v1.ImageAnnotatorClient;
import com.google.cloud.vision.v1.ImageSource;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class DetectLabelsGcs {

  public static void detectLabelsGcs() throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String filePath = "gs://your-gcs-bucket/path/to/image/file.jpg";
    detectLabelsGcs(filePath);
  }

  // Detects labels in the specified remote image on Google Cloud Storage.
  public static void detectLabelsGcs(String gcsPath) throws IOException {
    List<AnnotateImageRequest> requests = new ArrayList<>();

    ImageSource imgSource = ImageSource.newBuilder().setGcsImageUri(gcsPath).build();
    Image img = Image.newBuilder().setSource(imgSource).build();
    Feature feat = Feature.newBuilder().setType(Feature.Type.LABEL_DETECTION).build();
    AnnotateImageRequest request =
        AnnotateImageRequest.newBuilder().addFeatures(feat).setImage(img).build();
    requests.add(request);

    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the "close" method on the client to safely clean up any remaining background resources.
    try (ImageAnnotatorClient client = ImageAnnotatorClient.create()) {
      BatchAnnotateImagesResponse response = client.batchAnnotateImages(requests);
      List<AnnotateImageResponse> responses = response.getResponsesList();

      for (AnnotateImageResponse res : responses) {
        if (res.hasError()) {
          System.out.format("Error: %s%n", res.getError().getMessage());
          return;
        }

        // For full list of available annotations, see http://g.co/cloud/vision/docs
        for (EntityAnnotation annotation : res.getLabelAnnotationsList()) {
          annotation
              .getAllFields()
              .forEach((k, v) -> System.out.format("%s : %s%n", k, v.toString()));
        }
      }
    }
  }
}

Node.js

Prima di provare questo esempio, segui le istruzioni per la configurazione di Node.js nella guida rapida di Vision che utilizza le librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Vision Node.js.

// Imports the Google Cloud client libraries
const vision = require('@google-cloud/vision');

// Creates a client
const client = new vision.ImageAnnotatorClient();

/**
 * TODO(developer): Uncomment the following lines before running the sample.
 */
// const bucketName = 'Bucket where the file resides, e.g. my-bucket';
// const fileName = 'Path to file within bucket, e.g. path/to/image.png';

// Performs label detection on the gcs file
const [result] = await client.labelDetection(
  `gs://${bucketName}/${fileName}`
);
const labels = result.labelAnnotations;
console.log('Labels:');
labels.forEach(label => console.log(label.description));

Python

Prima di provare questo esempio, segui le istruzioni di configurazione di Python nella guida rapida di Vision che utilizza le librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Vision Python.

def detect_labels_uri(uri):
    """Detects labels in the file located in Google Cloud Storage or on the
    Web."""
    from google.cloud import vision
    client = vision.ImageAnnotatorClient()
    image = vision.Image()
    image.source.image_uri = uri

    response = client.label_detection(image=image)
    labels = response.label_annotations
    print('Labels:')

    for label in labels:
        print(label.description)

    if response.error.message:
        raise Exception(
            '{}\nFor more info on error messages, check: '
            'https://cloud.google.com/apis/design/errors'.format(
                response.error.message))

gcloud

Per rilevare le etichette in un'immagine, utilizza il comando gcloud ml vision detect-labels come mostrato nell'esempio seguente:

gcloud ml vision detect-labels gs://cloud-samples-data/vision/label/setagaya.jpeg

Lingue aggiuntive

C#: segui le istruzioni di configurazione di C# nella pagina delle librerie client e consulta la documentazione di riferimento di Vision per .NET.

PHP: segui le istruzioni per la configurazione di PHP nella pagina delle librerie client e consulta la documentazione di riferimento di Vision per PHP.

Ruby: segui le istruzioni di configurazione di Rubby nella pagina delle librerie client e consulta la documentazione di riferimento di Vision per Ruby.

Prova

Prova il rilevamento etichette qui sotto. Puoi utilizzare l'immagine già specificata (gs://cloud-samples-data/vision/label/setagaya.jpeg) o specificarne una personalizzata in sostituzione. Invia la richiesta selezionando Esegui.

Immagine di una strada di Setagaya
Credito immagine: Alex Knight su Unsplash.

Corpo della richiesta:

{
  "requests": [
    {
      "features": [
        {
          "maxResults": 5,
          "type": "LABEL_DETECTION"
        }
      ],
      "image": {
        "source": {
          "imageUri": "gs://cloud-samples-data/vision/label/setagaya.jpeg"
        }
      }
    }
  ]
}