object-localization/code/main.py (110 lines of code) (raw):

from google.cloud import bigquery, vision, storage import functions_framework import os import json def detect_objects_uri(uri): """Localize objects in the image on Google Cloud Storage Args: uri: The path to the file in Google Cloud Storage (gs://...) """ client = vision.ImageAnnotatorClient() response = client.annotate_image({ 'image': {'source': {'image_uri': uri}}, 'features': [{'type_': vision.Feature.Type.OBJECT_LOCALIZATION}] }) objects = [] for x in response.localized_object_annotations: obj = {"name": x.name, "score": x.score} objects.append(obj) return objects def save_results(object_name, vision_results): """ Parse objects detected to json and save it into the GCS bucket set on GCS_OUTPUT """ print("Process output started.") bucket_name = os.getenv("GCS_OUTPUT") storage_client = storage.Client() destination_bucket = storage_client.bucket(bucket_name) print("Saving results...") print(vision_results) results_json = json.dumps(vision_results) results_json_name = "{}.json".format(object_name) results_json_blob = destination_bucket.blob(results_json_name) results_json_blob.upload_from_string(results_json) # Triggered by a change in a storage bucket @functions_framework.cloud_event def trigger_gcs(cloud_event): data = cloud_event.data event_id = cloud_event["id"] event_type = cloud_event["type"] bucket = data["bucket"] name = data["name"] metageneration = data["metageneration"] timeCreated = data["timeCreated"] updated = data["updated"] print(f"Event ID: {event_id}") print(f"Event type: {event_type}") print(f"Bucket: {bucket}") print(f"File: {name}") print(f"Metageneration: {metageneration}") print(f"Created: {timeCreated}") print(f"Updated: {updated}") uri = "gs://{}/{}".format(bucket, name) vision_results = { "object_name": name, "objects": detect_objects_uri(uri), "labels": detect_labels_uri(uri), "logos": detect_logos_uri(uri), "safe_search": detect_safe_search_uri(uri) } save_results(name, vision_results) print("Object localization completed sucessfully") def detect_labels_uri(uri): """Provides a quick start example for Cloud Vision.""" # Instantiates a client client = vision.ImageAnnotatorClient() image = vision.Image() image.source.image_uri = uri # Performs label detection on the image file response = client.label_detection(image=image) labels = response.label_annotations label_results = [] for label in labels: label_results.append( {"label": label.description, "score": label.score}) return label_results 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 logo_results = [] for logo in logos: logo_results.append({"label": logo.description, "score": logo.score}) if response.error.message: raise Exception( "{}\nFor more info on error messages, check: " "https://cloud.google.com/apis/design/errors".format( response.error.message) ) return logo_results 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", ) if response.error.message: raise Exception( "{}\nFor more info on error messages, check: " "https://cloud.google.com/apis/design/errors".format( response.error.message) ) safe_search = { "adult": likelihood_name[safe.adult], "medical": likelihood_name[safe.medical], "spoofed": likelihood_name[safe.spoof], "violence": likelihood_name[safe.violence], "racy": likelihood_name[safe.racy] } return safe_search