A API Vision pode detetar e extrair vários objetos numa imagem com a Localização de objetos.
A localização de objetos identifica vários objetos numa imagem e
fornece uma LocalizedObjectAnnotation
para cada objeto na imagem. Cada LocalizedObjectAnnotation identifica
informações sobre o objeto, a posição do objeto e os limites retangulares
para a região da imagem que contém o objeto.
A localização de objetos identifica objetos significativos e menos proeminentes numa imagem.
As informações dos objetos são devolvidas apenas em inglês. A API Cloud Translation pode traduzir etiquetas em inglês para vários outros idiomas.
Por exemplo, a API devolve as seguintes informações e dados de localização de limites para os objetos na imagem anterior:
| Nome | mid | Pontuação | Limites |
|---|---|---|---|
| Roda de bicicleta | /m/01bqk0 | 0,89648587 | (0.32076266, 0.78941387), (0.43812272, 0.78941387), (0.43812272, 0.97331065), (0.32076266, 0.97331065) |
| Bicicleta | /m/0199g | 0,886761 | (0,312, 0,6616471), (0,638353, 0,6616471), (0,638353, 0,9705882), (0,312, 0,9705882) |
| Roda de bicicleta | /m/01bqk0 | 0,6345275 | (0.5125398, 0.760708), (0.6256646, 0.760708), (0.6256646, 0.94601655), (0.5125398, 0.94601655) |
| Moldura | /m/06z37_ | 0,6207608 | (0.79177403, 0.16160682), (0.97047985, 0.16160682), (0.97047985, 0.31348917), (0.79177403, 0.31348917) |
| Pneu | /m/0h9mv | 0,55886006 | (0.32076266, 0.78941387), (0.43812272, 0.78941387), (0.43812272, 0.97331065), (0.32076266, 0.97331065) |
| Porta | /m/02dgv | 0,5160098 | (0.77569866, 0.37104446), (0.9412425, 0.37104446), (0.9412425, 0.81507325), (0.77569866, 0.81507325) |
mid contém um identificador gerado pela máquina (MID) correspondente a uma entrada do Google Knowledge Graph. Para obter informações sobre a inspeção de valores mid, consulte a documentação da API Google Knowledge Graph Search.
Pedidos de localização de objetos
Configure o seu Google Cloud projeto e autenticação
Se não tiver criado um Google Cloud projeto, faça-o agora. Expanda esta secção para ver instruções.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Vision API.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles. -
Install the Google Cloud CLI.
-
Configure a CLI gcloud para usar a sua identidade federada.
Para mais informações, consulte o artigo Inicie sessão na CLI gcloud com a sua identidade federada.
-
Para inicializar a CLI gcloud, execute o seguinte comando:
gcloud initDetete objetos numa imagem local
Pode usar a API Vision para realizar a deteção de caraterísticas num ficheiro de imagem local.
Para pedidos REST, envie o conteúdo do ficheiro de imagem como uma string codificada em base64 no corpo do pedido.
Para pedidos da
gcloude da biblioteca de cliente, especifique o caminho para uma imagem local no seu pedido.REST
Antes de usar qualquer um dos dados do pedido, faça as seguintes substituições:
- BASE64_ENCODED_IMAGE: a representação base64 (string ASCII) dos dados da imagem binária. Esta string deve ser semelhante à
seguinte string:
/9j/4QAYRXhpZgAA...9tAVx/zDQDlGxn//2Q==
- RESULTS_INT: (Opcional) Um valor inteiro de resultados a
devolver. Se omitir o campo
"maxResults"e o respetivo valor, a API devolve o valor predefinido de 10 resultados. Este campo não se aplica aos seguintes tipos de elementos:TEXT_DETECTION,DOCUMENT_TEXT_DETECTIONouCROP_HINTS. - PROJECT_ID: o ID do seu Google Cloud projeto.
Método HTTP e URL:
POST https://vision.googleapis.com/v1/images:annotate
Corpo JSON do pedido:
{ "requests": [ { "image": { "content": "BASE64_ENCODED_IMAGE" }, "features": [ { "maxResults": RESULTS_INT, "type": "OBJECT_LOCALIZATION" }, ] } ] }Para enviar o seu pedido, escolha uma destas opções:
curl
Guarde o corpo do pedido num ficheiro com o nome
request.json, e execute o seguinte comando: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
Guarde o corpo do pedido num ficheiro com o nome
request.json, e execute o seguinte comando:$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 ContentSe o pedido for bem-sucedido, o servidor devolve um código de estado HTTP
200 OKe a resposta no formato JSON.Resposta:
Resposta
{ "responses": [ { "localizedObjectAnnotations": [ { "mid": "/m/01bqk0", "name": "Bicycle wheel", "score": 0.89648587, "boundingPoly": { "normalizedVertices": [ { "x": 0.32076266, "y": 0.78941387 }, { "x": 0.43812272, "y": 0.78941387 }, { "x": 0.43812272, "y": 0.97331065 }, { "x": 0.32076266, "y": 0.97331065 } ] } }, { "mid": "/m/0199g", "name": "Bicycle", "score": 0.886761, "boundingPoly": { "normalizedVertices": [ { "x": 0.312, "y": 0.6616471 }, { "x": 0.638353, "y": 0.6616471 }, { "x": 0.638353, "y": 0.9705882 }, { "x": 0.312, "y": 0.9705882 } ] } }, { "mid": "/m/01bqk0", "name": "Bicycle wheel", "score": 0.6345275, "boundingPoly": { "normalizedVertices": [ { "x": 0.5125398, "y": 0.760708 }, { "x": 0.6256646, "y": 0.760708 }, { "x": 0.6256646, "y": 0.94601655 }, { "x": 0.5125398, "y": 0.94601655 } ] } }, { "mid": "/m/06z37_", "name": "Picture frame", "score": 0.6207608, "boundingPoly": { "normalizedVertices": [ { "x": 0.79177403, "y": 0.16160682 }, { "x": 0.97047985, "y": 0.16160682 }, { "x": 0.97047985, "y": 0.31348917 }, { "x": 0.79177403, "y": 0.31348917 } ] } }, { "mid": "/m/0h9mv", "name": "Tire", "score": 0.55886006, "boundingPoly": { "normalizedVertices": [ { "x": 0.32076266, "y": 0.78941387 }, { "x": 0.43812272, "y": 0.78941387 }, { "x": 0.43812272, "y": 0.97331065 }, { "x": 0.32076266, "y": 0.97331065 } ] } }, { "mid": "/m/02dgv", "name": "Door", "score": 0.5160098, "boundingPoly": { "normalizedVertices": [ { "x": 0.77569866, "y": 0.37104446 }, { "x": 0.9412425, "y": 0.37104446 }, { "x": 0.9412425, "y": 0.81507325 }, { "x": 0.77569866, "y": 0.81507325 } ] } } ] } ] }Go
Antes de experimentar este exemplo, siga as Goinstruções de configuração no início rápido do Vision usando bibliotecas cliente. Para mais informações, consulte a documentação de referência da API GoVision.
Para se autenticar no Vision, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
// localizeObjects gets objects and bounding boxes from the Vision API for an image at the given file path. func localizeObjects(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.LocalizeObjects(ctx, image, nil) if err != nil { return err } if len(annotations) == 0 { fmt.Fprintln(w, "No objects found.") return nil } fmt.Fprintln(w, "Objects:") for _, annotation := range annotations { fmt.Fprintln(w, annotation.Name) fmt.Fprintln(w, annotation.Score) for _, v := range annotation.BoundingPoly.NormalizedVertices { fmt.Fprintf(w, "(%f,%f)\n", v.X, v.Y) } } return nil }Java
Antes de experimentar este exemplo, siga as instruções de configuração do Java no guia de início rápido da API Vision com bibliotecas cliente. Para mais informações, consulte a documentação de referência da API Vision Java.
/** * Detects localized objects in the specified local image. * * @param filePath The path to the file to perform localized object detection on. * @throws Exception on errors while closing the client. * @throws IOException on Input/Output errors. */ public static void detectLocalizedObjects(String filePath) throws IOException { List<AnnotateImageRequest> requests = new ArrayList<>(); ByteString imgBytes = ByteString.readFrom(new FileInputStream(filePath)); Image img = Image.newBuilder().setContent(imgBytes).build(); AnnotateImageRequest request = AnnotateImageRequest.newBuilder() .addFeatures(Feature.newBuilder().setType(Type.OBJECT_LOCALIZATION)) .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()) { // Perform the request BatchAnnotateImagesResponse response = client.batchAnnotateImages(requests); List<AnnotateImageResponse> responses = response.getResponsesList(); // Display the results for (AnnotateImageResponse res : responses) { for (LocalizedObjectAnnotation entity : res.getLocalizedObjectAnnotationsList()) { System.out.format("Object name: %s%n", entity.getName()); System.out.format("Confidence: %s%n", entity.getScore()); System.out.format("Normalized Vertices:%n"); entity .getBoundingPoly() .getNormalizedVerticesList() .forEach(vertex -> System.out.format("- (%s, %s)%n", vertex.getX(), vertex.getY())); } } } }Node.js
Antes de experimentar este exemplo, siga as Node.jsinstruções de configuração no início rápido do Vision usando bibliotecas cliente. Para mais informações, consulte a documentação de referência da API Node.jsVision.
Para se autenticar no Vision, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
// Imports the Google Cloud client libraries 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 = `/path/to/localImage.png`; const request = { image: {content: fs.readFileSync(fileName)}, }; const [result] = await client.objectLocalization(request); const objects = result.localizedObjectAnnotations; objects.forEach(object => { console.log(`Name: ${object.name}`); console.log(`Confidence: ${object.score}`); const vertices = object.boundingPoly.normalizedVertices; vertices.forEach(v => console.log(`x: ${v.x}, y:${v.y}`)); });Python
Antes de experimentar este exemplo, siga as Pythoninstruções de configuração no início rápido do Vision usando bibliotecas cliente. Para mais informações, consulte a documentação de referência da API PythonVision.
Para se autenticar no Vision, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
def localize_objects(path): """Localize objects in the local image. Args: path: The path to the local 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) objects = client.object_localization(image=image).localized_object_annotations print(f"Number of objects found: {len(objects)}") for object_ in objects: print(f"\n{object_.name} (confidence: {object_.score})") print("Normalized bounding polygon vertices: ") for vertex in object_.bounding_poly.normalized_vertices: print(f" - ({vertex.x}, {vertex.y})")Idiomas adicionais
C#: Siga as instruções de configuração do C# na página das bibliotecas cliente e, em seguida, visite 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 cliente e, em seguida, visite 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, em seguida, visite a documentação de referência do Vision para Ruby.
Detete objetos numa imagem remota
Pode usar a API Vision para realizar a deteção de funcionalidades num ficheiro de imagem remoto localizado no Cloud Storage ou na Web. Para enviar um pedido de ficheiro remoto, especifique o URL da Web do ficheiro ou o URI do Cloud Storage no corpo do pedido.
REST
Antes de usar qualquer um dos dados do pedido, faça as seguintes substituições:
- CLOUD_STORAGE_IMAGE_URI: o caminho para um ficheiro de imagem válido num contentor do Cloud Storage. Tem de ter, pelo menos, privilégios de leitura para o ficheiro.
Exemplo:
https://cloud.google.com/vision/docs/images/bicycle_example.png
- RESULTS_INT: (Opcional) Um valor inteiro de resultados a
devolver. Se omitir o campo
"maxResults"e o respetivo valor, a API devolve o valor predefinido de 10 resultados. Este campo não se aplica aos seguintes tipos de elementos:TEXT_DETECTION,DOCUMENT_TEXT_DETECTIONouCROP_HINTS. - PROJECT_ID: o ID do seu Google Cloud projeto.
Método HTTP e URL:
POST https://vision.googleapis.com/v1/images:annotate
Corpo JSON do pedido:
{ "requests": [ { "image": { "source": { "imageUri": "CLOUD_STORAGE_IMAGE_URI" } }, "features": [ { "maxResults": RESULTS_INT, "type": "OBJECT_LOCALIZATION" }, ] } ] }Para enviar o seu pedido, escolha uma destas opções:
curl
Guarde o corpo do pedido num ficheiro com o nome
request.json, e execute o seguinte comando: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
Guarde o corpo do pedido num ficheiro com o nome
request.json, e execute o seguinte comando:$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 ContentSe o pedido for bem-sucedido, o servidor devolve um código de estado HTTP
200 OKe a resposta no formato JSON.Resposta:
Resposta
{ "responses": [ { "localizedObjectAnnotations": [ { "mid": "/m/01bqk0", "name": "Bicycle wheel", "score": 0.89648587, "boundingPoly": { "normalizedVertices": [ { "x": 0.32076266, "y": 0.78941387 }, { "x": 0.43812272, "y": 0.78941387 }, { "x": 0.43812272, "y": 0.97331065 }, { "x": 0.32076266, "y": 0.97331065 } ] } }, { "mid": "/m/0199g", "name": "Bicycle", "score": 0.886761, "boundingPoly": { "normalizedVertices": [ { "x": 0.312, "y": 0.6616471 }, { "x": 0.638353, "y": 0.6616471 }, { "x": 0.638353, "y": 0.9705882 }, { "x": 0.312, "y": 0.9705882 } ] } }, { "mid": "/m/01bqk0", "name": "Bicycle wheel", "score": 0.6345275, "boundingPoly": { "normalizedVertices": [ { "x": 0.5125398, "y": 0.760708 }, { "x": 0.6256646, "y": 0.760708 }, { "x": 0.6256646, "y": 0.94601655 }, { "x": 0.5125398, "y": 0.94601655 } ] } }, { "mid": "/m/06z37_", "name": "Picture frame", "score": 0.6207608, "boundingPoly": { "normalizedVertices": [ { "x": 0.79177403, "y": 0.16160682 }, { "x": 0.97047985, "y": 0.16160682 }, { "x": 0.97047985, "y": 0.31348917 }, { "x": 0.79177403, "y": 0.31348917 } ] } }, { "mid": "/m/0h9mv", "name": "Tire", "score": 0.55886006, "boundingPoly": { "normalizedVertices": [ { "x": 0.32076266, "y": 0.78941387 }, { "x": 0.43812272, "y": 0.78941387 }, { "x": 0.43812272, "y": 0.97331065 }, { "x": 0.32076266, "y": 0.97331065 } ] } }, { "mid": "/m/02dgv", "name": "Door", "score": 0.5160098, "boundingPoly": { "normalizedVertices": [ { "x": 0.77569866, "y": 0.37104446 }, { "x": 0.9412425, "y": 0.37104446 }, { "x": 0.9412425, "y": 0.81507325 }, { "x": 0.77569866, "y": 0.81507325 } ] } } ] } ] }Go
Antes de experimentar este exemplo, siga as Goinstruções de configuração no início rápido do Vision usando bibliotecas cliente. Para mais informações, consulte a documentação de referência da API GoVision.
Para se autenticar no Vision, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
// localizeObjects gets objects and bounding boxes from the Vision API for an image at the given file path. func localizeObjectsURI(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.LocalizeObjects(ctx, image, nil) if err != nil { return err } if len(annotations) == 0 { fmt.Fprintln(w, "No objects found.") return nil } fmt.Fprintln(w, "Objects:") for _, annotation := range annotations { fmt.Fprintln(w, annotation.Name) fmt.Fprintln(w, annotation.Score) for _, v := range annotation.BoundingPoly.NormalizedVertices { fmt.Fprintf(w, "(%f,%f)\n", v.X, v.Y) } } return nil }Java
Antes de experimentar este exemplo, siga as instruções de configuração do Java no guia de início rápido da API Vision com bibliotecas cliente. Para mais informações, consulte a documentação de referência da API Vision Java.
/** * Detects localized objects in a remote image on Google Cloud Storage. * * @param gcsPath The path to the remote file on Google Cloud Storage to detect localized objects * on. * @throws Exception on errors while closing the client. * @throws IOException on Input/Output errors. */ public static void detectLocalizedObjectsGcs(String gcsPath) throws IOException { List<AnnotateImageRequest> requests = new ArrayList<>(); ImageSource imgSource = ImageSource.newBuilder().setGcsImageUri(gcsPath).build(); Image img = Image.newBuilder().setSource(imgSource).build(); AnnotateImageRequest request = AnnotateImageRequest.newBuilder() .addFeatures(Feature.newBuilder().setType(Type.OBJECT_LOCALIZATION)) .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()) { // Perform the request BatchAnnotateImagesResponse response = client.batchAnnotateImages(requests); List<AnnotateImageResponse> responses = response.getResponsesList(); client.close(); // Display the results for (AnnotateImageResponse res : responses) { for (LocalizedObjectAnnotation entity : res.getLocalizedObjectAnnotationsList()) { System.out.format("Object name: %s%n", entity.getName()); System.out.format("Confidence: %s%n", entity.getScore()); System.out.format("Normalized Vertices:%n"); entity .getBoundingPoly() .getNormalizedVerticesList() .forEach(vertex -> System.out.format("- (%s, %s)%n", vertex.getX(), vertex.getY())); } } } }Node.js
Antes de experimentar este exemplo, siga as Node.jsinstruções de configuração no início rápido do Vision usando bibliotecas cliente. Para mais informações, consulte a documentação de referência da API Node.jsVision.
Para se autenticar no Vision, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
// 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 line before running the sample. */ // const gcsUri = `gs://bucket/bucketImage.png`; const [result] = await client.objectLocalization(gcsUri); const objects = result.localizedObjectAnnotations; objects.forEach(object => { console.log(`Name: ${object.name}`); console.log(`Confidence: ${object.score}`); const veritices = object.boundingPoly.normalizedVertices; veritices.forEach(v => console.log(`x: ${v.x}, y:${v.y}`)); });Python
Antes de experimentar este exemplo, siga as Pythoninstruções de configuração no início rápido do Vision usando bibliotecas cliente. Para mais informações, consulte a documentação de referência da API PythonVision.
Para se autenticar no Vision, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento local.
def localize_objects_uri(uri): """Localize objects in the image on Google Cloud Storage Args: uri: The path to the file in Google Cloud Storage (gs://...) """ from google.cloud import vision client = vision.ImageAnnotatorClient() image = vision.Image() image.source.image_uri = uri objects = client.object_localization(image=image).localized_object_annotations print(f"Number of objects found: {len(objects)}") for object_ in objects: print(f"\n{object_.name} (confidence: {object_.score})") print("Normalized bounding polygon vertices: ") for vertex in object_.bounding_poly.normalized_vertices: print(f" - ({vertex.x}, {vertex.y})")gcloud
Para detetar etiquetas numa imagem, use o comando
gcloud ml vision detect-objects, conforme mostrado no exemplo seguinte:gcloud ml vision detect-objects https://cloud.google.com/vision/docs/images/bicycle_example.png
Idiomas adicionais
C#: Siga as instruções de configuração do C# na página das bibliotecas cliente e, em seguida, visite 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 cliente e, em seguida, visite 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, em seguida, visite a documentação de referência do Vision para Ruby.
Experimentar
Experimente a deteção e a localização de objetos com a seguinte ferramenta. Pode usar a imagem já especificada (
https://cloud.google.com/vision/docs/images/bicycle_example.png) ou especificar a sua própria imagem em alternativa. Envie o pedido selecionando Executar.
Créditos da imagem: Bogdan Dada no Unsplash. Corpo do pedido:
{ "requests": [ { "features": [ { "maxResults": 10, "type": "OBJECT_LOCALIZATION" } ], "image": { "source": { "imageUri": "https://cloud.google.com/vision/docs/images/bicycle_example.png" } } } ] } - BASE64_ENCODED_IMAGE: a representação base64 (string ASCII) dos dados da imagem binária. Esta string deve ser semelhante à
seguinte string: