Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
101 changes: 101 additions & 0 deletions vision/api/label/snippets.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
#!/usr/bin/env python
# Copyright 2015 Google Inc. All Rights Reserved.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, I don't think the header on go/releasing/preparing includes "All Rights Reserved" anymore.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

#
# 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.


import argparse
import base64
import json

from googleapiclient import discovery
import httplib2
from oauth2client.client import GoogleCredentials

DISCOVERY_URL = (
'https://vision.googleapis.com/$discovery/rest?'
'labels=TRUSTED_TESTER&version=v1'
)


def get_service():
"""Get vision service using discovery."""
credentials = GoogleCredentials.get_application_default()
scoped_credentials = credentials.create_scoped(
['https://www.googleapis.com/auth/cloud-platform'])
http = httplib2.Http()

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I know I ask this constantly, but is this needed because of alpha?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes

scoped_credentials.authorize(http)
return discovery.build(
'vision', 'v1',
http=http,
discoveryServiceUrl=DISCOVERY_URL
)


def crop_hint(photo_file):

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

photo_file makes me think this is a file object. Prefer photo_path.

(Update here and in the other functions)

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

"""Run a crop hint request on the image."""

service = get_service()

with open(photo_file, 'rb') as image:
image_content = base64.b64encode(image.read())

service_request = service.images().annotate(body={
'requests': [{
'image': {
'content': image_content.decode('UTF-8')
},
'features': [{
'type': 'CROP_HINTS'
}]
}]
})

response = service_request.execute()
print(json.dumps(response, indent=2))


def web_annotation(photo_file):
"""Run a web annotation request on the image."""

service = get_service()

with open(photo_file, 'rb') as image:
image_content = base64.b64encode(image.read())

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same comment here on the with statement.


service_request = service.images().annotate(body={
'requests': [{
'image': {
'content': image_content.decode('UTF-8')
},
'features': [{
'type': 'WEB_ANNOTATION',
'maxResults': 10
}]
}]
})

response = service_request.execute()
print(json.dumps(response, indent=2))


if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('command', choices=['crop_hint', 'web_annotation'])
parser.add_argument('image_file', help='The image you\'d like to process.')
args = parser.parse_args()

if args.command == 'crop_hint':
response = crop_hint(args.image_file)
elif args.command == 'web_annotation':
response = web_annotation(args.image_file)
58 changes: 58 additions & 0 deletions vision/api/label/snippets_test.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
#!/usr/bin/env python

# Copyright 2016 Google, Inc
#
# 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.


import json

import snippets


def test_crop_hint_response_count(capsys, resource):
snippets.crop_hint(resource('cat.jpg'))
stdout, _ = capsys.readouterr()
result = json.loads(stdout)
assert len(result['responses']) == 1


def test_crop_hint_response_dim(capsys, resource):
snippets.crop_hint(resource('cat.jpg'))
stdout, _ = capsys.readouterr()
result = json.loads(stdout)
crop_hint = result['responses'][0]
crop_hint_annotation = crop_hint['cropHintsAnnotation']['cropHints'][0]
confidence = crop_hint_annotation['confidence']

assert 0.5 < confidence < 0.9


def test_web_annotations(capsys, resource):
snippets.web_annotation(resource('cat.jpg'))
stdout, _ = capsys.readouterr()
result = json.loads(stdout)
web_annotation = result['responses'][0]['webAnnotation']
web_entities = web_annotation['webEntities']

assert len(web_entities) == 10
russian_blue = False

for entity in web_entities:
entity_id = entity['entityId']
desc = entity['description']

if entity_id == '/m/012cc2' and desc == 'Russian Blue':
russian_blue = True

assert russian_blue is True