Detectar logotipos

Com a detecção de logotipos, você encontra logotipos de produtos famosos em uma imagem.

Logotipo do Google com anotação
Crédito da imagem: Robert Scoble (CC BY 2.0, anotação adicionada).

Solicitações de detecção de logotipos

Configurar o projeto do Google Cloud e a autenticação

Detectar logotipos em uma imagem local

Use a API Vision para detectar atributos em um arquivo de imagem local.

Para solicitações REST, envie o conteúdo do arquivo de imagem como uma string codificada em base64 no corpo da solicitação.

Para solicitações da gcloud e da biblioteca de cliente, especifique o caminho para uma imagem local na solicitação.

REST

Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

  • BASE64_ENCODED_IMAGE: a representação base64 (string ASCII) dos dados da imagem binária. A string precisa ser semelhante à seguinte:
    • /9j/4QAYRXhpZgAA...9tAVx/zDQDlGxn//2Q==
    Saiba mais no tópico Codificação base64.
  • PROJECT_ID: o ID do projeto do Google Cloud .

Método HTTP e URL:

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

Corpo JSON da solicitação:

{
  "requests": [
    {
      "image": {
        "content": "BASE64_ENCODED_IMAGE"
      },
      "features": [
        {
          "type": "LOGO_DETECTION"
        },
      ]
    }
  ]
}

Para enviar a solicitação, escolha uma destas opções:

curl

Salve o corpo da solicitação em um arquivo com o nome request.json e execute o comando abaixo:

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

PowerShell

Salve o corpo da solicitação em um arquivo com o nome request.json e execute o comando a seguir:

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred"; "x-goog-user-project" = "PROJECT_ID" }

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

Quando a solicitação é bem-sucedida, o servidor retorna um código de status HTTP 200 OK e a resposta no formato JSON.

Resposta:

{
  "responses": [
    {
      "logoAnnotations": [
        {
          "mid": "/m/045c7b",
          "description": "google",
          "score": 0.980325,
          "boundingPoly": {
            "vertices": [
              {
                "x": 12,
                "y": 42
              },
              {
                "x": 439,
                "y": 42
              },
              {
                "x": 439,
                "y": 285
              },
              {
                "x": 12,
                "y": 285
              }
            ]
          }
        }
      ]
    }
  ]
}

Go

Antes de testar este exemplo, siga as instruções de configuração do Go no Guia de início rápido do Vision: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Vision Go.

Para autenticar no Vision, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.


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

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

	fileBytes, err := os.ReadFile(file)
	if err != nil {
		return err
	}

	image := &visionpb.Image{
		Content: fileBytes,
	}

	feature := &visionpb.Feature{
		Type:       visionpb.Feature_LOGO_DETECTION,
		MaxResults: 10,
	}

	request := &visionpb.BatchAnnotateImagesRequest{
		Requests: []*visionpb.AnnotateImageRequest{
			{
				Image:    image,
				Features: []*visionpb.Feature{feature},
			},
		},
	}

	response, err := client.BatchAnnotateImages(ctx, request)
	if err != nil {
		return err
	}

	for _, resp := range response.Responses {
		if resp.Error != nil {
			fmt.Fprintf(w, "Error: %v\n", resp.Error)
			continue
		}
		if len(resp.LogoAnnotations) == 0 {
			fmt.Fprintln(w, "No logos found.")
		} else {
			fmt.Fprintln(w, "Logos:")
			for _, annotation := range resp.LogoAnnotations {
				fmt.Fprintln(w, annotation.Description)
			}
		}
	}

	return nil
}

Java

Antes de testar este exemplo, siga as instruções de configuração do Java no Guia de início rápido da API Vision: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Vision para Java.


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 DetectLogos {
  public static void detectLogos() throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String filePath = "path/to/your/image/file.jpg";
    detectLogos(filePath);
  }

  // Detects logos in the specified local image.

  public static void detectLogos(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.LOGO_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.getLogoAnnotationsList()) {
          System.out.println(annotation.getDescription());
        }
      }
    }
  }
}

Node.js

Antes de testar este exemplo, siga as instruções de configuração do Node.js no guia de início rápido do Vision: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Vision Node.js.

Para autenticar no Vision, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

const vision = require('@google-cloud/vision');
const fs = require('fs');

// 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';

const imageBuffer = fs.readFileSync(fileName);
const base64Image = imageBuffer.toString('base64');

const request = {
  requests: [
    {
      image: {
        content: base64Image,
      },
      features: [
        {
          type: 'LOGO_DETECTION',
        },
      ],
    },
  ],
};

// Performs logo detection on the local file
const [response] = await client.batchAnnotateImages(request);

response.responses.forEach(res => {
  if (res.logoAnnotations) {
    console.log('Logos:');
    res.logoAnnotations.forEach(logo => console.log(logo));
  }

  if (res.error) {
    console.error(` - Error: ${res.error.message}`);
  }
});

Python

Antes de testar este exemplo, siga as instruções de configuração do Python no guia de início rápido do Vision: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Vision Python.

Para autenticar no Vision, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

def detect_logos(path):
    """Detects logos in the file."""
    from google.cloud import vision

    client = vision.ImageAnnotatorClient()

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

    image = vision.Image(content=content)

    request = {
        "image": image,
        "features": [{"type_": vision.Feature.Type.LOGO_DETECTION}],
    }

    response = client.annotate_image(request=request)
    logos = response.logo_annotations
    print("Logos:")

    for logo in logos:
        print(logo.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)
        )

Outras linguagens

C#: siga as instruções de configuração do C# na página das bibliotecas de cliente e acesse a documentação de referência do Vision para .NET.

PHP: siga as instruções de configuração do PHP na página das bibliotecas de cliente e acesse a documentação de referência do Vision para PHP.

Ruby: siga as instruções de configuração do Ruby na página das bibliotecas de cliente e visite adocumentação de referência do Vision para Ruby.

Detectar logotipos em uma imagem remota

Use a API Vision para realizar a detecção de recursos em um arquivo de imagem localizado no Cloud Storage ou na Web. Para enviar uma solicitação de arquivo remoto, especifique o URL da Web do arquivo ou o URI do Cloud Storage no corpo da solicitação.

REST

Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

  • CLOUD_STORAGE_IMAGE_URI: o caminho para um arquivo de imagem válido em um bucket do Cloud Storage. Você precisa ter, pelo menos, privilégios de leitura para o arquivo. Exemplo:
    • gs://cloud-samples-data/vision/logo/google_logo.jpg
  • PROJECT_ID: o ID do projeto do Google Cloud .

Método HTTP e URL:

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

Corpo JSON da solicitação:

{
  "requests": [
    {
      "image": {
        "source": {
          "gcsImageUri": "CLOUD_STORAGE_IMAGE_URI"
        }
      },
      "features": [
        {
          "type": "LOGO_DETECTION"
        },
      ]
    }
  ]
}

Para enviar a solicitação, escolha uma destas opções:

curl

Salve o corpo da solicitação em um arquivo com o nome request.json e execute o comando abaixo:

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

PowerShell

Salve o corpo da solicitação em um arquivo com o nome request.json e execute o comando a seguir:

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred"; "x-goog-user-project" = "PROJECT_ID" }

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

Quando a solicitação é bem-sucedida, o servidor retorna um código de status HTTP 200 OK e a resposta no formato JSON.

Resposta:

{
  "responses": [
    {
      "logoAnnotations": [
        {
          "mid": "/m/045c7b",
          "description": "google",
          "score": 0.980325,
          "boundingPoly": {
            "vertices": [
              {
                "x": 12,
                "y": 42
              },
              {
                "x": 439,
                "y": 42
              },
              {
                "x": 439,
                "y": 285
              },
              {
                "x": 12,
                "y": 285
              }
            ]
          }
        }
      ]
    }
  ]
}

Go

Antes de testar este exemplo, siga as instruções de configuração do Go no Guia de início rápido do Vision: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Vision Go.

Para autenticar no Vision, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.


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

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

	image := &visionpb.Image{
		Source: &visionpb.ImageSource{
			// Use GcsImageUri for gs:// links
			// Use ImageUri for public https:// links
			GcsImageUri: file,
		},
	}

	feature := &visionpb.Feature{
		Type:       visionpb.Feature_LOGO_DETECTION,
		MaxResults: 10,
	}

	request := &visionpb.BatchAnnotateImagesRequest{
		Requests: []*visionpb.AnnotateImageRequest{
			{
				Image:    image,
				Features: []*visionpb.Feature{feature},
			},
		},
	}

	response, err := client.BatchAnnotateImages(ctx, request)
	if err != nil {
		return err
	}

	for _, resp := range response.Responses {
		if resp.Error != nil {
			fmt.Fprintf(w, "Error: %v\n", resp.Error)
			continue
		}
		if len(resp.LogoAnnotations) == 0 {
			fmt.Fprintln(w, "No logos found.")
		} else {
			fmt.Fprintln(w, "Logos:")
			for _, annotation := range resp.LogoAnnotations {
				fmt.Fprintln(w, annotation.Description)
			}
		}
	}

	return nil
}

Java

Antes de testar este exemplo, siga as instruções de configuração do Java no guia de início rápido do Vision: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Vision Java.

Para autenticar no Vision, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.


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 DetectLogosGcs {

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

  // Detects logos in the specified remote image on Google Cloud Storage.
  public static void detectLogosGcs(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.LOGO_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.getLogoAnnotationsList()) {
          System.out.println(annotation.getDescription());
        }
      }
    }
  }
}

Node.js

Antes de testar este exemplo, siga as instruções de configuração do Node.js no guia de início rápido do Vision: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Vision Node.js.

Para autenticar no Vision, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

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';

const request = {
  requests: [
    {
      image: {
        source: {
          imageUri: `gs://${bucketName}/${fileName}`,
        },
      },
      features: [
        {
          type: 'LOGO_DETECTION',
        },
      ],
    },
  ],
};

// Performs logo detection on the gcs file
const [response] = await client.batchAnnotateImages(request);

response.responses.forEach(res => {
  if (res.logoAnnotations) {
    console.log('Logos:');
    res.logoAnnotations.forEach(logo => console.log(logo));
  }

  if (res.error) {
    console.error(` - Error: ${res.error.message}`);
  }
});

Python

Antes de testar este exemplo, siga as instruções de configuração do Python no guia de início rápido do Vision: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Vision Python.

Para autenticar no Vision, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

def detect_logos_uri(uri):
    """Detects logos 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

    request = {
        "image": image,
        "features": [{"type_": vision.Feature.Type.LOGO_DETECTION}],
    }

    response = client.annotate_image(request=request)

    logos = response.logo_annotations
    print("Logos:")

    for logo in logos:
        print(logo.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

Para realizar a detecção de propriedades da imagem, use o comando gcloud ml vision detect-logos, como mostrado no exemplo a seguir:

gcloud ml vision detect-logos gs://cloud-samples-data/vision/logo/google_logo.jpg

Outras linguagens

C#: siga as instruções de configuração do C# na página das bibliotecas de cliente e acesse a documentação de referência do Vision para .NET.

PHP: siga as instruções de configuração do PHP na página das bibliotecas de cliente e acesse a documentação de referência do Vision para PHP.

Ruby: siga as instruções de configuração do Ruby na página das bibliotecas de cliente e visite adocumentação de referência do Vision para Ruby.

Testar

Teste a detecção de logotipos abaixo. É possível usar a imagem já especificada (gs://cloud-samples-data/vision/logo/google_logo.jpg) ou determinar sua própria imagem. Envie a solicitação selecionando Executar.

Logotipo do Google com anotação
Crédito da imagem: Robert Scoble (CC BY 2.0, anotação adicionada).

Corpo da solicitação:

{
  "requests": [
    {
      "features": [
        {
          "type": "LOGO_DETECTION"
        }
      ],
      "image": {
        "source": {
          "imageUri": "gs://cloud-samples-data/vision/logo/google_logo.jpg"
        }
      }
    }
  ]
}