vision/main.py (45 lines of code) (raw):
import os
import sys
from flask import Flask, redirect, render_template, request
from google.cloud import firestore
from google.cloud import storage
from google.cloud import vision
app = Flask(__name__)
@app.route('/')
def homepage():
# Create a Cloud Firestore client.
firestore_client = firestore.Client()
# Use the Cloud Firestore client to fetch information from Cloud Firestore about
# each photo.
photo_documents = list(firestore_client.collection(u'photos').get())
# Return a Jinja2 HTML template.
return render_template('homepage.html', photo_documents=photo_documents)
@app.route('/upload_photo', methods=['GET', 'POST'])
def upload_photo():
# Create a Cloud Storage client.
storage_client = storage.Client()
# Get the Cloud Storage bucket that the file will be uploaded to.
bucket = storage_client.get_bucket(os.environ.get('CLOUD_STORAGE_BUCKET'))
# Create a new blob and upload the file's content to Cloud Storage.
photo = request.files['file']
blob = bucket.blob(photo.filename)
blob.upload_from_string(
photo.read(), content_type=photo.content_type)
# Make the blob publicly viewable.
blob.make_public()
image_public_url = blob.public_url
# Create a Cloud Vision client.
vision_client = vision.ImageAnnotatorClient()
# Retrieve a Vision API response for the photo stored in Cloud Storage
image = vision.types.Image()
image.source.image_uri = 'gs://{}/{}'.format(os.environ.get('CLOUD_STORAGE_BUCKET'), blob.name)
response = vision_client.annotate_image({'image': image})
labels = response.label_annotations
faces = response.face_annotations
web_entities = response.web_detection.web_entities
# Create a Cloud Firestore client
firestore_client = firestore.Client()
# Get a reference to the document we will upload to
doc_ref = firestore_client.collection(u'photos').document(blob.name)
# Note: If we are using Python version 2, we need to convert
# our image URL to unicode to save it to Cloud Firestore properly.
if sys.version_info < (3, 0):
image_public_url = unicode(image_public_url, "utf-8")
# Construct key/value pairs with data
data = {
u'image_public_url': image_public_url,
u'top_label': labels[0].description
}
# Set the document with the data
doc_ref.set(data)
# Redirect to the home page.
return render_template('homepage.html', labels=labels, faces=faces, web_entities=web_entities, image_public_url=image_public_url)
@app.errorhandler(500)
def server_error(e):
return """
An internal error occurred: <pre>{}</pre>
See logs for full stacktrace.
""".format(e), 500
if __name__ == '__main__':
# This is used when running locally. Gunicorn is used to run the
# application on Google App Engine. See entrypoint in app.yaml.
app.run(host='127.0.0.1', port=8080, debug=True)