vision/snippets/detect/detect.py (735 lines of code) (raw):
#!/usr/bin/env python
# Copyright 2017 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""This application demonstrates how to perform basic operations with the
Google Cloud Vision API.
Example Usage:
python detect.py text ./resources/wakeupcat.jpg
python detect.py labels ./resources/landmark.jpg
python detect.py web ./resources/landmark.jpg
python detect.py web-uri http://wheresgus.com/dog.JPG
python detect.py web-geo ./resources/city.jpg
python detect.py faces-uri gs://your-bucket/file.jpg
python detect.py ocr-uri gs://python-docs-samples-tests/HodgeConj.pdf \
gs://BUCKET_NAME/PREFIX/
python detect.py object-localization ./resources/puppies.jpg
python detect.py object-localization-uri gs://...
For more information, the documentation at
https://cloud.google.com/vision/docs.
"""
import argparse
# [START vision_face_detection]
def detect_faces(path):
"""Detects faces in an image."""
from google.cloud import vision
client = vision.ImageAnnotatorClient()
# [START vision_python_migration_face_detection]
# [START vision_python_migration_image_file]
with open(path, "rb") as image_file:
content = image_file.read()
image = vision.Image(content=content)
# [END vision_python_migration_image_file]
response = client.face_detection(image=image)
faces = response.face_annotations
# Names of likelihood from google.cloud.vision.enums
likelihood_name = (
"UNKNOWN",
"VERY_UNLIKELY",
"UNLIKELY",
"POSSIBLE",
"LIKELY",
"VERY_LIKELY",
)
print("Faces:")
for face in faces:
print(f"anger: {likelihood_name[face.anger_likelihood]}")
print(f"joy: {likelihood_name[face.joy_likelihood]}")
print(f"surprise: {likelihood_name[face.surprise_likelihood]}")
vertices = [
f"({vertex.x},{vertex.y})" for vertex in face.bounding_poly.vertices
]
print("face bounds: {}".format(",".join(vertices)))
if response.error.message:
raise Exception(
"{}\nFor more info on error messages, check: "
"https://cloud.google.com/apis/design/errors".format(response.error.message)
)
# [END vision_python_migration_face_detection]
# [END vision_face_detection]
# [START vision_face_detection_gcs]
def detect_faces_uri(uri):
"""Detects faces in the file located in Google Cloud Storage or the web."""
from google.cloud import vision
client = vision.ImageAnnotatorClient()
# [START vision_python_migration_image_uri]
image = vision.Image()
image.source.image_uri = uri
# [END vision_python_migration_image_uri]
response = client.face_detection(image=image)
faces = response.face_annotations
# Names of likelihood from google.cloud.vision.enums
likelihood_name = (
"UNKNOWN",
"VERY_UNLIKELY",
"UNLIKELY",
"POSSIBLE",
"LIKELY",
"VERY_LIKELY",
)
print("Faces:")
for face in faces:
print(f"anger: {likelihood_name[face.anger_likelihood]}")
print(f"joy: {likelihood_name[face.joy_likelihood]}")
print(f"surprise: {likelihood_name[face.surprise_likelihood]}")
vertices = [
f"({vertex.x},{vertex.y})" for vertex in face.bounding_poly.vertices
]
print("face bounds: {}".format(",".join(vertices)))
if response.error.message:
raise Exception(
"{}\nFor more info on error messages, check: "
"https://cloud.google.com/apis/design/errors".format(response.error.message)
)
# [END vision_face_detection_gcs]
# [START vision_label_detection]
def detect_labels(path):
"""Detects labels in the file."""
from google.cloud import vision
client = vision.ImageAnnotatorClient()
# [START vision_python_migration_label_detection]
with 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)
)
# [END vision_python_migration_label_detection]
# [END vision_label_detection]
# [START vision_label_detection_gcs]
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)
)
# [END vision_label_detection_gcs]
# [START vision_landmark_detection]
def detect_landmarks(path):
"""Detects landmarks in the file."""
from google.cloud import vision
client = vision.ImageAnnotatorClient()
# [START vision_python_migration_landmark_detection]
with open(path, "rb") as image_file:
content = image_file.read()
image = vision.Image(content=content)
response = client.landmark_detection(image=image)
landmarks = response.landmark_annotations
print("Landmarks:")
for landmark in landmarks:
print(landmark.description)
for location in landmark.locations:
lat_lng = location.lat_lng
print(f"Latitude {lat_lng.latitude}")
print(f"Longitude {lat_lng.longitude}")
if response.error.message:
raise Exception(
"{}\nFor more info on error messages, check: "
"https://cloud.google.com/apis/design/errors".format(response.error.message)
)
# [END vision_python_migration_landmark_detection]
# [END vision_landmark_detection]
# [START vision_landmark_detection_gcs]
def detect_landmarks_uri(uri):
"""Detects landmarks 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.landmark_detection(image=image)
landmarks = response.landmark_annotations
print("Landmarks:")
for landmark in landmarks:
print(landmark.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)
)
# [END vision_landmark_detection_gcs]
# [START vision_logo_detection]
def detect_logos(path):
"""Detects logos in the file."""
from google.cloud import vision
client = vision.ImageAnnotatorClient()
# [START vision_python_migration_logo_detection]
with open(path, "rb") as image_file:
content = image_file.read()
image = vision.Image(content=content)
response = client.logo_detection(image=image)
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)
)
# [END vision_python_migration_logo_detection]
# [END vision_logo_detection]
# [START vision_logo_detection_gcs]
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
response = client.logo_detection(image=image)
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)
)
# [END vision_logo_detection_gcs]
# [START vision_safe_search_detection]
def detect_safe_search(path):
"""Detects unsafe features in the file."""
from google.cloud import vision
client = vision.ImageAnnotatorClient()
# [START vision_python_migration_safe_search_detection]
with open(path, "rb") as image_file:
content = image_file.read()
image = vision.Image(content=content)
response = client.safe_search_detection(image=image)
safe = response.safe_search_annotation
# Names of likelihood from google.cloud.vision.enums
likelihood_name = (
"UNKNOWN",
"VERY_UNLIKELY",
"UNLIKELY",
"POSSIBLE",
"LIKELY",
"VERY_LIKELY",
)
print("Safe search:")
print(f"adult: {likelihood_name[safe.adult]}")
print(f"medical: {likelihood_name[safe.medical]}")
print(f"spoofed: {likelihood_name[safe.spoof]}")
print(f"violence: {likelihood_name[safe.violence]}")
print(f"racy: {likelihood_name[safe.racy]}")
if response.error.message:
raise Exception(
"{}\nFor more info on error messages, check: "
"https://cloud.google.com/apis/design/errors".format(response.error.message)
)
# [END vision_python_migration_safe_search_detection]
# [END vision_safe_search_detection]
# [START vision_safe_search_detection_gcs]
def detect_safe_search_uri(uri):
"""Detects unsafe features 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.safe_search_detection(image=image)
safe = response.safe_search_annotation
# Names of likelihood from google.cloud.vision.enums
likelihood_name = (
"UNKNOWN",
"VERY_UNLIKELY",
"UNLIKELY",
"POSSIBLE",
"LIKELY",
"VERY_LIKELY",
)
print("Safe search:")
print(f"adult: {likelihood_name[safe.adult]}")
print(f"medical: {likelihood_name[safe.medical]}")
print(f"spoofed: {likelihood_name[safe.spoof]}")
print(f"violence: {likelihood_name[safe.violence]}")
print(f"racy: {likelihood_name[safe.racy]}")
if response.error.message:
raise Exception(
"{}\nFor more info on error messages, check: "
"https://cloud.google.com/apis/design/errors".format(response.error.message)
)
# [END vision_safe_search_detection_gcs]
# [START vision_text_detection]
def detect_text(path):
"""Detects text in the file."""
from google.cloud import vision
client = vision.ImageAnnotatorClient()
# [START vision_python_migration_text_detection]
with open(path, "rb") as image_file:
content = image_file.read()
image = vision.Image(content=content)
response = client.text_detection(image=image)
texts = response.text_annotations
print("Texts:")
for text in texts:
print(f'\n"{text.description}"')
vertices = [
f"({vertex.x},{vertex.y})" for vertex in text.bounding_poly.vertices
]
print("bounds: {}".format(",".join(vertices)))
if response.error.message:
raise Exception(
"{}\nFor more info on error messages, check: "
"https://cloud.google.com/apis/design/errors".format(response.error.message)
)
# [END vision_python_migration_text_detection]
# [END vision_text_detection]
# [START vision_text_detection_gcs]
def detect_text_uri(uri):
"""Detects text 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.text_detection(image=image)
texts = response.text_annotations
print("Texts:")
for text in texts:
print(f'\n"{text.description}"')
vertices = [
f"({vertex.x},{vertex.y})" for vertex in text.bounding_poly.vertices
]
print("bounds: {}".format(",".join(vertices)))
if response.error.message:
raise Exception(
"{}\nFor more info on error messages, check: "
"https://cloud.google.com/apis/design/errors".format(response.error.message)
)
# [END vision_text_detection_gcs]
# [START vision_image_property_detection]
def detect_properties(path):
"""Detects image properties in the file."""
from google.cloud import vision
client = vision.ImageAnnotatorClient()
# [START vision_python_migration_image_properties]
with open(path, "rb") as image_file:
content = image_file.read()
image = vision.Image(content=content)
response = client.image_properties(image=image)
props = response.image_properties_annotation
print("Properties:")
for color in props.dominant_colors.colors:
print(f"fraction: {color.pixel_fraction}")
print(f"\tr: {color.color.red}")
print(f"\tg: {color.color.green}")
print(f"\tb: {color.color.blue}")
print(f"\ta: {color.color.alpha}")
if response.error.message:
raise Exception(
"{}\nFor more info on error messages, check: "
"https://cloud.google.com/apis/design/errors".format(response.error.message)
)
# [END vision_python_migration_image_properties]
# [END vision_image_property_detection]
# [START vision_image_property_detection_gcs]
def detect_properties_uri(uri):
"""Detects image properties 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.image_properties(image=image)
props = response.image_properties_annotation
print("Properties:")
for color in props.dominant_colors.colors:
print(f"frac: {color.pixel_fraction}")
print(f"\tr: {color.color.red}")
print(f"\tg: {color.color.green}")
print(f"\tb: {color.color.blue}")
print(f"\ta: {color.color.alpha}")
if response.error.message:
raise Exception(
"{}\nFor more info on error messages, check: "
"https://cloud.google.com/apis/design/errors".format(response.error.message)
)
# [END vision_image_property_detection_gcs]
# [START vision_web_detection]
def detect_web(path):
"""Detects web annotations given an image."""
from google.cloud import vision
client = vision.ImageAnnotatorClient()
# [START vision_python_migration_web_detection]
with open(path, "rb") as image_file:
content = image_file.read()
image = vision.Image(content=content)
response = client.web_detection(image=image)
annotations = response.web_detection
if annotations.best_guess_labels:
for label in annotations.best_guess_labels:
print(f"\nBest guess label: {label.label}")
if annotations.pages_with_matching_images:
print(
"\n{} Pages with matching images found:".format(
len(annotations.pages_with_matching_images)
)
)
for page in annotations.pages_with_matching_images:
print(f"\n\tPage url : {page.url}")
if page.full_matching_images:
print(
"\t{} Full Matches found: ".format(len(page.full_matching_images))
)
for image in page.full_matching_images:
print(f"\t\tImage url : {image.url}")
if page.partial_matching_images:
print(
"\t{} Partial Matches found: ".format(
len(page.partial_matching_images)
)
)
for image in page.partial_matching_images:
print(f"\t\tImage url : {image.url}")
if annotations.web_entities:
print("\n{} Web entities found: ".format(len(annotations.web_entities)))
for entity in annotations.web_entities:
print(f"\n\tScore : {entity.score}")
print(f"\tDescription: {entity.description}")
if annotations.visually_similar_images:
print(
"\n{} visually similar images found:\n".format(
len(annotations.visually_similar_images)
)
)
for image in annotations.visually_similar_images:
print(f"\tImage url : {image.url}")
if response.error.message:
raise Exception(
"{}\nFor more info on error messages, check: "
"https://cloud.google.com/apis/design/errors".format(response.error.message)
)
# [END vision_python_migration_web_detection]
# [END vision_web_detection]
# [START vision_web_detection_gcs]
def detect_web_uri(uri):
"""Detects web annotations in the file located in Google Cloud Storage."""
from google.cloud import vision
client = vision.ImageAnnotatorClient()
image = vision.Image()
image.source.image_uri = uri
response = client.web_detection(image=image)
annotations = response.web_detection
if annotations.best_guess_labels:
for label in annotations.best_guess_labels:
print(f"\nBest guess label: {label.label}")
if annotations.pages_with_matching_images:
print(
"\n{} Pages with matching images found:".format(
len(annotations.pages_with_matching_images)
)
)
for page in annotations.pages_with_matching_images:
print(f"\n\tPage url : {page.url}")
if page.full_matching_images:
print(
"\t{} Full Matches found: ".format(len(page.full_matching_images))
)
for image in page.full_matching_images:
print(f"\t\tImage url : {image.url}")
if page.partial_matching_images:
print(
"\t{} Partial Matches found: ".format(
len(page.partial_matching_images)
)
)
for image in page.partial_matching_images:
print(f"\t\tImage url : {image.url}")
if annotations.web_entities:
print("\n{} Web entities found: ".format(len(annotations.web_entities)))
for entity in annotations.web_entities:
print(f"\n\tScore : {entity.score}")
print(f"\tDescription: {entity.description}")
if annotations.visually_similar_images:
print(
"\n{} visually similar images found:\n".format(
len(annotations.visually_similar_images)
)
)
for image in annotations.visually_similar_images:
print(f"\tImage url : {image.url}")
if response.error.message:
raise Exception(
"{}\nFor more info on error messages, check: "
"https://cloud.google.com/apis/design/errors".format(response.error.message)
)
# [END vision_web_detection_gcs]
# [START vision_web_detection_include_geo]
def web_entities_include_geo_results(path):
"""Detects web annotations given an image, using the geotag metadata
in the image to detect web entities."""
from google.cloud import vision
client = vision.ImageAnnotatorClient()
with open(path, "rb") as image_file:
content = image_file.read()
image = vision.Image(content=content)
web_detection_params = vision.WebDetectionParams(include_geo_results=True)
image_context = vision.ImageContext(web_detection_params=web_detection_params)
response = client.web_detection(image=image, image_context=image_context)
for entity in response.web_detection.web_entities:
print(f"\n\tScore : {entity.score}")
print(f"\tDescription: {entity.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)
)
# [END vision_web_detection_include_geo]
# [START vision_web_detection_include_geo_gcs]
def web_entities_include_geo_results_uri(uri):
"""Detects web annotations given an image in the file located in
Google Cloud Storage., using the geotag metadata in the image to
detect web entities."""
from google.cloud import vision
client = vision.ImageAnnotatorClient()
image = vision.Image()
image.source.image_uri = uri
web_detection_params = vision.WebDetectionParams(include_geo_results=True)
image_context = vision.ImageContext(web_detection_params=web_detection_params)
response = client.web_detection(image=image, image_context=image_context)
for entity in response.web_detection.web_entities:
print(f"\n\tScore : {entity.score}")
print(f"\tDescription: {entity.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)
)
# [END vision_web_detection_include_geo_gcs]
# [START vision_crop_hint_detection]
def detect_crop_hints(path):
"""Detects crop hints in an image."""
from google.cloud import vision
client = vision.ImageAnnotatorClient()
# [START vision_python_migration_crop_hints]
with open(path, "rb") as image_file:
content = image_file.read()
image = vision.Image(content=content)
crop_hints_params = vision.CropHintsParams(aspect_ratios=[1.77])
image_context = vision.ImageContext(crop_hints_params=crop_hints_params)
response = client.crop_hints(image=image, image_context=image_context)
hints = response.crop_hints_annotation.crop_hints
for n, hint in enumerate(hints):
print(f"\nCrop Hint: {n}")
vertices = [
f"({vertex.x},{vertex.y})" for vertex in hint.bounding_poly.vertices
]
print("bounds: {}".format(",".join(vertices)))
if response.error.message:
raise Exception(
"{}\nFor more info on error messages, check: "
"https://cloud.google.com/apis/design/errors".format(response.error.message)
)
# [END vision_python_migration_crop_hints]
# [END vision_crop_hint_detection]
# [START vision_crop_hint_detection_gcs]
def detect_crop_hints_uri(uri):
"""Detects crop hints in the file located in Google Cloud Storage."""
from google.cloud import vision
client = vision.ImageAnnotatorClient()
image = vision.Image()
image.source.image_uri = uri
crop_hints_params = vision.CropHintsParams(aspect_ratios=[1.77])
image_context = vision.ImageContext(crop_hints_params=crop_hints_params)
response = client.crop_hints(image=image, image_context=image_context)
hints = response.crop_hints_annotation.crop_hints
for n, hint in enumerate(hints):
print(f"\nCrop Hint: {n}")
vertices = [
f"({vertex.x},{vertex.y})" for vertex in hint.bounding_poly.vertices
]
print("bounds: {}".format(",".join(vertices)))
if response.error.message:
raise Exception(
"{}\nFor more info on error messages, check: "
"https://cloud.google.com/apis/design/errors".format(response.error.message)
)
# [END vision_crop_hint_detection_gcs]
# [START vision_fulltext_detection]
def detect_document(path):
"""Detects document features in an image."""
from google.cloud import vision
client = vision.ImageAnnotatorClient()
# [START vision_python_migration_document_text_detection]
with open(path, "rb") as image_file:
content = image_file.read()
image = vision.Image(content=content)
response = client.document_text_detection(image=image)
for page in response.full_text_annotation.pages:
for block in page.blocks:
print(f"\nBlock confidence: {block.confidence}\n")
for paragraph in block.paragraphs:
print("Paragraph confidence: {}".format(paragraph.confidence))
for word in paragraph.words:
word_text = "".join([symbol.text for symbol in word.symbols])
print(
"Word text: {} (confidence: {})".format(
word_text, word.confidence
)
)
for symbol in word.symbols:
print(
"\tSymbol: {} (confidence: {})".format(
symbol.text, symbol.confidence
)
)
if response.error.message:
raise Exception(
"{}\nFor more info on error messages, check: "
"https://cloud.google.com/apis/design/errors".format(response.error.message)
)
# [END vision_python_migration_document_text_detection]
# [END vision_fulltext_detection]
# [START vision_fulltext_detection_gcs]
def detect_document_uri(uri):
"""Detects document features in the file located in Google Cloud
Storage."""
from google.cloud import vision
client = vision.ImageAnnotatorClient()
image = vision.Image()
image.source.image_uri = uri
response = client.document_text_detection(image=image)
for page in response.full_text_annotation.pages:
for block in page.blocks:
print(f"\nBlock confidence: {block.confidence}\n")
for paragraph in block.paragraphs:
print("Paragraph confidence: {}".format(paragraph.confidence))
for word in paragraph.words:
word_text = "".join([symbol.text for symbol in word.symbols])
print(
"Word text: {} (confidence: {})".format(
word_text, word.confidence
)
)
for symbol in word.symbols:
print(
"\tSymbol: {} (confidence: {})".format(
symbol.text, symbol.confidence
)
)
if response.error.message:
raise Exception(
"{}\nFor more info on error messages, check: "
"https://cloud.google.com/apis/design/errors".format(response.error.message)
)
# [END vision_fulltext_detection_gcs]
# [START vision_text_detection_pdf_gcs]
def async_detect_document(gcs_source_uri, gcs_destination_uri):
"""OCR with PDF/TIFF as source files on GCS"""
import json
import re
from google.cloud import vision
from google.cloud import storage
# Supported mime_types are: 'application/pdf' and 'image/tiff'
mime_type = "application/pdf"
# How many pages should be grouped into each json output file.
batch_size = 2
client = vision.ImageAnnotatorClient()
feature = vision.Feature(type_=vision.Feature.Type.DOCUMENT_TEXT_DETECTION)
gcs_source = vision.GcsSource(uri=gcs_source_uri)
input_config = vision.InputConfig(gcs_source=gcs_source, mime_type=mime_type)
gcs_destination = vision.GcsDestination(uri=gcs_destination_uri)
output_config = vision.OutputConfig(
gcs_destination=gcs_destination, batch_size=batch_size
)
async_request = vision.AsyncAnnotateFileRequest(
features=[feature], input_config=input_config, output_config=output_config
)
operation = client.async_batch_annotate_files(requests=[async_request])
print("Waiting for the operation to finish.")
operation.result(timeout=420)
# Once the request has completed and the output has been
# written to GCS, we can list all the output files.
storage_client = storage.Client()
match = re.match(r"gs://([^/]+)/(.+)", gcs_destination_uri)
bucket_name = match.group(1)
prefix = match.group(2)
bucket = storage_client.get_bucket(bucket_name)
# List objects with the given prefix, filtering out folders.
blob_list = [
blob
for blob in list(bucket.list_blobs(prefix=prefix))
if not blob.name.endswith("/")
]
print("Output files:")
for blob in blob_list:
print(blob.name)
# Process the first output file from GCS.
# Since we specified batch_size=2, the first response contains
# the first two pages of the input file.
output = blob_list[0]
json_string = output.download_as_bytes().decode("utf-8")
response = json.loads(json_string)
# The actual response for the first page of the input file.
first_page_response = response["responses"][0]
annotation = first_page_response["fullTextAnnotation"]
# Here we print the full text from the first page.
# The response contains more information:
# annotation/pages/blocks/paragraphs/words/symbols
# including confidence scores and bounding boxes
print("Full text:\n")
print(annotation["text"])
# [END vision_text_detection_pdf_gcs]
# [START vision_localize_objects]
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})")
# [END vision_localize_objects]
# [START vision_localize_objects_gcs]
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})")
# [END vision_localize_objects_gcs]
def run_local(args):
if args.command == "faces":
detect_faces(args.path)
elif args.command == "labels":
detect_labels(args.path)
elif args.command == "landmarks":
detect_landmarks(args.path)
elif args.command == "text":
detect_text(args.path)
elif args.command == "logos":
detect_logos(args.path)
elif args.command == "safe-search":
detect_safe_search(args.path)
elif args.command == "properties":
detect_properties(args.path)
elif args.command == "web":
detect_web(args.path)
elif args.command == "crophints":
detect_crop_hints(args.path)
elif args.command == "document":
detect_document(args.path)
elif args.command == "web-geo":
web_entities_include_geo_results(args.path)
elif args.command == "object-localization":
localize_objects(args.path)
def run_uri(args):
if args.command == "text-uri":
detect_text_uri(args.uri)
elif args.command == "faces-uri":
detect_faces_uri(args.uri)
elif args.command == "labels-uri":
detect_labels_uri(args.uri)
elif args.command == "landmarks-uri":
detect_landmarks_uri(args.uri)
elif args.command == "logos-uri":
detect_logos_uri(args.uri)
elif args.command == "safe-search-uri":
detect_safe_search_uri(args.uri)
elif args.command == "properties-uri":
detect_properties_uri(args.uri)
elif args.command == "web-uri":
detect_web_uri(args.uri)
elif args.command == "crophints-uri":
detect_crop_hints_uri(args.uri)
elif args.command == "document-uri":
detect_document_uri(args.uri)
elif args.command == "web-geo-uri":
web_entities_include_geo_results_uri(args.uri)
elif args.command == "ocr-uri":
async_detect_document(args.uri, args.destination_uri)
elif args.command == "object-localization-uri":
localize_objects_uri(args.uri)
if __name__ == "__main__":
parser = argparse.ArgumentParser(
description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter
)
subparsers = parser.add_subparsers(dest="command")
detect_faces_parser = subparsers.add_parser("faces", help=detect_faces.__doc__)
detect_faces_parser.add_argument("path")
faces_file_parser = subparsers.add_parser(
"faces-uri", help=detect_faces_uri.__doc__
)
faces_file_parser.add_argument("uri")
detect_labels_parser = subparsers.add_parser("labels", help=detect_labels.__doc__)
detect_labels_parser.add_argument("path")
labels_file_parser = subparsers.add_parser(
"labels-uri", help=detect_labels_uri.__doc__
)
labels_file_parser.add_argument("uri")
detect_landmarks_parser = subparsers.add_parser(
"landmarks", help=detect_landmarks.__doc__
)
detect_landmarks_parser.add_argument("path")
landmark_file_parser = subparsers.add_parser(
"landmarks-uri", help=detect_landmarks_uri.__doc__
)
landmark_file_parser.add_argument("uri")
detect_text_parser = subparsers.add_parser("text", help=detect_text.__doc__)
detect_text_parser.add_argument("path")
text_file_parser = subparsers.add_parser("text-uri", help=detect_text_uri.__doc__)
text_file_parser.add_argument("uri")
detect_logos_parser = subparsers.add_parser("logos", help=detect_logos.__doc__)
detect_logos_parser.add_argument("path")
logos_file_parser = subparsers.add_parser(
"logos-uri", help=detect_logos_uri.__doc__
)
logos_file_parser.add_argument("uri")
safe_search_parser = subparsers.add_parser(
"safe-search", help=detect_safe_search.__doc__
)
safe_search_parser.add_argument("path")
safe_search_file_parser = subparsers.add_parser(
"safe-search-uri", help=detect_safe_search_uri.__doc__
)
safe_search_file_parser.add_argument("uri")
properties_parser = subparsers.add_parser(
"properties", help=detect_properties.__doc__
)
properties_parser.add_argument("path")
properties_file_parser = subparsers.add_parser(
"properties-uri", help=detect_properties_uri.__doc__
)
properties_file_parser.add_argument("uri")
# 1.1 Vision features
web_parser = subparsers.add_parser("web", help=detect_web.__doc__)
web_parser.add_argument("path")
web_uri_parser = subparsers.add_parser("web-uri", help=detect_web_uri.__doc__)
web_uri_parser.add_argument("uri")
web_geo_parser = subparsers.add_parser(
"web-geo", help=web_entities_include_geo_results.__doc__
)
web_geo_parser.add_argument("path")
web_geo_uri_parser = subparsers.add_parser(
"web-geo-uri", help=web_entities_include_geo_results_uri.__doc__
)
web_geo_uri_parser.add_argument("uri")
crop_hints_parser = subparsers.add_parser(
"crophints", help=detect_crop_hints.__doc__
)
crop_hints_parser.add_argument("path")
crop_hints_uri_parser = subparsers.add_parser(
"crophints-uri", help=detect_crop_hints_uri.__doc__
)
crop_hints_uri_parser.add_argument("uri")
document_parser = subparsers.add_parser("document", help=detect_document.__doc__)
document_parser.add_argument("path")
document_uri_parser = subparsers.add_parser(
"document-uri", help=detect_document_uri.__doc__
)
document_uri_parser.add_argument("uri")
ocr_uri_parser = subparsers.add_parser(
"ocr-uri", help=async_detect_document.__doc__
)
ocr_uri_parser.add_argument("uri")
ocr_uri_parser.add_argument("destination_uri")
object_localization_parser = subparsers.add_parser(
"object-localization", help=async_detect_document.__doc__
)
object_localization_parser.add_argument("path")
object_localization_uri_parser = subparsers.add_parser(
"object-localization-uri", help=async_detect_document.__doc__
)
object_localization_uri_parser.add_argument("uri")
args = parser.parse_args()
if "uri" in args.command:
run_uri(args)
else:
run_local(args)