google-cloud-vision 0.31.0 → 0.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +2 -9
  3. data/LICENSE +1 -1
  4. data/README.md +94 -0
  5. data/lib/google/cloud/vision.rb +200 -535
  6. data/lib/google/cloud/vision/v1.rb +129 -55
  7. data/lib/google/cloud/vision/v1/doc/google/cloud/vision/v1/image_annotator.rb +9 -0
  8. data/lib/google/cloud/vision/v1/doc/google/cloud/vision/v1/product_search.rb +88 -0
  9. data/lib/google/cloud/vision/v1/doc/google/cloud/vision/v1/product_search_service.rb +539 -0
  10. data/lib/google/cloud/vision/v1/doc/google/cloud/vision/v1/text_annotation.rb +3 -3
  11. data/lib/google/cloud/vision/v1/doc/google/cloud/vision/v1/web_detection.rb +2 -1
  12. data/lib/google/cloud/vision/{version.rb → v1/doc/google/protobuf/empty.rb} +13 -6
  13. data/lib/google/cloud/vision/v1/doc/google/protobuf/field_mask.rb +230 -0
  14. data/lib/google/cloud/vision/v1/doc/google/protobuf/timestamp.rb +109 -0
  15. data/lib/google/cloud/vision/v1/geometry_pb.rb +1 -0
  16. data/lib/google/cloud/vision/v1/helpers.rb +972 -0
  17. data/lib/google/cloud/vision/v1/image_annotator_client.rb +4 -4
  18. data/lib/google/cloud/vision/v1/image_annotator_pb.rb +5 -0
  19. data/lib/google/cloud/vision/v1/image_annotator_services_pb.rb +2 -1
  20. data/lib/google/cloud/vision/v1/product_search_client.rb +1337 -0
  21. data/lib/google/cloud/vision/v1/product_search_client_config.json +116 -0
  22. data/lib/google/cloud/vision/v1/product_search_pb.rb +45 -0
  23. data/lib/google/cloud/vision/v1/product_search_service_pb.rb +191 -0
  24. data/lib/google/cloud/vision/v1/product_search_service_services_pb.rb +224 -0
  25. data/lib/google/cloud/vision/v1p3beta1.rb +233 -0
  26. data/lib/google/cloud/vision/v1p3beta1/credentials.rb +42 -0
  27. data/lib/google/cloud/vision/v1p3beta1/doc/google/cloud/vision/v1p3beta1/geometry.rb +72 -0
  28. data/lib/google/cloud/vision/v1p3beta1/doc/google/cloud/vision/v1p3beta1/image_annotator.rb +763 -0
  29. data/lib/google/cloud/vision/v1p3beta1/doc/google/cloud/vision/v1p3beta1/product_search.rb +154 -0
  30. data/lib/google/cloud/vision/v1p3beta1/doc/google/cloud/vision/v1p3beta1/product_search_service.rb +533 -0
  31. data/lib/google/cloud/vision/v1p3beta1/doc/google/cloud/vision/v1p3beta1/text_annotation.rb +254 -0
  32. data/lib/google/cloud/vision/v1p3beta1/doc/google/cloud/vision/v1p3beta1/web_detection.rb +101 -0
  33. data/lib/google/cloud/vision/v1p3beta1/doc/google/longrunning/operations.rb +93 -0
  34. data/lib/google/cloud/vision/v1p3beta1/doc/google/protobuf/any.rb +130 -0
  35. data/lib/google/cloud/vision/v1p3beta1/doc/google/protobuf/empty.rb +29 -0
  36. data/lib/google/cloud/vision/v1p3beta1/doc/google/protobuf/field_mask.rb +230 -0
  37. data/lib/google/cloud/vision/v1p3beta1/doc/google/protobuf/timestamp.rb +109 -0
  38. data/lib/google/cloud/vision/v1p3beta1/doc/google/protobuf/wrappers.rb +90 -0
  39. data/lib/google/cloud/vision/v1p3beta1/doc/google/rpc/status.rb +84 -0
  40. data/lib/google/cloud/vision/v1p3beta1/doc/google/type/color.rb +156 -0
  41. data/lib/google/cloud/vision/v1p3beta1/doc/google/type/latlng.rb +65 -0
  42. data/lib/google/cloud/vision/v1p3beta1/geometry_pb.rb +43 -0
  43. data/lib/google/cloud/vision/v1p3beta1/helpers.rb +972 -0
  44. data/lib/google/cloud/vision/v1p3beta1/image_annotator_client.rb +302 -0
  45. data/lib/google/cloud/vision/v1p3beta1/image_annotator_client_config.json +36 -0
  46. data/lib/google/cloud/vision/v1p3beta1/image_annotator_pb.rb +304 -0
  47. data/lib/google/cloud/vision/v1p3beta1/image_annotator_services_pb.rb +55 -0
  48. data/lib/google/cloud/vision/v1p3beta1/product_search_client.rb +1351 -0
  49. data/lib/google/cloud/vision/v1p3beta1/product_search_client_config.json +116 -0
  50. data/lib/google/cloud/vision/v1p3beta1/product_search_pb.rb +64 -0
  51. data/lib/google/cloud/vision/v1p3beta1/product_search_service_pb.rb +191 -0
  52. data/lib/google/cloud/vision/v1p3beta1/product_search_service_services_pb.rb +222 -0
  53. data/lib/google/cloud/vision/v1p3beta1/text_annotation_pb.rb +94 -0
  54. data/lib/google/cloud/vision/v1p3beta1/web_detection_pb.rb +51 -0
  55. metadata +53 -122
  56. data/AUTHENTICATION.md +0 -179
  57. data/CHANGELOG.md +0 -109
  58. data/CODE_OF_CONDUCT.md +0 -40
  59. data/CONTRIBUTING.md +0 -188
  60. data/LOGGING.md +0 -32
  61. data/OVERVIEW.md +0 -202
  62. data/TROUBLESHOOTING.md +0 -37
  63. data/lib/google-cloud-vision.rb +0 -146
  64. data/lib/google/cloud/vision/annotate.rb +0 -303
  65. data/lib/google/cloud/vision/annotation.rb +0 -553
  66. data/lib/google/cloud/vision/annotation/crop_hint.rb +0 -126
  67. data/lib/google/cloud/vision/annotation/entity.rb +0 -225
  68. data/lib/google/cloud/vision/annotation/face.rb +0 -1497
  69. data/lib/google/cloud/vision/annotation/normalized_vertex.rb +0 -76
  70. data/lib/google/cloud/vision/annotation/object_localization.rb +0 -115
  71. data/lib/google/cloud/vision/annotation/properties.rb +0 -220
  72. data/lib/google/cloud/vision/annotation/safe_search.rb +0 -153
  73. data/lib/google/cloud/vision/annotation/text.rb +0 -1015
  74. data/lib/google/cloud/vision/annotation/vertex.rb +0 -91
  75. data/lib/google/cloud/vision/annotation/web.rb +0 -420
  76. data/lib/google/cloud/vision/credentials.rb +0 -57
  77. data/lib/google/cloud/vision/image.rb +0 -832
  78. data/lib/google/cloud/vision/location.rb +0 -98
  79. data/lib/google/cloud/vision/project.rb +0 -367
  80. data/lib/google/cloud/vision/service.rb +0 -83
@@ -1,126 +0,0 @@
1
- # Copyright 2017 Google LLC
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # https://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
-
16
- require "google/cloud/vision/annotation/vertex"
17
-
18
- module Google
19
- module Cloud
20
- module Vision
21
- class Annotation
22
- ##
23
- # # CropHint
24
- #
25
- # A single crop hint that is used to generate new crops when serving
26
- # images.
27
- #
28
- # @example
29
- # require "google/cloud/vision"
30
- #
31
- # vision = Google::Cloud::Vision.new
32
- #
33
- # image = vision.image "path/to/face.jpg"
34
- #
35
- # crop_hints = image.crop_hints
36
- # crop_hints.count #=> 1
37
- # crop_hint = crop_hints.first
38
- #
39
- # crop_hint.bounds.count #=> 4
40
- # crop_hint.bounds[0].x #=> 1
41
- # crop_hint.bounds[0].y #=> 0
42
- # crop_hint.bounds[1].x #=> 511
43
- # crop_hint.bounds[1].y #=> 0
44
- # crop_hint.bounds[2].x #=> 511
45
- # crop_hint.bounds[2].y #=> 383
46
- # crop_hint.bounds[3].x #=> 0
47
- # crop_hint.bounds[3].y #=> 383
48
- #
49
- # crop_hint.confidence #=> 1.0
50
- # crop_hint.importance_fraction #=> 1.0399999618530273
51
- #
52
- class CropHint
53
- ##
54
- # @private The Google::Cloud::Vision::V1::CropHint GRPC object.
55
- attr_accessor :grpc
56
-
57
- ##
58
- # @private Creates a new Entity instance.
59
- def initialize
60
- @grpc = nil
61
- end
62
-
63
- ##
64
- # The bounding polygon for the crop region. The coordinates of the
65
- # bounding box are in the original image's scale.
66
- #
67
- # @return [Array<Vertex>] An array of vertices.
68
- #
69
- def bounds
70
- return [] unless @grpc.bounding_poly
71
- @bounds ||= Array(@grpc.bounding_poly.vertices).map do |v|
72
- Vertex.from_grpc v
73
- end
74
- end
75
-
76
- ##
77
- # The confidence of this being a salient region.
78
- #
79
- # @return [Float] A value in the range [0, 1].
80
- #
81
- def confidence
82
- @grpc.confidence
83
- end
84
-
85
- ##
86
- # The fraction of importance of this salient region with respect to
87
- # the original image.
88
- #
89
- # @return [Float]
90
- #
91
- def importance_fraction
92
- @grpc.importance_fraction
93
- end
94
-
95
- ##
96
- # Deeply converts object to a hash. All keys will be symbolized.
97
- #
98
- # @return [Hash]
99
- #
100
- def to_h
101
- { bounds: bounds.map(&:to_h), confidence: confidence,
102
- importance_fraction: importance_fraction }
103
- end
104
-
105
- # @private
106
- def to_s
107
- tmplt = "bounds: %i, confidence: %s, importance_fraction: %s"
108
- format tmplt, bounds.count, confidence.inspect,
109
- importance_fraction.inspect
110
- end
111
-
112
- # @private
113
- def inspect
114
- "#<#{self.class.name} #{self}>"
115
- end
116
-
117
- ##
118
- # @private New Annotation::Entity from a GRPC object.
119
- def self.from_grpc grpc
120
- new.tap { |f| f.instance_variable_set :@grpc, grpc }
121
- end
122
- end
123
- end
124
- end
125
- end
126
- end
@@ -1,225 +0,0 @@
1
- # Copyright 2016 Google LLC
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # https://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
-
16
- require "google/cloud/vision/location"
17
- require "google/cloud/vision/annotation/vertex"
18
-
19
- module Google
20
- module Cloud
21
- module Vision
22
- class Annotation
23
- ##
24
- # # Entity
25
- #
26
- # Represents characteristics of an entity detected in an image. May
27
- # describe a real-world entity such as a person, place, or thing. May be
28
- # identified with an entity ID as an entity in the Knowledge Graph (KG).
29
- #
30
- # @see https://developers.google.com/knowledge-graph/ Knowledge Graph
31
- #
32
- # @example In landmark detection:
33
- # require "google/cloud/vision"
34
- #
35
- # vision = Google::Cloud::Vision.new
36
- #
37
- # image = vision.image "path/to/landmark.jpg"
38
- #
39
- # landmark = image.landmark
40
- # landmark.score #=> 0.9191226363182068
41
- # landmark.description #=> "Mount Rushmore"
42
- # landmark.mid #=> "/m/019dvv"
43
- #
44
- # @example In logo detection:
45
- # require "google/cloud/vision"
46
- #
47
- # vision = Google::Cloud::Vision.new
48
- #
49
- # image = vision.image "path/to/logo.jpg"
50
- #
51
- # logo = image.logo
52
- # logo.score #=> 0.7005731463432312
53
- # logo.description #=> "Google"
54
- # logo.mid #=> "/m/0b34hf"
55
- #
56
- # @example In label detection:
57
- # require "google/cloud/vision"
58
- #
59
- # vision = Google::Cloud::Vision.new
60
- #
61
- # image = vision.image "path/to/landmark.jpg"
62
- #
63
- # labels = image.labels
64
- # labels.count #=> 4
65
- #
66
- # label = labels.first
67
- # label.score #=> 0.9481348991394043
68
- # label.description #=> "stone carving"
69
- # label.mid #=> "/m/02wtjj"
70
- #
71
- class Entity
72
- ##
73
- # @private The EntityAnnotation GRPC object.
74
- attr_accessor :grpc
75
-
76
- ##
77
- # @private Creates a new Entity instance.
78
- def initialize
79
- @grpc = nil
80
- end
81
-
82
- ##
83
- # Opaque entity ID. Some IDs might be available in Knowledge Graph
84
- # (KG).
85
- #
86
- # @see https://developers.google.com/knowledge-graph/ Knowledge Graph
87
- #
88
- # @return [String] The opaque entity ID.
89
- #
90
- def mid
91
- @grpc.mid
92
- end
93
-
94
- ##
95
- # The language code for the locale in which the `description` is
96
- # expressed.
97
- #
98
- # @return [String] The [ISO
99
- # 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)
100
- # language code.
101
- #
102
- def locale
103
- @grpc.locale
104
- end
105
-
106
- ##
107
- # Entity textual description, expressed in the {#locale} language.
108
- #
109
- # @return [String] A description of the entity.
110
- #
111
- def description
112
- @grpc.description
113
- end
114
-
115
- ##
116
- # Overall score of the result.
117
- #
118
- # @return [Float] A value in the range [0, 1].
119
- #
120
- def score
121
- @grpc.score
122
- end
123
-
124
- ##
125
- # The accuracy of the entity detection in an image. For example, for
126
- # an image containing 'Eiffel Tower,' this field represents the
127
- # confidence that there is a tower in the query image.
128
- #
129
- # @return [Float] A value in the range [0, 1].
130
- #
131
- def confidence
132
- @grpc.confidence
133
- end
134
-
135
- ##
136
- # The relevancy of the ICA (Image Content Annotation) label to the
137
- # image. For example, the relevancy of 'tower' to an image containing
138
- # 'Eiffel Tower' is likely higher than an image containing a distant
139
- # towering building, though the confidence that there is a tower may
140
- # be the same.
141
- #
142
- # @return [Float] A value in the range [0, 1].
143
- #
144
- def topicality
145
- @grpc.topicality
146
- end
147
-
148
- ##
149
- # Image region to which this entity belongs. Not filled currently for
150
- # `labels` detection.
151
- #
152
- # @return [Array<Vertex>] An array of vertices.
153
- #
154
- def bounds
155
- return [] unless @grpc.bounding_poly
156
- @bounds ||= Array(@grpc.bounding_poly.vertices).map do |v|
157
- Vertex.from_grpc v
158
- end
159
- end
160
-
161
- ##
162
- # The location information for the detected entity. Multiple Location
163
- # elements can be present since one location may indicate the location
164
- # of the scene in the query image, and another the location of the
165
- # place where the query image was taken. Location information is
166
- # usually present for landmarks.
167
- #
168
- # @return [Array<Location>] An array of locations containing latitude
169
- # and longitude.
170
- #
171
- def locations
172
- @locations ||= Array(@grpc.locations).map do |l|
173
- Location.from_grpc l.lat_lng
174
- end
175
- end
176
-
177
- ##
178
- # Some entities can have additional optional Property fields. For
179
- # example a different kind of score or string that qualifies the
180
- # entity. present for landmarks.
181
- #
182
- # @return [Hash] A hash containing property names and values.
183
- #
184
- def properties
185
- @properties ||=
186
- Hash[Array(@grpc.properties).map { |p| [p.name, p.value] }]
187
- end
188
-
189
- ##
190
- # Deeply converts object to a hash. All keys will be symbolized.
191
- #
192
- # @return [Hash]
193
- #
194
- def to_h
195
- { mid: mid, locale: locale, description: description,
196
- score: score, confidence: confidence, topicality: topicality,
197
- bounds: bounds.map(&:to_h), locations: locations.map(&:to_h),
198
- properties: properties }
199
- end
200
-
201
- # @private
202
- def to_s
203
- tmplt = "mid: %s, locale: %s, description: %s, score: %s, " \
204
- "confidence: %s, topicality: %s, bounds: %i, " \
205
- "locations: %i, properties: %s"
206
- format tmplt, mid.inspect, locale.inspect, description.inspect,
207
- score.inspect, confidence.inspect, topicality.inspect,
208
- bounds.count, locations.count, properties.inspect
209
- end
210
-
211
- # @private
212
- def inspect
213
- "#<#{self.class.name} #{self}>"
214
- end
215
-
216
- ##
217
- # @private New Annotation::Entity from a GRPC object.
218
- def self.from_grpc grpc
219
- new.tap { |f| f.instance_variable_set :@grpc, grpc }
220
- end
221
- end
222
- end
223
- end
224
- end
225
- end
@@ -1,1497 +0,0 @@
1
- # Copyright 2016 Google LLC
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # https://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
-
16
- require "google/cloud/vision/annotation/vertex"
17
-
18
- module Google
19
- module Cloud
20
- module Vision
21
- class Annotation
22
- ##
23
- # # Face
24
- #
25
- # The results of face detection.
26
- #
27
- # See {Annotation#faces} and {Annotation#face}.
28
- #
29
- # @example
30
- # require "google/cloud/vision"
31
- #
32
- # vision = Google::Cloud::Vision.new
33
- #
34
- # image = vision.image "path/to/face.jpg"
35
- #
36
- # face = image.face
37
- # face.confidence #=> 0.8616237640380859
38
- #
39
- class Face
40
- ##
41
- # @private The FaceAnnotation GRPC object.
42
- attr_accessor :grpc
43
-
44
- ##
45
- # @private Creates a new Face instance.
46
- def initialize
47
- @grpc = nil
48
- end
49
-
50
- ##
51
- # The angles of the face, including roll, yaw, and pitch.
52
- #
53
- # @return [Angles]
54
- #
55
- def angles
56
- @angles ||= Angles.from_grpc @grpc
57
- end
58
-
59
- ##
60
- # The bounds of the face, including the polygons for the head and
61
- # face.
62
- #
63
- # @return [Bounds]
64
- #
65
- def bounds
66
- @bounds ||= Bounds.from_grpc @grpc
67
- end
68
-
69
- ##
70
- # The landmarks of the face, including the points for the eyes, ears,
71
- # nose and mouth.
72
- #
73
- # @return [Features]
74
- #
75
- def features
76
- @features ||= Features.from_grpc @grpc
77
- end
78
-
79
- ##
80
- # The likelihood of the facial detection, including joy, sorrow,
81
- # anger, surprise, under_exposed, blurred, and headwear.
82
- #
83
- # @return [Likelihood]
84
- #
85
- def likelihood
86
- @likelihood ||= Likelihood.from_grpc @grpc
87
- end
88
-
89
- ##
90
- # The confidence of the facial detection.
91
- #
92
- # @return [Float] A value in the range [0, 1].
93
- #
94
- def confidence
95
- @grpc.detection_confidence
96
- end
97
-
98
- ##
99
- # Deeply converts object to a hash. All keys will be symbolized.
100
- #
101
- # @return [Hash]
102
- #
103
- def to_h
104
- { angles: angles.to_h, bounds: bounds.to_h, features: features.to_h,
105
- likelihood: likelihood.to_h }
106
- end
107
-
108
- # @private
109
- def to_s
110
- # Keep console output low by not showing all sub-objects.
111
- "(angles, bounds, features, likelihood)"
112
- end
113
-
114
- # @private
115
- def inspect
116
- "#<#{self.class.name} #{self}>"
117
- end
118
-
119
- ##
120
- # @private New Annotation::Face from a GRPC object.
121
- def self.from_grpc grpc
122
- new.tap { |f| f.instance_variable_set :@grpc, grpc }
123
- end
124
-
125
- ##
126
- # # Angles
127
- #
128
- # The orientation of the face relative to the image.
129
- #
130
- # See {Face}.
131
- #
132
- # @example
133
- # require "google/cloud/vision"
134
- #
135
- # vision = Google::Cloud::Vision.new
136
- #
137
- # image = vision.image "path/to/face.jpg"
138
- # face = image.face
139
- #
140
- # face.angles.roll #=> -5.149211883544922
141
- # face.angles.yaw #=> -4.069568157196045
142
- # face.angles.pitch #=> -13.083284378051758
143
- #
144
- class Angles
145
- ##
146
- # @private The FaceAnnotation GRPC object.
147
- attr_accessor :grpc
148
-
149
- ##
150
- # @private Creates a new Angles instance.
151
- def initialize
152
- @grpc = nil
153
- end
154
-
155
- ##
156
- # Roll angle. Indicates the amount of clockwise/anti-clockwise
157
- # rotation of the face relative to the image vertical, about the
158
- # axis perpendicular to the face.
159
- #
160
- # @return [Float] A value in the range [-180,180].
161
- #
162
- def roll
163
- @grpc.roll_angle
164
- end
165
-
166
- ##
167
- # Yaw (pan) angle. Indicates the leftward/rightward angle that the
168
- # face is pointing, relative to the vertical plane perpendicular to
169
- # the image.
170
- #
171
- # @return [Float] A value in the range [-180,180].
172
- #
173
- def yaw
174
- @grpc.pan_angle
175
- end
176
- alias pan yaw
177
-
178
- ##
179
- # Pitch (tilt) angle. Indicates the upwards/downwards angle that the
180
- # face is pointing relative to the image's horizontal plane.
181
- #
182
- # @return [Float] A value in the range [-180,180].
183
- #
184
- def pitch
185
- @grpc.tilt_angle
186
- end
187
- alias tilt pitch
188
-
189
- ##
190
- # Returns the object's property values as an array.
191
- #
192
- # @return [Array]
193
- #
194
- def to_a
195
- [roll, yaw, pitch]
196
- end
197
-
198
- ##
199
- # Converts object to a hash. All keys will be symbolized.
200
- #
201
- # @return [Hash]
202
- #
203
- def to_h
204
- { roll: roll, yaw: yaw, pitch: pitch }
205
- end
206
-
207
- # @private
208
- def to_s
209
- format "(roll: %s, yaw: %s, pitch: %s)", roll.inspect,
210
- yaw.inspect, pitch.inspect
211
- end
212
-
213
- # @private
214
- def inspect
215
- "#<Angles #{self}>"
216
- end
217
-
218
- ##
219
- # @private New Annotation::Face::Angles from a GRPC
220
- # object.
221
- def self.from_grpc grpc
222
- new.tap { |f| f.instance_variable_set :@grpc, grpc }
223
- end
224
- end
225
-
226
- ##
227
- # # Bounds
228
- #
229
- # Bounding polygons around the face.
230
- #
231
- # See {Face}.
232
- #
233
- # @example
234
- # require "google/cloud/vision"
235
- #
236
- # vision = Google::Cloud::Vision.new
237
- #
238
- # image = vision.image "path/to/face.jpg"
239
- # face = image.face
240
- #
241
- # face.bounds.face.count #=> 4
242
- # vertex = face.bounds.face.first
243
- # vertex.x #=> 28
244
- # vertex.y #=> 40
245
- #
246
- class Bounds
247
- ##
248
- # @private The FaceAnnotation GRPC object.
249
- attr_accessor :grpc
250
-
251
- ##
252
- # @private Creates a new Bounds instance.
253
- def initialize
254
- @grpc = nil
255
- end
256
-
257
- ##
258
- # The bounding polygon around the face. The coordinates of the
259
- # bounding box are in the original image's scale, as returned in
260
- # ImageParams. The bounding box is computed to "frame" the face in
261
- # accordance with human expectations. It is based on the landmarker
262
- # results. Note that one or more x and/or y coordinates may not be
263
- # generated in the BoundingPoly (the polygon will be unbounded) if
264
- # only a partial face appears in the image to be annotated.
265
- def head
266
- return [] unless @grpc.bounding_poly
267
- @head ||= Array(@grpc.bounding_poly.vertices).map do |v|
268
- Vertex.from_grpc v
269
- end
270
- end
271
-
272
- ##
273
- # This bounding polygon is tighter than the {#head}, and encloses
274
- # only the skin part of the face. Typically, it is used to eliminate
275
- # the face from any image annotation that detects the "amount of
276
- # skin" visible in an image. It is not based on the landmarks, only
277
- # on the initial face detection.
278
- def face
279
- return [] unless @grpc.fd_bounding_poly
280
- @face ||= Array(@grpc.fd_bounding_poly.vertices).map do |v|
281
- Vertex.from_grpc v
282
- end
283
- end
284
-
285
- ##
286
- # Returns the object's property values as an array.
287
- #
288
- # @return [Array]
289
- #
290
- def to_a
291
- [head.map(&:to_a), face.map(&:to_a)]
292
- end
293
-
294
- ##
295
- # Deeply converts object to a hash. All keys will be symbolized.
296
- #
297
- # @return [Hash]
298
- #
299
- def to_h
300
- { head: head.map(&:to_h), face: face.map(&:to_h) }
301
- end
302
-
303
- # @private
304
- def to_s
305
- "(head: #{head.inspect}, face: #{face.inspect})"
306
- end
307
-
308
- # @private
309
- def inspect
310
- "#<Bounds #{self}>"
311
- end
312
-
313
- ##
314
- # @private New Annotation::Face::Angles from a GRPC
315
- # object.
316
- def self.from_grpc grpc
317
- new.tap { |f| f.instance_variable_set :@grpc, grpc }
318
- end
319
- end
320
-
321
- ##
322
- # # Features
323
- #
324
- # Represents facial landmarks or features. Left and right are defined
325
- # from the vantage of the viewer of the image, without considering
326
- # mirror projections typical of photos. So `face.features.eyes.left`
327
- # typically is the person's right eye.
328
- #
329
- # See {Face}.
330
- #
331
- # @see https://cloud.google.com/vision/reference/rest/v1/images/annotate#Type_1
332
- # images.annotate Type
333
- #
334
- # @example
335
- # require "google/cloud/vision"
336
- #
337
- # vision = Google::Cloud::Vision.new
338
- #
339
- # image = vision.image "path/to/face.jpg"
340
- # face = image.face
341
- #
342
- # face.features.to_h.count #=> 9
343
- # face.features.eyes.left.pupil
344
- # #<Landmark (x: 190.41544, y: 84.4557, z: -1.3682901)>
345
- # face.features.chin.center
346
- # #<Landmark (x: 233.21977, y: 189.47475, z: 19.487228)>
347
- #
348
- class Features
349
- ##
350
- # @private The FaceAnnotation GRPC object.
351
- attr_accessor :grpc
352
-
353
- ##
354
- # @private Creates a new Features instance.
355
- def initialize
356
- @grpc = nil
357
- end
358
-
359
- ##
360
- # The confidence of the facial landmarks detection.
361
- #
362
- # @return [Float] A value in the range [0,1].
363
- #
364
- def confidence
365
- @grpc.landmarking_confidence
366
- end
367
-
368
- ##
369
- # Returns the facial landmark for the provided type code.
370
- #
371
- # @see https://cloud.google.com/vision/reference/rest/v1/images/annotate#Type_1
372
- # images.annotate Type
373
- #
374
- # @param [String, Symbol] landmark_type An `images.annotate` type
375
- # code from the [Vision
376
- # API](https://cloud.google.com/vision/reference/rest/v1/images/annotate#Type_1).
377
- #
378
- # @return [Landmark]
379
- #
380
- # @example
381
- # require "google/cloud/vision"
382
- #
383
- # vision = Google::Cloud::Vision.new
384
- #
385
- # image = vision.image "path/to/face.jpg"
386
- # face = image.face
387
- #
388
- # face.features["RIGHT_EAR_TRAGION"]
389
- # #<Landmark (x: 303.81198, y: 88.5782, z: 77.719193)>
390
- #
391
- def [] landmark_type
392
- landmark = Array(@grpc.landmarks).detect do |l|
393
- l.type == landmark_type
394
- end
395
- return nil if landmark.nil?
396
- Landmark.from_grpc landmark
397
- end
398
-
399
- ##
400
- # The landmarks of the chin.
401
- #
402
- # @return [Chin]
403
- #
404
- def chin
405
- @chin ||= Chin.new self[:CHIN_LEFT_GONION],
406
- self[:CHIN_GNATHION],
407
- self[:CHIN_RIGHT_GONION]
408
- end
409
-
410
- ##
411
- # The landmarks of the ears.
412
- #
413
- # @return [Ears]
414
- #
415
- def ears
416
- @ears ||= Ears.new self[:LEFT_EAR_TRAGION],
417
- self[:RIGHT_EAR_TRAGION]
418
- end
419
-
420
- ##
421
- # The landmarks of the eyebrows.
422
- #
423
- # @return [Eyebrows]
424
- #
425
- def eyebrows
426
- @eyebrows ||= begin
427
- left = Eyebrow.new self[:LEFT_OF_LEFT_EYEBROW],
428
- self[:LEFT_EYEBROW_UPPER_MIDPOINT],
429
- self[:RIGHT_OF_LEFT_EYEBROW]
430
- right = Eyebrow.new self[:LEFT_OF_RIGHT_EYEBROW],
431
- self[:RIGHT_EYEBROW_UPPER_MIDPOINT],
432
- self[:RIGHT_OF_RIGHT_EYEBROW]
433
- Eyebrows.new left, right
434
- end
435
- end
436
-
437
- ##
438
- # The landmarks of the eyes.
439
- #
440
- # @return [Eyes]
441
- #
442
- def eyes
443
- @eyes ||= begin
444
- left = Eye.new self[:LEFT_EYE_LEFT_CORNER],
445
- self[:LEFT_EYE_BOTTOM_BOUNDARY],
446
- self[:LEFT_EYE], self[:LEFT_EYE_PUPIL],
447
- self[:LEFT_EYE_TOP_BOUNDARY],
448
- self[:LEFT_EYE_RIGHT_CORNER]
449
- right = Eye.new self[:RIGHT_EYE_LEFT_CORNER],
450
- self[:RIGHT_EYE_BOTTOM_BOUNDARY],
451
- self[:RIGHT_EYE], self[:RIGHT_EYE_PUPIL],
452
- self[:RIGHT_EYE_TOP_BOUNDARY],
453
- self[:RIGHT_EYE_RIGHT_CORNER]
454
- Eyes.new left, right
455
- end
456
- end
457
-
458
- ##
459
- # The landmark for the forehead glabella.
460
- #
461
- # @return [Landmark]
462
- #
463
- def forehead
464
- @forehead ||= self[:FOREHEAD_GLABELLA]
465
- end
466
-
467
- ##
468
- # The landmarks of the lips.
469
- #
470
- # @return [Lips]
471
- #
472
- def lips
473
- @lips ||= Lips.new self[:UPPER_LIP], self[:LOWER_LIP]
474
- end
475
-
476
- ##
477
- # The landmarks of the mouth.
478
- #
479
- # @return [Mouth]
480
- #
481
- def mouth
482
- @mouth ||= Mouth.new self[:MOUTH_LEFT], self[:MOUTH_CENTER],
483
- self[:MOUTH_RIGHT]
484
- end
485
-
486
- ##
487
- # The landmarks of the nose.
488
- #
489
- # @return [Nose]
490
- #
491
- def nose
492
- @nose ||= Nose.new self[:NOSE_BOTTOM_LEFT],
493
- self[:NOSE_BOTTOM_CENTER], self[:NOSE_TIP],
494
- self[:MIDPOINT_BETWEEN_EYES],
495
- self[:NOSE_BOTTOM_RIGHT]
496
- end
497
-
498
- ##
499
- # Deeply converts object to a hash. All keys will be symbolized.
500
- #
501
- # @return [Hash]
502
- #
503
- def to_h
504
- { confidence: confidence, chin: chin.to_h, ears: ears.to_h,
505
- eyebrows: eyebrows.to_h, eyes: eyes.to_h,
506
- forehead: forehead.to_h, lips: lips.to_h, mouth: mouth.to_h,
507
- nose: nose.to_h }
508
- end
509
-
510
- # @private
511
- def to_s
512
- # Keep console output low by not showing all sub-objects.
513
- "(confidence, chin, ears, eyebrows, eyes, " \
514
- "forehead, lips, mouth, nose)"
515
- end
516
-
517
- # @private
518
- def inspect
519
- "#<Features #{self}>"
520
- end
521
-
522
- ##
523
- # @private New Annotation::Face::Features from a GRPC
524
- # object.
525
- def self.from_grpc grpc
526
- new.tap { |f| f.instance_variable_set :@grpc, grpc }
527
- end
528
-
529
- ##
530
- # # Landmark
531
- #
532
- # A face-specific landmark (for example, a face feature). Landmark
533
- # positions may fall outside the bounds of the image when the face
534
- # is near one or more edges of the image. Therefore it is NOT
535
- # guaranteed that `0 <= x < width` or `0 <= y < height`.
536
- #
537
- # See {Features} and {Face}.
538
- #
539
- # @example
540
- # require "google/cloud/vision"
541
- #
542
- # vision = Google::Cloud::Vision.new
543
- #
544
- # image = vision.image "path/to/face.jpg"
545
- # face = image.face
546
- #
547
- # face.features.to_h.count #=> 9
548
- # face.features.eyes.left.pupil
549
- # #<Landmark (x: 190.41544, y: 84.4557, z: -1.3682901)>
550
- # face.features.chin.center
551
- # #<Landmark (x: 233.21977, y: 189.47475, z: 19.487228)>
552
- #
553
- class Landmark
554
- ##
555
- # @private The Landmark GRPC object.
556
- attr_accessor :grpc
557
-
558
- ##
559
- # @private Creates a new Landmark instance.
560
- def initialize
561
- @grpc = nil
562
- end
563
-
564
- ##
565
- # The landmark type code.
566
- #
567
- # @see https://cloud.google.com/vision/reference/rest/v1/images/annotate#Type_1
568
- # images.annotate Type
569
- #
570
- # @return [String]
571
- #
572
- # @example
573
- # require "google/cloud/vision"
574
- #
575
- # vision = Google::Cloud::Vision.new
576
- #
577
- # image = vision.image "path/to/face.jpg"
578
- # face = image.face
579
- #
580
- # face.features.forehead.type #=> :FOREHEAD_GLABELLA
581
- #
582
- def type
583
- @grpc.type
584
- end
585
-
586
- ##
587
- # The X (horizontal) coordinate.
588
- #
589
- # @return [Float]
590
- #
591
- def x
592
- return nil unless @grpc.position
593
- @grpc.position.x
594
- end
595
-
596
- ##
597
- # The Y (vertical) coordinate.
598
- #
599
- # @return [Float]
600
- #
601
- def y
602
- return nil unless @grpc.position
603
- @grpc.position.y
604
- end
605
-
606
- ##
607
- # The Z (depth) coordinate.
608
- #
609
- # @return [Float]
610
- #
611
- def z
612
- return nil unless @grpc.position
613
- @grpc.position.z
614
- end
615
-
616
- ##
617
- # Returns the object's property values as an array.
618
- #
619
- # @return [Array]
620
- #
621
- def to_a
622
- [x, y, z]
623
- end
624
-
625
- ##
626
- # Converts object to a hash. All keys will be symbolized.
627
- #
628
- # @return [Hash]
629
- #
630
- def to_h
631
- { x: x, y: y, z: z }
632
- end
633
-
634
- # @private
635
- def to_s
636
- "(x: #{x.inspect}, y: #{y.inspect}, z: #{z.inspect})"
637
- end
638
-
639
- # @private
640
- def inspect
641
- "#<Landmark #{self}>"
642
- end
643
-
644
- ##
645
- # @private New Annotation::Face::Features from a GRPC
646
- # object.
647
- def self.from_grpc grpc
648
- new.tap { |f| f.instance_variable_set :@grpc, grpc }
649
- end
650
- end
651
-
652
- ##
653
- # # Chin
654
- #
655
- # The landmarks of the chin in the features of a face.
656
- #
657
- # Left and right are defined from the vantage of the viewer of the
658
- # image, without considering mirror projections typical of photos.
659
- # So `face.features.eyes.left` typically is the person's right eye.
660
- #
661
- # See {Features} and {Face}.
662
- #
663
- # @attr_reader [Landmark] left The chin, left gonion.
664
- # @attr_reader [Landmark] center The chin, gnathion.
665
- # @attr_reader [Landmark] right The chin, right gonion.
666
- #
667
- # @example
668
- # require "google/cloud/vision"
669
- #
670
- # vision = Google::Cloud::Vision.new
671
- #
672
- # image = vision.image "path/to/face.jpg"
673
- # face = image.face
674
- #
675
- # chin = face.features.chin
676
- #
677
- # chin.center
678
- # #<Landmark (x: 233.21977, y: 189.47475, z: 19.487228)>
679
- #
680
- class Chin
681
- attr_reader :left, :center, :right
682
-
683
- ##
684
- # @private Creates a new Chin instance.
685
- def initialize left, center, right
686
- @left = left
687
- @center = center
688
- @right = right
689
- end
690
-
691
- ##
692
- # Returns the object's property values as an array.
693
- #
694
- # @return [Array]
695
- #
696
- def to_a
697
- [left, center, right]
698
- end
699
-
700
- ##
701
- # Deeply converts object to a hash. All keys will be symbolized.
702
- #
703
- # @return [Hash]
704
- #
705
- def to_h
706
- { left: left.to_h, center: center.to_h, right: right.to_h }
707
- end
708
-
709
- # @private
710
- def to_s
711
- format "(left: %s, center: %s, right: %s)", left.inspect,
712
- center.inspect, right.inspect
713
- end
714
-
715
- # @private
716
- def inspect
717
- "#<Chin #{self}>"
718
- end
719
- end
720
-
721
- ##
722
- # # Ears
723
- #
724
- # The landmarks for the ear tragions.
725
- #
726
- # Left and right are defined from the vantage of the viewer of the
727
- # image, without considering mirror projections typical of photos.
728
- # So `face.features.eyes.left` typically is the person's right eye.
729
- #
730
- # See {Features} and {Face}.
731
- #
732
- # @attr_reader [Landmark] left The left ear tragion.
733
- # @attr_reader [Landmark] right The right ear tragion.
734
- #
735
- # @see https://cloud.google.com/vision/reference/rest/v1/images/annotate#Type_1
736
- # images.annotate Type
737
- #
738
- # @example
739
- # require "google/cloud/vision"
740
- #
741
- # vision = Google::Cloud::Vision.new
742
- #
743
- # image = vision.image "path/to/face.jpg"
744
- # face = image.face
745
- #
746
- # ears = face.features.ears
747
- # ears.right
748
- # #<Landmark (x: 303.81198, y: 88.5782, z: 77.719193)>
749
- #
750
- class Ears
751
- attr_reader :left, :right
752
-
753
- ##
754
- # @private Creates a new Ears instance.
755
- def initialize left, right
756
- @left = left
757
- @right = right
758
- end
759
-
760
- ##
761
- # Returns the object's property values as an array.
762
- #
763
- # @return [Array]
764
- #
765
- def to_a
766
- [left, right]
767
- end
768
-
769
- ##
770
- # Deeply converts object to a hash. All keys will be symbolized.
771
- #
772
- # @return [Hash]
773
- #
774
- def to_h
775
- { left: left.to_h, right: right.to_h }
776
- end
777
-
778
- # @private
779
- def to_s
780
- "(left: #{left.inspect}, right: #{right.inspect})"
781
- end
782
-
783
- # @private
784
- def inspect
785
- "#<Ears #{self}>"
786
- end
787
- end
788
-
789
- ##
790
- # # Eyebrows
791
- #
792
- # The landmarks of the eyebrows in the features of a face.
793
- #
794
- # Left and right are defined from the vantage of the viewer of the
795
- # image, without considering mirror projections typical of photos.
796
- # So `face.features.eyes.left` typically is the person's right eye.
797
- #
798
- # See {Features} and {Face}.
799
- #
800
- # @attr_reader [Eyebrow] left The left eyebrow.
801
- # @attr_reader [Eyebrow] right The right eyebrow.
802
- #
803
- # @see https://cloud.google.com/vision/reference/rest/v1/images/annotate#Type_1
804
- # images.annotate Type
805
- #
806
- # @example
807
- # require "google/cloud/vision"
808
- #
809
- # vision = Google::Cloud::Vision.new
810
- #
811
- # image = vision.image "path/to/face.jpg"
812
- # face = image.face
813
- #
814
- # eyebrows = face.features.eyebrows
815
- #
816
- # right_eyebrow = eyebrows.right
817
- # right_eyebrow.top
818
- # #<Landmark (x: 256.3194, y: 58.222664, z: -17.299419)>
819
- #
820
- class Eyebrows
821
- attr_reader :left, :right
822
-
823
- ##
824
- # @private Creates a new Eyebrows instance.
825
- def initialize left, right
826
- @left = left
827
- @right = right
828
- end
829
-
830
- ##
831
- # Returns the object's property values as an array.
832
- #
833
- # @return [Array]
834
- #
835
- def to_a
836
- [left, right]
837
- end
838
-
839
- ##
840
- # Deeply converts object to a hash. All keys will be symbolized.
841
- #
842
- # @return [Hash]
843
- #
844
- def to_h
845
- { left: left.to_h, right: right.to_h }
846
- end
847
-
848
- # @private
849
- def to_s
850
- "(left: #{left.inspect}, right: #{right.inspect})"
851
- end
852
-
853
- # @private
854
- def inspect
855
- "#<Eyebrows #{self}>"
856
- end
857
- end
858
-
859
- ##
860
- # # Eyebrow
861
- #
862
- # The landmarks of an eyebrow in the features of a face.
863
- #
864
- # Left and right are defined from the vantage of the viewer of the
865
- # image, without considering mirror projections typical of photos.
866
- # So `face.features.eyes.left` typically is the person's right eye.
867
- #
868
- # See {Eyebrows}, {Features} and {Face}.
869
- #
870
- # @see https://cloud.google.com/vision/reference/rest/v1/images/annotate#Type_1
871
- # images.annotate Type
872
- #
873
- # @attr_reader [Landmark] left The eyebrow, left.
874
- # @attr_reader [Landmark] top The eyebrow, upper midpoint.
875
- # @attr_reader [Landmark] right The eyebrow, right.
876
- #
877
- # @example
878
- # require "google/cloud/vision"
879
- #
880
- # vision = Google::Cloud::Vision.new
881
- #
882
- # image = vision.image "path/to/face.jpg"
883
- # face = image.face
884
- #
885
- # eyebrows = face.features.eyebrows
886
- #
887
- # right_eyebrow = eyebrows.right
888
- # right_eyebrow.top
889
- # #<Landmark (x: 256.3194, y: 58.222664, z: -17.299419)>
890
- #
891
- class Eyebrow
892
- attr_reader :left, :top, :right
893
-
894
- ##
895
- # @private Creates a new Eyebrow instance.
896
- def initialize left, top, right
897
- @left = left
898
- @top = top
899
- @right = right
900
- end
901
-
902
- ##
903
- # Returns the object's property values as an array.
904
- #
905
- # @return [Array]
906
- #
907
- def to_a
908
- [left, top, right]
909
- end
910
-
911
- ##
912
- # Deeply converts object to a hash. All keys will be symbolized.
913
- #
914
- # @return [Hash]
915
- #
916
- def to_h
917
- { left: left.to_h, top: top.to_h, right: right.to_h }
918
- end
919
-
920
- # @private
921
- def to_s
922
- format "(left: %s, top: %s, right: %s)", left.inspect,
923
- top.inspect, right.inspect
924
- end
925
-
926
- # @private
927
- def inspect
928
- "#<Eyebrow #{self}>"
929
- end
930
- end
931
-
932
- ##
933
- # # Eyes
934
- #
935
- # The landmarks of the eyes in the features of a face.
936
- #
937
- # Left and right are defined from the vantage of the viewer of the
938
- # image, without considering mirror projections typical of photos.
939
- # So `face.features.eyes.left` typically is the person's right eye.
940
- #
941
- # See {Features} and {Face}.
942
- #
943
- # @see https://cloud.google.com/vision/reference/rest/v1/images/annotate#Type_1
944
- # images.annotate Type
945
- #
946
- # @attr_reader [Eye] left The left eye.
947
- # @attr_reader [Eye] right The right eye.
948
- #
949
- # @example
950
- # require "google/cloud/vision"
951
- #
952
- # vision = Google::Cloud::Vision.new
953
- #
954
- # image = vision.image "path/to/face.jpg"
955
- # face = image.face
956
- #
957
- # eyes = face.features.eyes
958
- #
959
- # right_eye = eyes.right
960
- # right_eye.pupil
961
- # #<Landmark (x: 256.63464, y: 79.641411, z: -6.0731235)>
962
- #
963
- class Eyes
964
- attr_reader :left, :right
965
-
966
- ##
967
- # @private Creates a new Eyes instance.
968
- def initialize left, right
969
- @left = left
970
- @right = right
971
- end
972
-
973
- ##
974
- # Returns the object's property values as an array.
975
- #
976
- # @return [Array]
977
- #
978
- def to_a
979
- [left, right]
980
- end
981
-
982
- ##
983
- # Deeply converts object to a hash. All keys will be symbolized.
984
- #
985
- # @return [Hash]
986
- #
987
- def to_h
988
- { left: left.to_h, right: right.to_h }
989
- end
990
-
991
- # @private
992
- def to_s
993
- "(left: #{left.inspect}, right: #{right.inspect})"
994
- end
995
-
996
- # @private
997
- def inspect
998
- "#<Eyes #{self}>"
999
- end
1000
- end
1001
-
1002
- ##
1003
- # # Eye
1004
- #
1005
- # The landmarks of an eye in the features of a face.
1006
- #
1007
- # Left and right are defined from the vantage of the viewer of the
1008
- # image, without considering mirror projections typical of photos.
1009
- # So `face.features.eyes.left` typically is the person's right eye.
1010
- #
1011
- # See {Eyes}, {Features} and {Face}.
1012
- #
1013
- # @see https://cloud.google.com/vision/reference/rest/v1/images/annotate#Type_1
1014
- # images.annotate Type
1015
- #
1016
- # @attr_reader [Landmark] left The eye, left corner.
1017
- # @attr_reader [Landmark] bottom The eye, bottom boundary.
1018
- # @attr_reader [Landmark] center The eye, center.
1019
- # @attr_reader [Landmark] pupil The eye pupil.
1020
- # @attr_reader [Landmark] top The eye, top boundary.
1021
- # @attr_reader [Landmark] right The eye, right corner.
1022
- #
1023
- # @example
1024
- # require "google/cloud/vision"
1025
- #
1026
- # vision = Google::Cloud::Vision.new
1027
- #
1028
- # image = vision.image "path/to/face.jpg"
1029
- # face = image.face
1030
- #
1031
- # right_eye = face.features.eyes.right
1032
- #
1033
- # right_eye.pupil
1034
- # #<Landmark (x: 256.63464, y: 79.641411, z: -6.0731235)>
1035
- #
1036
- class Eye
1037
- attr_reader :left, :bottom, :center, :pupil, :top, :right
1038
-
1039
- ##
1040
- # @private Creates a new Eye instance.
1041
- def initialize left, bottom, center, pupil, top, right
1042
- @left = left
1043
- @bottom = bottom
1044
- @center = center
1045
- @pupil = pupil
1046
- @top = top
1047
- @right = right
1048
- end
1049
-
1050
- ##
1051
- # Returns the object's property values as an array.
1052
- #
1053
- # @return [Array]
1054
- #
1055
- def to_a
1056
- [left, top, right]
1057
- end
1058
-
1059
- ##
1060
- # Deeply converts object to a hash. All keys will be symbolized.
1061
- #
1062
- # @return [Hash]
1063
- #
1064
- def to_h
1065
- { left: left.to_h, bottom: bottom.to_h, center: center.to_h,
1066
- pupil: pupil.to_h, top: top.to_h, right: right.to_h }
1067
- end
1068
-
1069
- # @private
1070
- def to_s
1071
- tmplt = "(left: %s, bottom: %s, center: %s, " \
1072
- "pupil: %s, top: %s, right: %s)"
1073
- format tmplt, left.inspect, bottom.inspect, center.inspect,
1074
- pupil.inspect, top.inspect, right.inspect
1075
- end
1076
-
1077
- # @private
1078
- def inspect
1079
- "#<Eye #{self}>"
1080
- end
1081
- end
1082
-
1083
- ##
1084
- # # Lips
1085
- #
1086
- # The landmarks of the lips in the features of a face.
1087
- #
1088
- # See {Features} and {Face}.
1089
- #
1090
- # @see https://cloud.google.com/vision/reference/rest/v1/images/annotate#Type_1
1091
- # images.annotate Type
1092
- #
1093
- # @attr_reader [Landmark] top The upper lip.
1094
- # @attr_reader [Landmark] bottom The lower lip.
1095
- #
1096
- # @example
1097
- # require "google/cloud/vision"
1098
- #
1099
- # vision = Google::Cloud::Vision.new
1100
- #
1101
- # image = vision.image "path/to/face.jpg"
1102
- # face = image.face
1103
- #
1104
- # lips = face.features.lips
1105
- #
1106
- # lips.top
1107
- # #<Landmark (x: 228.54768, y: 143.2952, z: -5.6550336)>
1108
- #
1109
- class Lips
1110
- attr_reader :top, :bottom
1111
-
1112
- alias upper top
1113
- alias lower bottom
1114
-
1115
- ##
1116
- # @private Creates a new Lips instance.
1117
- def initialize top, bottom
1118
- @top = top
1119
- @bottom = bottom
1120
- end
1121
-
1122
- ##
1123
- # Returns the object's property values as an array.
1124
- #
1125
- # @return [Array]
1126
- #
1127
- def to_a
1128
- [top, bottom]
1129
- end
1130
-
1131
- ##
1132
- # Deeply converts object to a hash. All keys will be symbolized.
1133
- #
1134
- # @return [Hash]
1135
- #
1136
- def to_h
1137
- { top: top.to_h, bottom: bottom.to_h }
1138
- end
1139
-
1140
- # @private
1141
- def to_s
1142
- "(top: #{top.inspect}, bottom: #{bottom.inspect})"
1143
- end
1144
-
1145
- # @private
1146
- def inspect
1147
- "#<Lips #{self}>"
1148
- end
1149
- end
1150
-
1151
- ##
1152
- # # Mouth
1153
- #
1154
- # The landmarks of the mouth in the features of a face.
1155
- #
1156
- # Left and right are defined from the vantage of the viewer of the
1157
- # image, without considering mirror projections typical of photos.
1158
- # So `face.features.eyes.left` typically is the person's right eye.
1159
- #
1160
- # See {Features} and {Face}.
1161
- #
1162
- # @see https://cloud.google.com/vision/reference/rest/v1/images/annotate#Type_1
1163
- # images.annotate Type
1164
- #
1165
- # @attr_reader [Landmark] left The mouth, left.
1166
- # @attr_reader [Landmark] center The mouth, center.
1167
- # @attr_reader [Landmark] right TThe mouth, right.
1168
- #
1169
- # @example
1170
- # require "google/cloud/vision"
1171
- #
1172
- # vision = Google::Cloud::Vision.new
1173
- #
1174
- # image = vision.image "path/to/face.jpg"
1175
- # face = image.face
1176
- #
1177
- # mouth = face.features.mouth
1178
- #
1179
- # mouth.center
1180
- # #<Landmark (x: 228.53499, y: 150.29066, z: 1.1069832)>
1181
- #
1182
- class Mouth
1183
- attr_reader :left, :center, :right
1184
-
1185
- ##
1186
- # @private Creates a new Mouth instance.
1187
- def initialize left, center, right
1188
- @left = left
1189
- @center = center
1190
- @right = right
1191
- end
1192
-
1193
- ##
1194
- # Returns the object's property values as an array.
1195
- #
1196
- # @return [Array]
1197
- #
1198
- def to_a
1199
- [left, center, right]
1200
- end
1201
-
1202
- ##
1203
- # Deeply converts object to a hash. All keys will be symbolized.
1204
- #
1205
- # @return [Hash]
1206
- #
1207
- def to_h
1208
- { left: left.to_h, center: center.to_h, right: right.to_h }
1209
- end
1210
-
1211
- # @private
1212
- def to_s
1213
- format "(left: %s, center: %s, right: %s)", left.inspect,
1214
- center.inspect, right.inspect
1215
- end
1216
-
1217
- # @private
1218
- def inspect
1219
- "#<Mouth #{self}>"
1220
- end
1221
- end
1222
-
1223
- ##
1224
- # # Nose
1225
- #
1226
- # The landmarks of the nose in the features of a face.
1227
- #
1228
- # Left and right are defined from the vantage of the viewer of the
1229
- # image, without considering mirror projections typical of photos.
1230
- # So `face.features.eyes.left` typically is the person's right eye.
1231
- #
1232
- # See {Features} and {Face}.
1233
- #
1234
- # @see https://cloud.google.com/vision/reference/rest/v1/images/annotate#Type_1
1235
- # images.annotate Type
1236
- #
1237
- # @attr_reader [Landmark] left The nose, bottom left.
1238
- # @attr_reader [Landmark] bottom The nose, bottom center.
1239
- # @attr_reader [Landmark] tip The nose tip.
1240
- # @attr_reader [Landmark] top The midpoint between the eyes.
1241
- # @attr_reader [Landmark] right The nose, bottom right.
1242
- #
1243
- # @example
1244
- # require "google/cloud/vision"
1245
- #
1246
- # vision = Google::Cloud::Vision.new
1247
- #
1248
- # image = vision.image "path/to/face.jpg"
1249
- # face = image.face
1250
- #
1251
- # nose = face.features.nose
1252
- #
1253
- # nose.tip
1254
- # #<Landmark (x: 225.23511, y: 122.47372, z: -25.817825)>
1255
- #
1256
- class Nose
1257
- attr_reader :left, :bottom, :tip, :top, :right
1258
-
1259
- ##
1260
- # @private Creates a new Nose instance.
1261
- def initialize left, bottom, tip, top, right
1262
- @left = left
1263
- @bottom = bottom
1264
- @tip = tip
1265
- @top = top
1266
- @right = right
1267
- end
1268
-
1269
- ##
1270
- # Returns the object's property values as an array.
1271
- #
1272
- # @return [Array]
1273
- #
1274
- def to_a
1275
- [left, bottom, tip, top, right]
1276
- end
1277
-
1278
- ##
1279
- # Deeply converts object to a hash. All keys will be symbolized.
1280
- #
1281
- # @return [Hash]
1282
- #
1283
- def to_h
1284
- { left: left.to_h, bottom: bottom.to_h, tip: tip.to_h,
1285
- top: top.to_h, right: right.to_h }
1286
- end
1287
-
1288
- # @private
1289
- def to_s
1290
- tmplt = "(left: %s, bottom: %s, tip: %s, " \
1291
- "top: %s, right: %s)"
1292
- format tmplt, left.inspect, bottom.inspect, tip.inspect,
1293
- top.inspect, right.inspect
1294
- end
1295
-
1296
- # @private
1297
- def inspect
1298
- "#<Nose #{self}>"
1299
- end
1300
- end
1301
- end
1302
-
1303
- ##
1304
- # # Likelihood
1305
- #
1306
- # A bucketized representation of likelihood of various separate facial
1307
- # characteristics, meant to give highly stable results across model
1308
- # upgrades.
1309
- #
1310
- # See {Face}.
1311
- #
1312
- # @see https://cloud.google.com/vision/reference/rest/v1/images/annotate#Likelihood
1313
- # images.annotate Likelihood
1314
- #
1315
- # @example
1316
- # require "google/cloud/vision"
1317
- #
1318
- # vision = Google::Cloud::Vision.new
1319
- #
1320
- # image = vision.image "path/to/face.jpg"
1321
- # face = image.face
1322
- #
1323
- # face.likelihood.to_h.count #=> 7
1324
- # face.likelihood.sorrow? #=> false
1325
- # face.likelihood.sorrow #=> :VERY_UNLIKELY
1326
- #
1327
- class Likelihood
1328
- POSITIVE_RATINGS = %i[POSSIBLE LIKELY VERY_LIKELY].freeze
1329
-
1330
- ##
1331
- # @private The FaceAnnotation GRPC object.
1332
- attr_accessor :grpc
1333
-
1334
- ##
1335
- # @private Creates a new Likelihood instance.
1336
- def initialize
1337
- @grpc = nil
1338
- end
1339
-
1340
- ##
1341
- # Joy likelihood rating. Possible values are `VERY_UNLIKELY`,
1342
- # `UNLIKELY`, `POSSIBLE`, `LIKELY`, and `VERY_LIKELY`.
1343
- def joy
1344
- @grpc.joy_likelihood
1345
- end
1346
-
1347
- ##
1348
- # Joy likelihood. Returns `true` if {#joy} is `POSSIBLE`, `LIKELY`,
1349
- # or `VERY_LIKELY`.
1350
- #
1351
- # @return [Boolean]
1352
- #
1353
- def joy?
1354
- POSITIVE_RATINGS.include? joy
1355
- end
1356
-
1357
- ##
1358
- # Sorrow likelihood rating. Possible values are `VERY_UNLIKELY`,
1359
- # `UNLIKELY`, `POSSIBLE`, `LIKELY`, and `VERY_LIKELY`.
1360
- def sorrow
1361
- @grpc.sorrow_likelihood
1362
- end
1363
-
1364
- ##
1365
- # Sorrow likelihood. Returns `true` if {#sorrow} is `POSSIBLE`,
1366
- # `LIKELY`, or `VERY_LIKELY`.
1367
- #
1368
- # @return [Boolean]
1369
- #
1370
- def sorrow?
1371
- POSITIVE_RATINGS.include? sorrow
1372
- end
1373
-
1374
- ##
1375
- # Joy likelihood rating. Possible values are `VERY_UNLIKELY`,
1376
- # `UNLIKELY`, `POSSIBLE`, `LIKELY`, and `VERY_LIKELY`.
1377
- def anger
1378
- @grpc.anger_likelihood
1379
- end
1380
-
1381
- ##
1382
- # Anger likelihood. Returns `true` if {#anger} is `POSSIBLE`,
1383
- # `LIKELY`, or `VERY_LIKELY`.
1384
- #
1385
- # @return [Boolean]
1386
- #
1387
- def anger?
1388
- POSITIVE_RATINGS.include? anger
1389
- end
1390
-
1391
- ##
1392
- # Surprise likelihood rating. Possible values are `VERY_UNLIKELY`,
1393
- # `UNLIKELY`, `POSSIBLE`, `LIKELY`, and `VERY_LIKELY`.
1394
- def surprise
1395
- @grpc.surprise_likelihood
1396
- end
1397
-
1398
- ##
1399
- # Surprise likelihood. Returns `true` if {#surprise} is `POSSIBLE`,
1400
- # `LIKELY`, or `VERY_LIKELY`.
1401
- #
1402
- # @return [Boolean]
1403
- #
1404
- def surprise?
1405
- POSITIVE_RATINGS.include? surprise
1406
- end
1407
-
1408
- ##
1409
- # Under Exposed likelihood rating. Possible values are
1410
- # `VERY_UNLIKELY`, `UNLIKELY`, `POSSIBLE`, `LIKELY`, and
1411
- # `VERY_LIKELY`.
1412
- def under_exposed
1413
- @grpc.under_exposed_likelihood
1414
- end
1415
-
1416
- ##
1417
- # Under Exposed likelihood. Returns `true` if {#under_exposed} is
1418
- # `POSSIBLE`, `LIKELY`, or `VERY_LIKELY`.
1419
- #
1420
- # @return [Boolean]
1421
- #
1422
- def under_exposed?
1423
- POSITIVE_RATINGS.include? under_exposed
1424
- end
1425
-
1426
- ##
1427
- # Blurred likelihood rating. Possible values are `VERY_UNLIKELY`,
1428
- # `UNLIKELY`, `POSSIBLE`, `LIKELY`, and `VERY_LIKELY`.
1429
- def blurred
1430
- @grpc.blurred_likelihood
1431
- end
1432
-
1433
- ##
1434
- # Blurred likelihood. Returns `true` if {#blurred} is `POSSIBLE`,
1435
- # `LIKELY`, or `VERY_LIKELY`.
1436
- #
1437
- # @return [Boolean]
1438
- #
1439
- def blurred?
1440
- POSITIVE_RATINGS.include? blurred
1441
- end
1442
-
1443
- ##
1444
- # Headwear likelihood rating. Possible values are `VERY_UNLIKELY`,
1445
- # `UNLIKELY`, `POSSIBLE`, `LIKELY`, and `VERY_LIKELY`.
1446
- def headwear
1447
- @grpc.headwear_likelihood
1448
- end
1449
-
1450
- ##
1451
- # Headwear likelihood. Returns `true` if {#headwear} is `POSSIBLE`,
1452
- # `LIKELY`, or `VERY_LIKELY`.
1453
- #
1454
- # @return [Boolean]
1455
- #
1456
- def headwear?
1457
- POSITIVE_RATINGS.include? headwear
1458
- end
1459
-
1460
- ##
1461
- # Converts object to a hash. All keys will be symbolized.
1462
- #
1463
- # @return [Hash]
1464
- #
1465
- def to_h
1466
- { joy: joy?, sorrow: sorrow?, anger: anger?, surprise: surprise?,
1467
- under_exposed: under_exposed?, blurred: blurred?,
1468
- headwear: headwear? }
1469
- end
1470
-
1471
- # @private
1472
- def to_s
1473
- tmplt = "(joy?: %s, sorrow?: %s, anger?: %s, " \
1474
- "surprise?: %s, under_exposed?: %s, blurred?: %s, " \
1475
- "headwear: %s)"
1476
- format tmplt, joy?.inspect, sorrow?.inspect, anger?.inspect,
1477
- surprise?.inspect, under_exposed?.inspect,
1478
- blurred?.inspect, headwear?.inspect
1479
- end
1480
-
1481
- # @private
1482
- def inspect
1483
- "#<Likelihood #{self}>"
1484
- end
1485
-
1486
- ##
1487
- # @private New Annotation::Face::Likelihood from a GRPC
1488
- # object.
1489
- def self.from_grpc grpc
1490
- new.tap { |f| f.instance_variable_set :@grpc, grpc }
1491
- end
1492
- end
1493
- end
1494
- end
1495
- end
1496
- end
1497
- end