Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add gax support for entity annotations. #2918

Merged

Conversation

daspecster
Copy link
Contributor

Towards #2753

This adds support for EntityAnnotation types of detection.

Face, Safe Search and Image Properties is what's left.

Also, system tests have use_gax set for detection types that don't yet have from_pb defined.

@daspecster daspecster added the api: vision Issues related to the Cloud Vision API. label Jan 5, 2017
@googlebot googlebot added the cla: yes This human has signed the Contributor License Agreement. label Jan 5, 2017
@daspecster daspecster force-pushed the vision-add-gapic-entity-annotation branch from c230cf6 to 33f3dd5 Compare January 5, 2017 03:42
@@ -190,6 +190,7 @@ def _assert_face(self, face):

def test_detect_faces_content(self):
client = Config.CLIENT
client._use_gax = False

This comment was marked as spam.

This comment was marked as spam.

This comment was marked as spam.

requests = [request]
api = self._api
responses = api.batch_annotate_images(requests)
return Annotations.from_pb(responses.responses[0])

This comment was marked as spam.

@@ -49,7 +50,7 @@ def annotate(self, image, features):
api_response = self._connection.api_request(
method='POST', path='/images:annotate', data=data)
responses = api_response.get('responses')
return responses[0]
return Annotations.from_api_repr(responses[0])

This comment was marked as spam.

:param response: ``AnnotateImageResponse`` from gRPC call.

:rtype: :class:`~google.cloud.vision.annotations.Annotations`
:returns: ``Annotations`` instance populated from gRPC response.

This comment was marked as spam.

@@ -93,6 +93,55 @@ def from_api_repr(cls, response):
_entity_from_response_type(feature_type, annotation))
return cls(**annotations)

@classmethod
def from_pb(cls, response):
"""Factory: construct an instance of ``Annotations`` from gRPC response.

This comment was marked as spam.

self.assertEquals(annotations.properties, ())


class TestMakeEntityFromPB(unittest.TestCase):

This comment was marked as spam.

class TestMakeEntityFromPB(unittest.TestCase):
def _call_fut(self, annotations):
from google.cloud.vision.annotations import _make_entity_from_pb
return _make_entity_from_pb(annotations)

This comment was marked as spam.

entity_annotation.bounding_poly.vertices[0].y = 2
entity_annotation.locations.add()
entity_annotation.locations[0].lat_lng.latitude = 1.0
entity_annotation.locations[0].lat_lng.longitude = 2.0

This comment was marked as spam.

from google.cloud.vision.annotations import _make_entity_from_pb
return _make_entity_from_pb(annotations)

def test_make_entity_from_pb(self):

This comment was marked as spam.

self.assertEqual(entity.locations[0].longitude, 2.0)


class TestProcessImageAnnotations(unittest.TestCase):

This comment was marked as spam.

@daspecster daspecster force-pushed the vision-add-gapic-entity-annotation branch from ea8ecba to 46e6942 Compare January 11, 2017 16:04
@@ -190,6 +190,7 @@ def _assert_face(self, face):

def test_detect_faces_content(self):
client = Config.CLIENT
client._use_gax = False

This comment was marked as spam.

longitude.
"""
return cls(location_info.lat_lng.latitude,
location_info.lat_lng.longitude)

This comment was marked as spam.

return responses[0]
images = api_response.get('responses')
if len(images) == 1:
return Annotations.from_api_repr(images[0])

This comment was marked as spam.

This comment was marked as spam.

This comment was marked as spam.

This comment was marked as spam.

This comment was marked as spam.

@@ -63,13 +63,33 @@ def from_api_repr(cls, response):
bounds = Bounds.from_api_repr(response.get('boundingPoly'))
description = response['description']
locale = response.get('locale', None)
locations = [LocationInformation.from_api_repr(location)
locations = [LocationInformation.from_api_repr(location['latLng'])
for location in response.get('locations', [])]

This comment was marked as spam.

:type response: dict
:param response: Dictionary response of locations.
:type location_info: dict
:param location_info: Dictionary response of locations.

This comment was marked as spam.

This comment was marked as spam.

:param features: List of :class:`~google.cloud.vision.feature.Feature`.

:rtype: :class:`~google.cloud.vision.annotations.Annotations`
:returns: Instance of ``Annotations`` with results.

This comment was marked as spam.

@daspecster
Copy link
Contributor Author

@dhermes I updated the system tests and I think I addressed most of your feedback.

LMKWYT

@@ -190,6 +190,8 @@ def _assert_face(self, face):

def test_detect_faces_content(self):
client = Config.CLIENT
if not client._use_gax:
self.skipTest('gRPC is required for face detection.')

This comment was marked as spam.

return responses[0]
images = api_response.get('responses')
if len(images) == 1:
return Annotations.from_api_repr(images[0])

This comment was marked as spam.

mid = response.get('mid', None)
score = response.get('score', None)

return cls(bounds, description, locale, locations, mid, score)

@classmethod
def from_pb(cls, response):

This comment was marked as spam.

This comment was marked as spam.

@@ -41,6 +41,20 @@ def from_api_repr(cls, response_vertices):
vertex in response_vertices.get('vertices', [])]
return cls(vertices)

@classmethod
def from_pb(cls, response_vertices):

This comment was marked as spam.


:rtype: :class:`~google.cloud.vision.geometry.LocationInformation`
:returns: ``LocationInformation`` with populated latitude and
longitude.
"""
latitude = response['latLng']['latitude']
longitude = response['latLng']['longitude']
lat_long = location_info.get('latLng')

This comment was marked as spam.

longitude = response['latLng']['longitude']
lat_long = location_info.get('latLng')
latitude = lat_long.get('latitude')
longitude = lat_long.get('longitude')

This comment was marked as spam.

This comment was marked as spam.

@daspecster
Copy link
Contributor Author

Re:

But len(images) > 1 is an error. I realize it returns None, I'm saying that we should be more defensive / have clearer assumptions.

How about this?

if len(images) == 1:
    return Annotations.from_api_repr(images[0])
elif len(images) > 1:
    raise ValueError('Multiple image processing is not yet supported.')

@@ -52,6 +52,8 @@ def annotate(self, image, features):
images = api_response.get('responses')
if len(images) == 1:
return Annotations.from_api_repr(images[0])
elif len(images) > 1:
raise ValueError('Multiple image processing is not yet supported.')

This comment was marked as spam.

This comment was marked as spam.

geometry_pb2.BoundingPoly`
:param response_vertices: List of vertices.
:param vertices: List of vertices.

This comment was marked as spam.

@daspecster daspecster force-pushed the vision-add-gapic-entity-annotation branch from 958f90e to 7ff033d Compare January 13, 2017 21:34
@daspecster
Copy link
Contributor Author

Squashed with NotImplementedError update.

@daspecster
Copy link
Contributor Author

Travis is green, merging.

@daspecster daspecster merged commit 885397b into googleapis:master Jan 13, 2017
@daspecster daspecster deleted the vision-add-gapic-entity-annotation branch January 13, 2017 21:51
@daspecster daspecster mentioned this pull request Jan 31, 2017
10 tasks
richkadel pushed a commit to richkadel/google-cloud-python that referenced this pull request May 6, 2017
…ntity-annotation

Add gax support for entity annotations.
parthea pushed a commit that referenced this pull request Jun 4, 2023
* Data Labeling Beta samples [(#2096)](GoogleCloudPlatform/python-docs-samples#2096)

* add files

* upate create_annotation_spec_set and test

* add requirements.txt

* update create_instruction and test

* update import data and test

* add label image and test

* add label_text test

* add label_video_test

* add manage dataset and tests

* flake

* fix

* add README

* Adds updates including compute [(#2436)](GoogleCloudPlatform/python-docs-samples#2436)

* Adds updates including compute

* Python 2 compat pytest

* Fixing weird \r\n issue from GH merge

* Put asset tests back in

* Re-add pod operator test

* Hack parameter for k8s pod operator

* Update datalabeling samples to hit test endpoint. [(#2641)](GoogleCloudPlatform/python-docs-samples#2641)

* Auto-update dependencies. [(#2005)](GoogleCloudPlatform/python-docs-samples#2005)

* Auto-update dependencies.

* Revert update of appengine/flexible/datastore.

* revert update of appengine/flexible/scipy

* revert update of bigquery/bqml

* revert update of bigquery/cloud-client

* revert update of bigquery/datalab-migration

* revert update of bigtable/quickstart

* revert update of compute/api

* revert update of container_registry/container_analysis

* revert update of dataflow/run_template

* revert update of datastore/cloud-ndb

* revert update of dialogflow/cloud-client

* revert update of dlp

* revert update of functions/imagemagick

* revert update of functions/ocr/app

* revert update of healthcare/api-client/fhir

* revert update of iam/api-client

* revert update of iot/api-client/gcs_file_to_device

* revert update of iot/api-client/mqtt_example

* revert update of language/automl

* revert update of run/image-processing

* revert update of vision/automl

* revert update testing/requirements.txt

* revert update of vision/cloud-client/detect

* revert update of vision/cloud-client/product_search

* revert update of jobs/v2/api_client

* revert update of jobs/v3/api_client

* revert update of opencensus

* revert update of translate/cloud-client

* revert update to speech/cloud-client

Co-authored-by: Kurtis Van Gent <31518063+kurtisvg@users.noreply.github.com>
Co-authored-by: Doug Mahugh <dmahugh@gmail.com>

* Update datalabeling to match lint. [(#2642)](GoogleCloudPlatform/python-docs-samples#2642)

* datalabeling: ensure all tests use test endpoint [(#2918)](GoogleCloudPlatform/python-docs-samples#2918)

* datalabeling: ensure all tests use test endpoint

* requires an input csv for text input, slight print statement cleanup

Co-authored-by: Leah E. Cole <6719667+leahecole@users.noreply.github.com>

* chore(deps): update dependency google-cloud-datalabeling to v0.4.0 [(#3081)](GoogleCloudPlatform/python-docs-samples#3081)

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [google-cloud-datalabeling](https://github.com/googleapis/python-datalabeling) | minor | `==0.3.0` -> `==0.4.0` |

---

### Release Notes

<details>
<summary>googleapis/python-datalabeling</summary>

### [`v0.4.0`](https://github.com/googleapis/python-datalabeling/blob/master/CHANGELOG.md#&#8203;040-httpswwwgithubcomgoogleapispython-datalabelingcomparev030v040-2020-01-31)

[Compare Source](https://github.com/googleapis/python-datalabeling/compare/v0.3.0...v0.4.0)

##### Features

-   **datalabeling:** undeprecate resource name helper methods (via synth) ([#&#8203;10039](https://www.github.com/googleapis/python-datalabeling/issues/10039)) ([88f8090](https://www.github.com/googleapis/python-datalabeling/commit/88f809008ee6a709c02c78b1d93af779fab19adb))

##### Bug Fixes

-   **datalabeling:** deprecate resource name helper methods (via synth) ([#&#8203;9832](https://www.github.com/googleapis/python-datalabeling/issues/9832)) ([e5f9021](https://www.github.com/googleapis/python-datalabeling/commit/e5f902154ebe7fcb139aa405babfe9993fd51319))

</details>

---

### Renovate configuration

:date: **Schedule**: At any time (no schedule defined).

:vertical_traffic_light: **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

:recycle: **Rebasing**: Never, or you tick the rebase/retry checkbox.

:no_bell: **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [WhiteSource Renovate](https://renovate.whitesourcesoftware.com). View repository job log [here](https://app.renovatebot.com/dashboard#GoogleCloudPlatform/python-docs-samples).

* Simplify noxfile setup. [(#2806)](GoogleCloudPlatform/python-docs-samples#2806)

* chore(deps): update dependency requests to v2.23.0

* Simplify noxfile and add version control.

* Configure appengine/standard to only test Python 2.7.

* Update Kokokro configs to match noxfile.

* Add requirements-test to each folder.

* Remove Py2 versions from everything execept appengine/standard.

* Remove conftest.py.

* Remove appengine/standard/conftest.py

* Remove 'no-sucess-flaky-report' from pytest.ini.

* Add GAE SDK back to appengine/standard tests.

* Fix typo.

* Roll pytest to python 2 version.

* Add a bunch of testing requirements.

* Remove typo.

* Add appengine lib directory back in.

* Add some additional requirements.

* Fix issue with flake8 args.

* Even more requirements.

* Readd appengine conftest.py.

* Add a few more requirements.

* Even more Appengine requirements.

* Add webtest for appengine/standard/mailgun.

* Add some additional requirements.

* Add workaround for issue with mailjet-rest.

* Add responses for appengine/standard/mailjet.

Co-authored-by: Renovate Bot <bot@renovateapp.com>

* testing: mark some tests as flaky [(#3288)](GoogleCloudPlatform/python-docs-samples#3288)

fixes #3138

* [datalabeling] testing: wrap rpcs with backoff [(#3443)](GoogleCloudPlatform/python-docs-samples#3443)

* wrap all the rpcs with backoff
* add a shared testing lib
* remove flaky

* [datalabeling] fix: clean up old datasets before the test [(#3707)](GoogleCloudPlatform/python-docs-samples#3707)

fixes #3710 
fixes #3711

* [datalabeling] testing: retry upon ServerError [(#3762)](GoogleCloudPlatform/python-docs-samples#3762)

fixes #3760

* Replace GCLOUD_PROJECT with GOOGLE_CLOUD_PROJECT. [(#4022)](GoogleCloudPlatform/python-docs-samples#4022)

* chore(deps): update dependency pytest to v5.4.3 [(#4279)](GoogleCloudPlatform/python-docs-samples#4279)

* chore(deps): update dependency pytest to v5.4.3

* specify pytest for python 2 in appengine

Co-authored-by: Leah Cole <coleleah@google.com>

* Update dependency pytest to v6 [(#4390)](GoogleCloudPlatform/python-docs-samples#4390)

* chore: update templates

* chore: fix docs error

* chore: skip unavailable samples

* chore: use staging endpoint for labeling tests

Co-authored-by: Rebecca Taylor <remilytaylor@gmail.com>
Co-authored-by: Gus Class <gguuss@gmail.com>
Co-authored-by: Kurtis Van Gent <31518063+kurtisvg@users.noreply.github.com>
Co-authored-by: DPEBot <dpebot@google.com>
Co-authored-by: Doug Mahugh <dmahugh@gmail.com>
Co-authored-by: Noah Negrey <nnegrey@users.noreply.github.com>
Co-authored-by: Leah E. Cole <6719667+leahecole@users.noreply.github.com>
Co-authored-by: WhiteSource Renovate <bot@renovateapp.com>
Co-authored-by: Takashi Matsuo <tmatsuo@google.com>
Co-authored-by: Leah Cole <coleleah@google.com>
Co-authored-by: Bu Sun Kim <busunkim@google.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
api: vision Issues related to the Cloud Vision API. cla: yes This human has signed the Contributor License Agreement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants