gcloud 0.9.0 → 0.10.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.
- checksums.yaml +8 -8
- data/CHANGELOG.md +17 -0
- data/OVERVIEW.md +18 -0
- data/lib/gcloud.rb +38 -0
- data/lib/gcloud/bigquery/table.rb +14 -15
- data/lib/gcloud/datastore/dataset/query_results.rb +5 -6
- data/lib/gcloud/storage/bucket.rb +2 -1
- data/lib/gcloud/storage/connection.rb +4 -14
- data/lib/gcloud/upload.rb +47 -3
- data/lib/gcloud/version.rb +1 -1
- data/lib/gcloud/vision.rb +488 -0
- data/lib/gcloud/vision/annotate.rb +221 -0
- data/lib/gcloud/vision/annotation.rb +455 -0
- data/lib/gcloud/vision/annotation/entity.rb +234 -0
- data/lib/gcloud/vision/annotation/face.rb +1750 -0
- data/lib/gcloud/vision/annotation/properties.rb +245 -0
- data/lib/gcloud/vision/annotation/safe_search.rb +161 -0
- data/lib/gcloud/vision/annotation/text.rb +236 -0
- data/lib/gcloud/vision/annotation/vertex.rb +108 -0
- data/lib/gcloud/vision/connection.rb +54 -0
- data/lib/gcloud/vision/credentials.rb +29 -0
- data/lib/gcloud/vision/errors.rb +69 -0
- data/lib/gcloud/vision/image.rb +593 -0
- data/lib/gcloud/vision/location.rb +112 -0
- data/lib/gcloud/vision/project.rb +280 -0
- metadata +21 -6
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ZDg1NjYxMTkxZjIxYmUzNmMyZGMzNDNlY2Y1MGZiZWYwNWYzZTdjOQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
ZDQwZjAxZGRmZmY4MmNlNGE1NmJiMTc3MTFkYWVmODkzNmFkZmU4Yw==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
YzkwYWVjYWZhYTJjMjY2NWM0ZWFjYmNkZDI3YzBiZjc4YTcwOTVjYjhkZTBk
|
10
|
+
ZmVjMDE4YmQ5Mjc3YmViMzZlNWExOTllMzRmYTE0NTJiMDNkYjI2MDlmMmJk
|
11
|
+
OWU0N2UzODJlYWI3NjU5NDAwODQ2MjAzMDZkODAwMjVmYTEzYTk=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ZTEzMjg3Y2M5ZTAzNjk5MGRjYzZjOTE2ZGQyZjljOTljYjI2NDczMjhkMTgw
|
14
|
+
OWZiZTZiNTg1YjI3ODU3NGY3NzIxMTBjN2Y2YmI1N2IzNTViMjc4MTNhOTFl
|
15
|
+
MWZjMzFkZjFkOTM1NDM2YjU4MWM5ODEwNDdmMWJjNDVhOWQ3MGY=
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,22 @@
|
|
1
1
|
# Release History
|
2
2
|
|
3
|
+
### 0.10.0 / 2016-05-19
|
4
|
+
|
5
|
+
#### Major Changes
|
6
|
+
|
7
|
+
* Add Vision service implementation
|
8
|
+
|
9
|
+
#### Minor Changes
|
10
|
+
|
11
|
+
* BigQuery
|
12
|
+
* Restore chunk_size argument on Gcloud::Bigquery::Table#load (gramos74)
|
13
|
+
* Storage
|
14
|
+
* Gcloud::Storage::Bucket#create_file now uses default chunk_size
|
15
|
+
* Datastore
|
16
|
+
* Fixed documentation (bmclean)
|
17
|
+
* Add Gcloud::Upload.default_chunk_size
|
18
|
+
* Pegged dependency to google-protobuf version 3.0.0.alpha.5.0.5.1
|
19
|
+
|
3
20
|
### 0.9.0 / 2016-05-11
|
4
21
|
|
5
22
|
#### Major Changes
|
data/OVERVIEW.md
CHANGED
@@ -239,3 +239,21 @@ translation.to #=> "la"
|
|
239
239
|
translation.text #=> "Salve mundi!"
|
240
240
|
```
|
241
241
|
|
242
|
+
# Vision
|
243
|
+
|
244
|
+
[Google Cloud Vision](https://cloud.google.com/vision/) ([docs](https://cloud.google.com/vision/docs)) allows developers to easily integrate vision detection features within applications, including image labeling, face and landmark detection, optical character recognition (OCR), and tagging of explicit content.
|
245
|
+
|
246
|
+
See the {Gcloud::Vision gcloud-ruby Cloud Vision API documentation} to learn how to connect to Google Cloud Vision using this library.
|
247
|
+
|
248
|
+
```ruby
|
249
|
+
require "gcloud"
|
250
|
+
|
251
|
+
gcloud = Gcloud.new
|
252
|
+
vision = gcloud.vision
|
253
|
+
|
254
|
+
image = vision.image "path/to/landmark.jpg"
|
255
|
+
|
256
|
+
landmark = image.landmark
|
257
|
+
landmark.description #=> "Mount Rushmore"
|
258
|
+
```
|
259
|
+
|
data/lib/gcloud.rb
CHANGED
@@ -387,4 +387,42 @@ module Gcloud
|
|
387
387
|
require "gcloud/translate"
|
388
388
|
Gcloud.translate key
|
389
389
|
end
|
390
|
+
|
391
|
+
##
|
392
|
+
# Creates a new object for connecting to the Vision service.
|
393
|
+
# Each call creates a new connection.
|
394
|
+
#
|
395
|
+
# @param [String, Array<String>] scope The OAuth 2.0 scopes controlling the
|
396
|
+
# set of resources and operations that the connection can access. See [Using
|
397
|
+
# OAuth 2.0 to Access Google
|
398
|
+
# APIs](https://developers.google.com/identity/protocols/OAuth2).
|
399
|
+
#
|
400
|
+
# The default scope is:
|
401
|
+
#
|
402
|
+
# * `https://www.googleapis.com/auth/cloud-platform`
|
403
|
+
#
|
404
|
+
# @return [Gcloud::Vision::Project]
|
405
|
+
#
|
406
|
+
# @example
|
407
|
+
# require "gcloud"
|
408
|
+
#
|
409
|
+
# gcloud = Gcloud.new
|
410
|
+
# vision = gcloud.vision
|
411
|
+
#
|
412
|
+
# image = vision.image "path/to/landmark.jpg"
|
413
|
+
#
|
414
|
+
# landmark = image.landmark
|
415
|
+
# landmark.description #=> "Mount Rushmore"
|
416
|
+
#
|
417
|
+
# @example The default scope can be overridden with the `scope` option:
|
418
|
+
# require "gcloud"
|
419
|
+
#
|
420
|
+
# gcloud = Gcloud.new
|
421
|
+
# platform_scope = "https://www.googleapis.com/auth/cloud-platform"
|
422
|
+
# vision = gcloud.vision scope: platform_scope
|
423
|
+
#
|
424
|
+
def vision scope: nil
|
425
|
+
require "gcloud/vision"
|
426
|
+
Gcloud.vision @project, @keyfile, scope: scope
|
427
|
+
end
|
390
428
|
end
|
@@ -600,6 +600,11 @@ module Gcloud
|
|
600
600
|
# See [Loading Data with a POST Request](
|
601
601
|
# https://cloud.google.com/bigquery/loading-data-post-request#multipart).
|
602
602
|
#
|
603
|
+
# A `chunk_size` value can be provided in the options to be used in
|
604
|
+
# resumable uploads. This value is the number of bytes per chunk and must
|
605
|
+
# be divisible by 256KB. If it is not divisible by 256KB then it will be
|
606
|
+
# lowered to the nearest acceptable value.
|
607
|
+
#
|
603
608
|
# @param [File, Gcloud::Storage::File, String] file A file or the URI of a
|
604
609
|
# Google Cloud Storage file containing data to load into the table.
|
605
610
|
# @param [String] format The exported file format. The default value is
|
@@ -678,6 +683,10 @@ module Gcloud
|
|
678
683
|
# file that BigQuery will skip when loading the data. The default value
|
679
684
|
# is `0`. This property is useful if you have header rows in the file
|
680
685
|
# that should be skipped.
|
686
|
+
# @param [Integer] chunk_size The number of bytes per chunk in a resumable
|
687
|
+
# upload. Must be divisible by 256KB. If it is not divisible by 265KB
|
688
|
+
# then it will be lowered to the nearest acceptable value. If no value
|
689
|
+
# is provided it will use {Gcloud::Upload.default_chunk_size}. Optional.
|
681
690
|
#
|
682
691
|
# @return [Gcloud::Bigquery::LoadJob]
|
683
692
|
#
|
@@ -748,13 +757,14 @@ module Gcloud
|
|
748
757
|
def load file, format: nil, create: nil, write: nil,
|
749
758
|
projection_fields: nil, jagged_rows: nil, quoted_newlines: nil,
|
750
759
|
encoding: nil, delimiter: nil, ignore_unknown: nil,
|
751
|
-
max_bad_records: nil, quote: nil, skip_leading: nil, dryrun: nil
|
760
|
+
max_bad_records: nil, quote: nil, skip_leading: nil, dryrun: nil,
|
761
|
+
chunk_size: nil
|
752
762
|
ensure_connection!
|
753
763
|
options = { format: format, create: create, write: write,
|
754
764
|
projection_fields: projection_fields,
|
755
765
|
jagged_rows: jagged_rows, quoted_newlines: quoted_newlines,
|
756
766
|
encoding: encoding, delimiter: delimiter,
|
757
|
-
ignore_unknown: ignore_unknown,
|
767
|
+
ignore_unknown: ignore_unknown, chunk_size: chunk_size,
|
758
768
|
max_bad_records: max_bad_records, quote: quote,
|
759
769
|
skip_leading: skip_leading, dryrun: dryrun }
|
760
770
|
return load_storage(file, options) if storage_url? file
|
@@ -906,7 +916,8 @@ module Gcloud
|
|
906
916
|
end
|
907
917
|
|
908
918
|
def load_resumable file, options = {}
|
909
|
-
chunk_size = verify_chunk_size
|
919
|
+
chunk_size = Gcloud::Upload.verify_chunk_size options[:chunk_size],
|
920
|
+
file.length
|
910
921
|
resp = connection.load_resumable table_ref, file, chunk_size, options
|
911
922
|
if resp.success?
|
912
923
|
Job.from_gapi resp.data, connection
|
@@ -942,18 +953,6 @@ module Gcloud
|
|
942
953
|
false
|
943
954
|
end
|
944
955
|
|
945
|
-
##
|
946
|
-
# Determines if a chunk_size is valid.
|
947
|
-
def verify_chunk_size! chunk_size
|
948
|
-
chunk_size = chunk_size.to_i
|
949
|
-
chunk_mod = 256 * 1024 # 256KB
|
950
|
-
if (chunk_size.to_i % chunk_mod) != 0
|
951
|
-
chunk_size = (chunk_size / chunk_mod) * chunk_mod
|
952
|
-
end
|
953
|
-
return if chunk_size.zero?
|
954
|
-
chunk_size
|
955
|
-
end
|
956
|
-
|
957
956
|
##
|
958
957
|
# Load the complete representation of the table if it has been
|
959
958
|
# only partially loaded by a request to the API list method.
|
@@ -121,11 +121,11 @@ module Gcloud
|
|
121
121
|
end
|
122
122
|
|
123
123
|
##
|
124
|
-
# Retrieves all
|
124
|
+
# Retrieves all query results by repeatedly loading {#next} until
|
125
125
|
# {#next?} returns `false`. Returns the list instance for method
|
126
126
|
# chaining.
|
127
127
|
#
|
128
|
-
# This method may make several API calls until all
|
128
|
+
# This method may make several API calls until all query results are
|
129
129
|
# retrieved. Be sure to use as narrow a search criteria as possible.
|
130
130
|
# Please use with caution.
|
131
131
|
#
|
@@ -133,10 +133,9 @@ module Gcloud
|
|
133
133
|
# require "gcloud"
|
134
134
|
#
|
135
135
|
# gcloud = Gcloud.new
|
136
|
-
#
|
137
|
-
#
|
138
|
-
#
|
139
|
-
# entries = logging.entries(filter: recent_errors).all
|
136
|
+
# datastore = gcloud.datastore
|
137
|
+
# query = datastore.query("Tasks")
|
138
|
+
# all_tasks = datastore.run(query).all
|
140
139
|
#
|
141
140
|
def all
|
142
141
|
while next?
|
@@ -515,7 +515,8 @@ module Gcloud
|
|
515
515
|
# response header to be returned when the file is downloaded.
|
516
516
|
# @param [Integer] chunk_size The number of bytes per chunk in a resumable
|
517
517
|
# upload. Must be divisible by 256KB. If it is not divisible by 265KB
|
518
|
-
# then it will be lowered to the nearest acceptable value.
|
518
|
+
# then it will be lowered to the nearest acceptable value. If no value
|
519
|
+
# is provided it will use {Gcloud::Upload.default_chunk_size}. Optional.
|
519
520
|
# @param [String] crc32c The CRC32c checksum of the file data, as
|
520
521
|
# described in [RFC 4960, Appendix
|
521
522
|
# B](http://tools.ietf.org/html/rfc4960#appendix-B).
|
@@ -16,6 +16,7 @@
|
|
16
16
|
require "pathname"
|
17
17
|
require "gcloud/version"
|
18
18
|
require "gcloud/backoff"
|
19
|
+
require "gcloud/upload"
|
19
20
|
require "google/api_client"
|
20
21
|
require "mime/types"
|
21
22
|
|
@@ -382,8 +383,9 @@ module Gcloud
|
|
382
383
|
def file_media local_path, options, resumable
|
383
384
|
media = Google::APIClient::UploadIO.new local_path,
|
384
385
|
options[:content_type]
|
385
|
-
return media unless resumable
|
386
|
-
media.chunk_size = verify_chunk_size
|
386
|
+
return media unless resumable
|
387
|
+
media.chunk_size = Gcloud::Upload.verify_chunk_size(
|
388
|
+
options.delete(:chunk_size), media.length)
|
387
389
|
media
|
388
390
|
end
|
389
391
|
|
@@ -413,18 +415,6 @@ module Gcloud
|
|
413
415
|
yield
|
414
416
|
end
|
415
417
|
end
|
416
|
-
|
417
|
-
##
|
418
|
-
# Determines if a chunk_size is valid.
|
419
|
-
def verify_chunk_size! chunk_size
|
420
|
-
chunk_size = chunk_size.to_i
|
421
|
-
chunk_mod = 256 * 1024 # 256KB
|
422
|
-
if (chunk_size.to_i % chunk_mod) != 0
|
423
|
-
chunk_size = (chunk_size / chunk_mod) * chunk_mod
|
424
|
-
end
|
425
|
-
return if chunk_size.zero?
|
426
|
-
chunk_size
|
427
|
-
end
|
428
418
|
end
|
429
419
|
end
|
430
420
|
end
|
data/lib/gcloud/upload.rb
CHANGED
@@ -40,12 +40,56 @@ module Gcloud
|
|
40
40
|
end
|
41
41
|
|
42
42
|
##
|
43
|
-
# Sets a new resumable threshold value.
|
43
|
+
# Sets a new resumable threshold value in number of bytes.
|
44
44
|
def self.resumable_threshold= new_resumable_threshold
|
45
45
|
@@resumable_threshold = new_resumable_threshold.to_i
|
46
46
|
end
|
47
47
|
|
48
|
-
|
49
|
-
|
48
|
+
##
|
49
|
+
# Default chunk size used on resumable uploads.
|
50
|
+
#
|
51
|
+
# The default value is 10 MB (10,485,760 bytes).
|
52
|
+
def self.default_chunk_size
|
53
|
+
@@default_chunk_size
|
54
|
+
end
|
55
|
+
|
56
|
+
##
|
57
|
+
# Sets a new default chunk_size value in number of bytes. Must be a multiple
|
58
|
+
# of 256KB (262,144).
|
59
|
+
def self.default_chunk_size= new_chunk_size
|
60
|
+
new_chunk_size = normalize_chunk_size new_chunk_size
|
61
|
+
@@default_chunk_size = new_chunk_size if new_chunk_size
|
62
|
+
end
|
63
|
+
|
64
|
+
##
|
65
|
+
# @private Determines if a chunk_size is valid. Must be a multiple of 256KB.
|
66
|
+
# Returns lowest possible chunk_size if given a very small value.
|
67
|
+
def self.normalize_chunk_size chunk_size
|
68
|
+
chunk_size = chunk_size.to_i
|
69
|
+
chunk_mod = 256 * 1024 # 256KB
|
70
|
+
if (chunk_size.to_i % chunk_mod) != 0
|
71
|
+
chunk_size = (chunk_size / chunk_mod) * chunk_mod
|
72
|
+
end
|
73
|
+
return chunk_mod if chunk_size.zero?
|
74
|
+
chunk_size
|
75
|
+
end
|
76
|
+
|
77
|
+
##
|
78
|
+
# @private Determines if a chunk_size is valid. Must be a multiple of 256KB.
|
79
|
+
# Returns the default chunk_size if one is not provided.
|
80
|
+
def self.verify_chunk_size chunk_size, file_size
|
81
|
+
if chunk_size.to_i.zero?
|
82
|
+
return nil if file_size < default_chunk_size
|
83
|
+
return default_chunk_size
|
84
|
+
else
|
85
|
+
chunk_size = normalize_chunk_size chunk_size
|
86
|
+
return nil if file_size < chunk_size
|
87
|
+
return chunk_size
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
# Set the default values for threshold and chunk_size.
|
92
|
+
self.resumable_threshold = 5_000_000 # 5 MiB
|
93
|
+
self.default_chunk_size = 10_485_760 # 10 MB
|
50
94
|
end
|
51
95
|
end
|
data/lib/gcloud/version.rb
CHANGED
@@ -0,0 +1,488 @@
|
|
1
|
+
# Copyright 2016 Google Inc. All rights reserved.
|
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
|
+
# http://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 "gcloud"
|
17
|
+
require "gcloud/vision/project"
|
18
|
+
|
19
|
+
module Gcloud
|
20
|
+
##
|
21
|
+
# Creates a new object for connecting to the Vision service.
|
22
|
+
# Each call creates a new connection.
|
23
|
+
#
|
24
|
+
# @param [String] project Project identifier for the Vision service you are
|
25
|
+
# connecting to.
|
26
|
+
# @param [String, Hash] keyfile Keyfile downloaded from Google Cloud. If file
|
27
|
+
# path the file must be readable.
|
28
|
+
# @param [String, Array<String>] scope The OAuth 2.0 scopes controlling the
|
29
|
+
# set of resources and operations that the connection can access. See [Using
|
30
|
+
# OAuth 2.0 to Access Google
|
31
|
+
# APIs](https://developers.google.com/identity/protocols/OAuth2).
|
32
|
+
#
|
33
|
+
# The default scope is:
|
34
|
+
#
|
35
|
+
# * `https://www.googleapis.com/auth/cloud-platform`
|
36
|
+
#
|
37
|
+
# @return [Gcloud::Vision::Project]
|
38
|
+
#
|
39
|
+
# @example
|
40
|
+
# require "gcloud/vision"
|
41
|
+
#
|
42
|
+
# gcloud = Gcloud.new
|
43
|
+
# vision = gcloud.vision
|
44
|
+
#
|
45
|
+
# image = vision.image "path/to/landmark.jpg"
|
46
|
+
#
|
47
|
+
# landmark = image.landmark
|
48
|
+
# landmark.description #=> "Mount Rushmore"
|
49
|
+
#
|
50
|
+
def self.vision project = nil, keyfile = nil, scope: nil
|
51
|
+
project ||= Gcloud::Vision::Project.default_project
|
52
|
+
if keyfile.nil?
|
53
|
+
credentials = Gcloud::Vision::Credentials.default scope: scope
|
54
|
+
else
|
55
|
+
credentials = Gcloud::Vision::Credentials.new keyfile, scope: scope
|
56
|
+
end
|
57
|
+
Gcloud::Vision::Project.new project, credentials
|
58
|
+
end
|
59
|
+
|
60
|
+
##
|
61
|
+
# # Google Cloud Vision
|
62
|
+
#
|
63
|
+
# Google Cloud Vision allows easy integration of vision detection features
|
64
|
+
# developer applications, including image labeling, face and landmark
|
65
|
+
# detection, optical character recognition (OCR), and tagging of explicit
|
66
|
+
# content.
|
67
|
+
#
|
68
|
+
# For more information about Cloud Vision, read the [Google Cloud Vision API
|
69
|
+
# Documentation](https://cloud.google.com/vision/docs/).
|
70
|
+
#
|
71
|
+
# Gcloud's goal is to provide an API that is familiar and comfortable to
|
72
|
+
# Rubyists. Authentication is handled by {Gcloud#vision}. You can provide the
|
73
|
+
# project and credential information to connect to the Cloud Vision service,
|
74
|
+
# or if you are running on Google Compute Engine this configuration is taken
|
75
|
+
# care of for you. You can read more about the options for connecting in the
|
76
|
+
# [Authentication
|
77
|
+
# Guide](https://googlecloudplatform.github.io/gcloud-ruby/#/docs/guides/authentication).
|
78
|
+
#
|
79
|
+
# ## Creating images
|
80
|
+
#
|
81
|
+
# The Cloud Vision API supports a variety of image file formats, including
|
82
|
+
# JPEG, PNG8, PNG24, Animated GIF (first frame only), and RAW. See [Best
|
83
|
+
# Practices - Image Types](https://cloud.google.com/vision/docs/image-best-practices#image_types)
|
84
|
+
# for the complete list of formats. Be aware that Cloud Vision sets upper
|
85
|
+
# limits on file size as well as on the total combined size of all images in a
|
86
|
+
# request. Reducing your file size can significantly improve throughput;
|
87
|
+
# however, be careful not to reduce image quality in the process. See [Best
|
88
|
+
# Practices - Image Sizing](https://cloud.google.com/vision/docs/image-best-practices#image_sizing)
|
89
|
+
# for current file size limits.
|
90
|
+
#
|
91
|
+
# Use {Vision::Project#image} to create images for the Cloud Vision service.
|
92
|
+
# You can provide a file path:
|
93
|
+
#
|
94
|
+
# ```ruby
|
95
|
+
# require "gcloud"
|
96
|
+
#
|
97
|
+
# gcloud = Gcloud.new
|
98
|
+
# vision = gcloud.vision
|
99
|
+
#
|
100
|
+
# image = vision.image "path/to/landmark.jpg"
|
101
|
+
# ```
|
102
|
+
#
|
103
|
+
# Or, you can initialize the image with a Google Cloud Storage URI:
|
104
|
+
#
|
105
|
+
# ```ruby
|
106
|
+
# require "gcloud"
|
107
|
+
#
|
108
|
+
# gcloud = Gcloud.new
|
109
|
+
# vision = gcloud.vision
|
110
|
+
#
|
111
|
+
# image = vision.image "gs://bucket-name/path_to_image_object"
|
112
|
+
# ```
|
113
|
+
#
|
114
|
+
# Creating an Image instance does not perform an API request.
|
115
|
+
#
|
116
|
+
# ## Annotating images
|
117
|
+
#
|
118
|
+
# The instance methods on {Vision::Image} invoke Cloud Vision's detection
|
119
|
+
# features individually. Each method call makes an API request. (If you want
|
120
|
+
# to run multiple features in a single request, see the examples for
|
121
|
+
# {Vision::Project#annotate}, below.)
|
122
|
+
#
|
123
|
+
# ```ruby
|
124
|
+
# require "gcloud"
|
125
|
+
#
|
126
|
+
# gcloud = Gcloud.new
|
127
|
+
# vision = gcloud.vision
|
128
|
+
#
|
129
|
+
# image = vision.image "path/to/face.jpg"
|
130
|
+
#
|
131
|
+
# face = image.face
|
132
|
+
#
|
133
|
+
# face.features.to_h.count #=> 9
|
134
|
+
# face.features.eyes.left.pupil
|
135
|
+
# #=> #<Landmark (x: 190.41544, y: 84.4557, z: -1.3682901)>
|
136
|
+
# face.features.chin.center
|
137
|
+
# #=> #<Landmark (x: 233.21977, y: 189.47475, z: 19.487228)>
|
138
|
+
# ```
|
139
|
+
#
|
140
|
+
# To run multiple features on an image in a single request, pass the image (or
|
141
|
+
# a string file path or Storage URI) to {Vision::Project#annotate}:
|
142
|
+
#
|
143
|
+
# ```ruby
|
144
|
+
# require "gcloud"
|
145
|
+
#
|
146
|
+
# gcloud = Gcloud.new
|
147
|
+
# vision = gcloud.vision
|
148
|
+
#
|
149
|
+
# image = vision.image "path/to/face.jpg"
|
150
|
+
#
|
151
|
+
# annotation = vision.annotate image, faces: true, labels: true
|
152
|
+
# annotation.faces.count #=> 1
|
153
|
+
# annotation.labels.count #=> 4
|
154
|
+
# ```
|
155
|
+
#
|
156
|
+
# You can also perform detection tasks on multiple images in a single request:
|
157
|
+
#
|
158
|
+
# ```ruby
|
159
|
+
# require "gcloud"
|
160
|
+
#
|
161
|
+
# gcloud = Gcloud.new
|
162
|
+
# vision = gcloud.vision
|
163
|
+
#
|
164
|
+
# face_image = vision.image "path/to/face.jpg"
|
165
|
+
# landmark_image = vision.image "path/to/landmark.jpg"
|
166
|
+
#
|
167
|
+
# annotations = vision.annotate face_image,
|
168
|
+
# landmark_image,
|
169
|
+
# faces: true,
|
170
|
+
# landmarks: true,
|
171
|
+
# labels: true
|
172
|
+
#
|
173
|
+
# annotations[0].faces.count #=> 1
|
174
|
+
# annotations[0].landmarks.count #=> 0
|
175
|
+
# annotations[0].labels.count #=> 4
|
176
|
+
# annotations[1].faces.count #=> 1
|
177
|
+
# annotations[1].landmarks.count #=> 1
|
178
|
+
# annotations[1].labels.count #=> 6
|
179
|
+
# ```
|
180
|
+
#
|
181
|
+
# It is even possible to configure different features for multiple images in
|
182
|
+
# a single call using a block. The following example results in a single
|
183
|
+
# request to the Cloud Vision API:
|
184
|
+
#
|
185
|
+
# ```ruby
|
186
|
+
# require "gcloud"
|
187
|
+
#
|
188
|
+
# gcloud = Gcloud.new
|
189
|
+
# vision = gcloud.vision
|
190
|
+
#
|
191
|
+
# face_image = vision.image "path/to/face.jpg"
|
192
|
+
# landmark_image = vision.image "path/to/landmark.jpg"
|
193
|
+
# text_image = vision.image "path/to/text.png"
|
194
|
+
#
|
195
|
+
# annotations = vision.annotate do |annotate|
|
196
|
+
# annotate.annotate face_image, faces: true, labels: true
|
197
|
+
# annotate.annotate landmark_image, landmarks: true
|
198
|
+
# annotate.annotate text_image, text: true
|
199
|
+
# end
|
200
|
+
#
|
201
|
+
# annotations[0].faces.count #=> 1
|
202
|
+
# annotations[0].labels.count #=> 4
|
203
|
+
# annotations[1].landmarks.count #=> 1
|
204
|
+
# annotations[2].text.words.count #=> 28
|
205
|
+
# ```
|
206
|
+
#
|
207
|
+
# The maximum number of results returned when performing face, landmark, logo,
|
208
|
+
# and label detection are defined by {Gcloud::Vision.default_max_faces},
|
209
|
+
# {Gcloud::Vision.default_max_landmarks}, {Gcloud::Vision.default_max_logos},
|
210
|
+
# and {Gcloud::Vision.default_max_labels}, respectively. To change the global
|
211
|
+
# defaults, you can update the configuration:
|
212
|
+
#
|
213
|
+
# ```ruby
|
214
|
+
# require "gcloud"
|
215
|
+
#
|
216
|
+
# gcloud = Gcloud.new
|
217
|
+
# vision = gcloud.vision
|
218
|
+
#
|
219
|
+
# Gcloud::Vision.default_max_faces = 1
|
220
|
+
#
|
221
|
+
# annotation = vision.annotate "path/to/face.jpg", faces: true
|
222
|
+
# annotation.faces.count #=> 1
|
223
|
+
# ```
|
224
|
+
#
|
225
|
+
# Or, to override a default for a single method call, simply pass an
|
226
|
+
# integer instead of a flag:
|
227
|
+
#
|
228
|
+
# ```ruby
|
229
|
+
# require "gcloud"
|
230
|
+
#
|
231
|
+
# gcloud = Gcloud.new
|
232
|
+
# vision = gcloud.vision
|
233
|
+
#
|
234
|
+
# image = vision.image "path/to/face.jpg"
|
235
|
+
#
|
236
|
+
# # Return just one face.
|
237
|
+
# annotation = vision.annotate image, faces: 1
|
238
|
+
# # Return up to 5 faces.
|
239
|
+
# annotation = vision.annotate image, faces: 5
|
240
|
+
# ```
|
241
|
+
#
|
242
|
+
module Vision
|
243
|
+
class << self
|
244
|
+
##
|
245
|
+
# The default max results to return for facial detection requests. This is
|
246
|
+
# used on {Project#annotate} as well as {Image#faces}.
|
247
|
+
#
|
248
|
+
# The default value is `100`.
|
249
|
+
#
|
250
|
+
# @example Using the default setting on {Project#annotate}:
|
251
|
+
# require "gcloud"
|
252
|
+
#
|
253
|
+
# gcloud = Gcloud.new
|
254
|
+
# vision = gcloud.vision
|
255
|
+
#
|
256
|
+
# Gcloud::Vision.default_max_faces #=> 100
|
257
|
+
#
|
258
|
+
# annotation = vision.annotate "path/to/faces.jpg", faces: true
|
259
|
+
# # This is the same as calling
|
260
|
+
# # annotation = vision.annotate "path/to/faces.jpg", faces: 100
|
261
|
+
#
|
262
|
+
# @example Updating the default setting on {Project#annotate}:
|
263
|
+
# require "gcloud"
|
264
|
+
#
|
265
|
+
# gcloud = Gcloud.new
|
266
|
+
# vision = gcloud.vision
|
267
|
+
#
|
268
|
+
# # Set a new default
|
269
|
+
# Gcloud::Vision.default_max_faces = 5
|
270
|
+
#
|
271
|
+
# annotation = vision.annotate "path/to/faces.jpg", faces: true
|
272
|
+
# # This is the same as calling
|
273
|
+
# # annotation = vision.annotate "path/to/faces.jpg", faces: 5
|
274
|
+
#
|
275
|
+
#
|
276
|
+
# @example Using the default setting on {Image#faces}:
|
277
|
+
# require "gcloud"
|
278
|
+
#
|
279
|
+
# gcloud = Gcloud.new
|
280
|
+
# vision = gcloud.vision
|
281
|
+
#
|
282
|
+
# Gcloud::Vision.default_max_faces #=> 100
|
283
|
+
#
|
284
|
+
# faces = vision.image("path/to/faces.jpg").faces
|
285
|
+
# # This is the same as calling
|
286
|
+
# # faces = vision.image("path/to/faces.jpg").faces 100
|
287
|
+
#
|
288
|
+
# @example Updating the default setting on {Image#faces}:
|
289
|
+
# require "gcloud"
|
290
|
+
#
|
291
|
+
# gcloud = Gcloud.new
|
292
|
+
# vision = gcloud.vision
|
293
|
+
#
|
294
|
+
# # Set a new default
|
295
|
+
# Gcloud::Vision.default_max_faces = 5
|
296
|
+
#
|
297
|
+
# faces = vision.image("path/to/faces.jpg").faces
|
298
|
+
# # This is the same as calling
|
299
|
+
# # faces = vision.image("path/to/faces.jpg").faces 5
|
300
|
+
#
|
301
|
+
attr_accessor :default_max_faces
|
302
|
+
|
303
|
+
##
|
304
|
+
# The default max results to return for landmark detection requests. This
|
305
|
+
# is used on {Project#annotate} as well as {Image#landmarks}.
|
306
|
+
#
|
307
|
+
# The default value is 100.
|
308
|
+
#
|
309
|
+
# @example Using the default setting on {Project#annotate}:
|
310
|
+
# require "gcloud"
|
311
|
+
#
|
312
|
+
# gcloud = Gcloud.new
|
313
|
+
# vision = gcloud.vision
|
314
|
+
#
|
315
|
+
# Gcloud::Vision.default_max_landmarks #=> 100
|
316
|
+
#
|
317
|
+
# annotation = vision.annotate "path/to/landmarks.jpg", landmarks: true
|
318
|
+
# # This is the same as calling
|
319
|
+
# # annotation = vision.annotate "path/to/landmarks.jpg", landmarks: 100
|
320
|
+
#
|
321
|
+
# @example Updating the default setting on {Project#annotate}:
|
322
|
+
# require "gcloud"
|
323
|
+
#
|
324
|
+
# gcloud = Gcloud.new
|
325
|
+
# vision = gcloud.vision
|
326
|
+
#
|
327
|
+
# # Set a new default
|
328
|
+
# Gcloud::Vision.default_max_landmarks = 5
|
329
|
+
#
|
330
|
+
# annotation = vision.annotate "path/to/landmarks.jpg", landmarks: true
|
331
|
+
# # This is the same as calling
|
332
|
+
# # annotation = vision.annotate "path/to/landmarks.jpg", landmarks: 5
|
333
|
+
#
|
334
|
+
#
|
335
|
+
# @example Using the default setting on {Image#landmarks}:
|
336
|
+
# require "gcloud"
|
337
|
+
#
|
338
|
+
# gcloud = Gcloud.new
|
339
|
+
# vision = gcloud.vision
|
340
|
+
#
|
341
|
+
# Gcloud::Vision.default_max_landmarks #=> 100
|
342
|
+
#
|
343
|
+
# landmarks = vision.image("path/to/landmarks.jpg").landmarks
|
344
|
+
# # This is the same as calling
|
345
|
+
# # landmarks = vision.image("path/to/landmarks.jpg").landmarks 100
|
346
|
+
#
|
347
|
+
# @example Updating the default setting on {Image#landmarks}:
|
348
|
+
# require "gcloud"
|
349
|
+
#
|
350
|
+
# gcloud = Gcloud.new
|
351
|
+
# vision = gcloud.vision
|
352
|
+
#
|
353
|
+
# # Set a new default
|
354
|
+
# Gcloud::Vision.default_max_landmarks = 5
|
355
|
+
#
|
356
|
+
# landmarks = vision.image("path/to/landmarks.jpg").landmarks
|
357
|
+
# # This is the same as calling
|
358
|
+
# # landmarks = vision.image("path/to/landmarks.jpg").landmarks 5
|
359
|
+
#
|
360
|
+
attr_accessor :default_max_landmarks
|
361
|
+
|
362
|
+
##
|
363
|
+
# The default max results to return for logo detection requests. This is
|
364
|
+
# used on {Project#annotate} as well as {Image#logos}.
|
365
|
+
#
|
366
|
+
# The default value is 100.
|
367
|
+
#
|
368
|
+
# @example Using the default setting on {Project#annotate}:
|
369
|
+
# require "gcloud"
|
370
|
+
#
|
371
|
+
# gcloud = Gcloud.new
|
372
|
+
# vision = gcloud.vision
|
373
|
+
#
|
374
|
+
# Gcloud::Vision.default_max_logos #=> 100
|
375
|
+
#
|
376
|
+
# annotation = vision.annotate "path/to/logos.jpg", logos: true
|
377
|
+
# # This is the same as calling
|
378
|
+
# # annotation = vision.annotate "path/to/logos.jpg", logos: 100
|
379
|
+
#
|
380
|
+
# @example Updating the default setting on {Project#annotate}:
|
381
|
+
# require "gcloud"
|
382
|
+
#
|
383
|
+
# gcloud = Gcloud.new
|
384
|
+
# vision = gcloud.vision
|
385
|
+
#
|
386
|
+
# # Set a new default
|
387
|
+
# Gcloud::Vision.default_max_logos = 5
|
388
|
+
#
|
389
|
+
# annotation = vision.annotate "path/to/logos.jpg", logos: true
|
390
|
+
# # This is the same as calling
|
391
|
+
# # annotation = vision.annotate "path/to/logos.jpg", logos: 5
|
392
|
+
#
|
393
|
+
#
|
394
|
+
# @example Using the default setting on {Image#logos}:
|
395
|
+
# require "gcloud"
|
396
|
+
#
|
397
|
+
# gcloud = Gcloud.new
|
398
|
+
# vision = gcloud.vision
|
399
|
+
#
|
400
|
+
# Gcloud::Vision.default_max_logos #=> 100
|
401
|
+
#
|
402
|
+
# logos = vision.image("path/to/logos.jpg").logos
|
403
|
+
# # This is the same as calling
|
404
|
+
# # logos = vision.image("path/to/logos.jpg").logos 100
|
405
|
+
#
|
406
|
+
# @example Updating the default setting on {Image#logos}:
|
407
|
+
# require "gcloud"
|
408
|
+
#
|
409
|
+
# gcloud = Gcloud.new
|
410
|
+
# vision = gcloud.vision
|
411
|
+
#
|
412
|
+
# # Set a new default
|
413
|
+
# Gcloud::Vision.default_max_logos = 5
|
414
|
+
#
|
415
|
+
# logos = vision.image("path/to/logos.jpg").logos
|
416
|
+
# # This is the same as calling
|
417
|
+
# # logos = vision.image("path/to/logos.jpg").logos 5
|
418
|
+
#
|
419
|
+
attr_accessor :default_max_logos
|
420
|
+
|
421
|
+
##
|
422
|
+
# The default max results to return for label detection requests. This is
|
423
|
+
# used on {Project#annotate} as well as {Image#labels}.
|
424
|
+
#
|
425
|
+
# The default value is 100.
|
426
|
+
#
|
427
|
+
# @example Using the default setting on {Project#annotate}:
|
428
|
+
# require "gcloud"
|
429
|
+
#
|
430
|
+
# gcloud = Gcloud.new
|
431
|
+
# vision = gcloud.vision
|
432
|
+
#
|
433
|
+
# Gcloud::Vision.default_max_labels #=> 100
|
434
|
+
#
|
435
|
+
# annotation = vision.annotate "path/to/labels.jpg", labels: true
|
436
|
+
# # This is the same as calling
|
437
|
+
# # annotation = vision.annotate "path/to/labels.jpg", labels: 100
|
438
|
+
#
|
439
|
+
# @example Updating the default setting on {Project#annotate}:
|
440
|
+
# require "gcloud"
|
441
|
+
#
|
442
|
+
# gcloud = Gcloud.new
|
443
|
+
# vision = gcloud.vision
|
444
|
+
#
|
445
|
+
# # Set a new default
|
446
|
+
# Gcloud::Vision.default_max_labels = 5
|
447
|
+
#
|
448
|
+
# annotation = vision.annotate "path/to/labels.jpg", labels: true
|
449
|
+
# # This is the same as calling
|
450
|
+
# # annotation = vision.annotate "path/to/labels.jpg", labels: 5
|
451
|
+
#
|
452
|
+
#
|
453
|
+
# @example Using the default setting on {Image#labels}:
|
454
|
+
# require "gcloud"
|
455
|
+
#
|
456
|
+
# gcloud = Gcloud.new
|
457
|
+
# vision = gcloud.vision
|
458
|
+
#
|
459
|
+
# Gcloud::Vision.default_max_labels #=> 100
|
460
|
+
#
|
461
|
+
# labels = vision.image("path/to/labels.jpg").labels
|
462
|
+
# # This is the same as calling
|
463
|
+
# # labels = vision.image("path/to/labels.jpg").labels 100
|
464
|
+
#
|
465
|
+
# @example Updating the default setting on {Image#labels}:
|
466
|
+
# require "gcloud"
|
467
|
+
#
|
468
|
+
# gcloud = Gcloud.new
|
469
|
+
# vision = gcloud.vision
|
470
|
+
#
|
471
|
+
# # Set a new default
|
472
|
+
# Gcloud::Vision.default_max_labels = 5
|
473
|
+
#
|
474
|
+
# labels = vision.image("path/to/labels.jpg").labels
|
475
|
+
# # This is the same as calling
|
476
|
+
# # labels = vision.image("path/to/labels.jpg").labels 5
|
477
|
+
#
|
478
|
+
attr_accessor :default_max_labels
|
479
|
+
end
|
480
|
+
|
481
|
+
# Set the default values.
|
482
|
+
# Update the comments documentation when these change.
|
483
|
+
self.default_max_faces = 100
|
484
|
+
self.default_max_landmarks = 100
|
485
|
+
self.default_max_logos = 100
|
486
|
+
self.default_max_labels = 100
|
487
|
+
end
|
488
|
+
end
|