clarification 0.0.0 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +2 -0
- data/README.md +60 -14
- data/bin/console +10 -2
- data/clarification.gemspec +7 -1
- data/lib/clarification/client.rb +13 -33
- data/lib/clarification/configuration.rb +2 -1
- data/lib/clarification/end_points.rb +19 -5
- data/lib/clarification/enrich.rb +21 -0
- data/lib/clarification/objectifier.rb +21 -0
- data/lib/clarification/requester.rb +15 -6
- data/lib/clarification/version.rb +1 -1
- data/lib/clarification.rb +2 -0
- metadata +47 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e64a471ed5071485e467ef49e82658ab0b349c63
|
4
|
+
data.tar.gz: 92f9619926fa087af02ac0b1ab7cbe88606d9b29
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9de55bd0c81de343006762c2cdee4b6420f77d7a9746a97ca2d251a1d0184c3165c63c9beceab886bd96f6e1df2de02077370c9e0db26de11df122f380fac246
|
7
|
+
data.tar.gz: 576bc98bf184e7f9ca6b1d23352707dd6a807f19c5b2b15aece2b125d945f4e1af8aa788b872f8ac4a8f68a76b37bd3b884ab621dc8bea5691804314f2b3e7f7
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,9 @@
|
|
1
|
-
|
1
|
+
[![Gem Version](https://badge.fury.io/rb/clarification.svg)](https://badge.fury.io/rb/clarification)
|
2
|
+
[![Build Status](https://travis-ci.org/nicholalexander/clarification.svg?branch=master)](https://travis-ci.org/nicholalexander/clarification)
|
3
|
+
[![Codacy Badge](https://api.codacy.com/project/badge/Grade/cb0dd6cce7ec48a191696780951c5efe)](https://www.codacy.com/app/nicholalexander/clarification?utm_source=github.com&utm_medium=referral&utm_content=nicholalexander/clarification&utm_campaign=Badge_Grade)
|
4
|
+
|
5
|
+
|
6
|
+
# Clarification
|
2
7
|
|
3
8
|
Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/clarification`. To experiment with that code, run `bin/console` for an interactive prompt.
|
4
9
|
|
@@ -22,32 +27,69 @@ Or install it yourself as:
|
|
22
27
|
|
23
28
|
Configure the gem as you would normally.
|
24
29
|
|
25
|
-
```
|
30
|
+
```ruby
|
26
31
|
Clarification.configure do |config|
|
27
32
|
config.api_key = 'a_big_secret_you_got_from_clarifai'
|
28
|
-
config.end_points = [:food]
|
33
|
+
config.end_points = [:food, :general]
|
29
34
|
end
|
30
35
|
```
|
31
36
|
|
32
37
|
This should also work nicely inside a rails initializer.
|
33
38
|
|
39
|
+
Each endpoint initialized in your configuration will be called. _So any predictions using a client configured with :food and :general will make two API requests._
|
40
|
+
|
34
41
|
## Usage
|
35
42
|
|
36
|
-
|
43
|
+
```ruby
|
44
|
+
client = Clarification::Client.new
|
45
|
+
response = client.predict(some_public_url_of_an_image)
|
46
|
+
```
|
37
47
|
|
38
|
-
|
39
|
-
response = client.analyze(some_public_url)
|
48
|
+
### Prediction
|
40
49
|
|
41
|
-
|
50
|
+
The response object returned from the prediction is a hash containing a nicely parsed result for each of the models called. In our example, we initialized with two models so we will have response[:food] and response[:general]. Each of those model results have an object which has three pieces of relevant information: status, concepts, and response_json.
|
42
51
|
|
52
|
+
Thusly you can do things like this:
|
53
|
+
|
54
|
+
```ruby
|
55
|
+
response[:food].concepts.each do |concept|
|
56
|
+
if concept.value > 0.90
|
57
|
+
puts "#{concept.name}"
|
58
|
+
end
|
59
|
+
end
|
43
60
|
```
|
44
|
-
|
45
|
-
|
46
|
-
response[:
|
47
|
-
# => { concept_name: "cake",
|
48
|
-
confidence: .89 }
|
61
|
+
|
62
|
+
```ruby
|
63
|
+
response[:general].response_json
|
49
64
|
```
|
50
65
|
|
66
|
+
```ruby
|
67
|
+
if response[:food].status.code == 10000
|
68
|
+
puts response[:food].status.description
|
69
|
+
end
|
70
|
+
```
|
71
|
+
|
72
|
+
All the objects are OpenStructs currently, but I suspect this will change shortly.
|
73
|
+
|
74
|
+
As a convenience, the client also maintains the parsed response in the last_response variable.
|
75
|
+
|
76
|
+
```ruby
|
77
|
+
client.predict(some_public_url_of_an_image)
|
78
|
+
client.last_response #=> {:food => Objectifier...}
|
79
|
+
```
|
80
|
+
|
81
|
+
## TODO's
|
82
|
+
|
83
|
+
Lots and lots of things. Amongst them:
|
84
|
+
|
85
|
+
* validate public model selections
|
86
|
+
* error handling
|
87
|
+
* predict multiple images per call
|
88
|
+
* predict video
|
89
|
+
* use workflows
|
90
|
+
* searching
|
91
|
+
* training custom models
|
92
|
+
|
51
93
|
## Development
|
52
94
|
|
53
95
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
@@ -56,7 +98,11 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
56
98
|
|
57
99
|
## Contributing
|
58
100
|
|
59
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
101
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/nicholalexander/clarification. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
|
102
|
+
|
103
|
+
https://codeclimate.com/github/nicholalexander/clarification
|
104
|
+
https://www.codacy.com/app/nicholalexander/clarification
|
105
|
+
|
60
106
|
|
61
107
|
## License
|
62
108
|
|
@@ -64,4 +110,4 @@ The gem is available as open source under the terms of the [MIT License](http://
|
|
64
110
|
|
65
111
|
## Code of Conduct
|
66
112
|
|
67
|
-
Everyone interacting in the Clarification project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/
|
113
|
+
Everyone interacting in the Clarification project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/nicholalexander/clarification/blob/master/CODE_OF_CONDUCT.md).
|
data/bin/console
CHANGED
@@ -6,9 +6,17 @@ require "clarification"
|
|
6
6
|
# You can add fixtures and/or initialization code here to make experimenting
|
7
7
|
# with your gem easier. You can also use a different console, if you like.
|
8
8
|
|
9
|
+
Clarification.configure do |config|
|
10
|
+
config.api_key = 'f7cc628178994e16b2470ae739ef927a'
|
11
|
+
config.default_models = [:food]
|
12
|
+
end
|
13
|
+
|
14
|
+
@target_url = 'https://www.cicis.com/media/1138/pizza_trad_pepperoni.png'
|
15
|
+
|
16
|
+
@client = Clarification::Client.new
|
17
|
+
@response = @client.predict(@target_url)
|
18
|
+
|
9
19
|
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
20
|
require "pry"
|
11
21
|
Pry.start
|
12
22
|
|
13
|
-
# require "irb"
|
14
|
-
# IRB.start(__FILE__)
|
data/clarification.gemspec
CHANGED
@@ -21,11 +21,17 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
22
22
|
spec.require_paths = ["lib"]
|
23
23
|
|
24
|
+
spec.required_ruby_version = '>=2.2'
|
25
|
+
|
26
|
+
spec.add_runtime_dependency "json"
|
27
|
+
|
24
28
|
spec.add_development_dependency "bundler", "~> 1.15"
|
25
29
|
spec.add_development_dependency "rake", "~> 10.0"
|
26
30
|
spec.add_development_dependency "rspec", "~> 3.0"
|
27
31
|
spec.add_development_dependency "pry"
|
28
32
|
spec.add_development_dependency "guard"
|
29
33
|
spec.add_development_dependency "guard-rspec"
|
30
|
-
|
34
|
+
spec.add_development_dependency "simplecov"
|
35
|
+
spec.add_development_dependency "codacy-coverage"
|
36
|
+
|
31
37
|
end
|
data/lib/clarification/client.rb
CHANGED
@@ -1,45 +1,25 @@
|
|
1
1
|
module Clarification
|
2
2
|
class Client
|
3
3
|
|
4
|
+
attr_reader :active_models, :last_response
|
5
|
+
|
4
6
|
def initialize
|
5
|
-
|
7
|
+
raise "No Configuration Found." if Clarification.configuration.nil?
|
8
|
+
@active_models = Clarification.configuration.default_models
|
9
|
+
@last_response = nil
|
6
10
|
end
|
7
11
|
|
8
|
-
def
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
12
|
+
def predict(url)
|
13
|
+
requester = Requester.new(@active_models)
|
14
|
+
response = requester.get(url)
|
15
|
+
@last_response = Enrich.new(response).run
|
16
|
+
return @last_response
|
13
17
|
end
|
14
18
|
|
15
|
-
|
16
|
-
|
17
|
-
uri = URI.parse("https://api.clarifai.com/v2/models/bd367be194cf45149e75f01d59f77ba7/outputs")
|
18
|
-
request = Net::HTTP::Post.new(uri)
|
19
|
-
request.content_type = "application/json"
|
20
|
-
request["Authorization"] = "Key f7cc628178994e16b2470ae739ef927a"
|
21
|
-
request.body = JSON.dump({
|
22
|
-
"inputs" => [
|
23
|
-
{
|
24
|
-
"data" => {
|
25
|
-
"image" => {
|
26
|
-
"url" => "https://samples.clarifai.com/food.jpg"
|
27
|
-
}
|
28
|
-
}
|
29
|
-
}
|
30
|
-
]
|
31
|
-
})
|
32
|
-
|
33
|
-
req_options = {
|
34
|
-
use_ssl: uri.scheme == "https",
|
35
|
-
}
|
36
|
-
|
37
|
-
response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
|
38
|
-
http.request(request)
|
39
|
-
end
|
40
|
-
|
41
|
-
puts response
|
19
|
+
def set_models(model_array)
|
20
|
+
@active_models = model_array
|
42
21
|
end
|
43
22
|
|
44
23
|
end
|
24
|
+
|
45
25
|
end
|
@@ -1,8 +1,22 @@
|
|
1
1
|
module Clarification
|
2
2
|
BASE_URL = 'https://api.clarifai.com/v2/models/'.freeze
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
3
|
+
|
4
|
+
PUBLIC_MODELS = {
|
5
|
+
apparel: 'e0be3b9d6a454f0493ac3a30784001ff',
|
6
|
+
celebrity: 'e466caa0619f444ab97497640cefc4dc',
|
7
|
+
color: 'eeed0b6733a644cea07cf4c60f87ebb7',
|
8
|
+
demographics: 'c0c0ac362b03416da06ab3fa36fb58e3',
|
9
|
+
face_detection: 'a403429f2ddf4b49b307e318f00e528b',
|
10
|
+
face_embedding: 'd02b4508df58432fbb84e800597b8959',
|
11
|
+
focus: 'c2cf7cecd8a6427da375b9f35fcd2381',
|
12
|
+
food: 'bd367be194cf45149e75f01d59f77ba7',
|
13
|
+
general: 'aaa03c23b3724a16a56b629203edc62c',
|
14
|
+
general_embedding: 'bbb5f41425b8468d9b7a554ff10f8581',
|
15
|
+
logo: 'c443119bf2ed4da98487520d01a0b1e3',
|
16
|
+
moderation: 'd16f390eb32cad478c7ae150069bd2c6',
|
17
|
+
nsfw: 'e9576d86d2004ed1a38ba0cf39ecb4b1',
|
18
|
+
travel: 'eee28c313d69466f836ab83287a54ed9',
|
19
|
+
wedding: 'c386b7a870114f4a87477c0824499348'
|
20
|
+
}
|
21
|
+
|
8
22
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Clarification
|
2
|
+
class Enrich
|
3
|
+
|
4
|
+
attr_reader :results
|
5
|
+
|
6
|
+
def initialize(response_array)
|
7
|
+
@response_array = response_array
|
8
|
+
@results = {}
|
9
|
+
end
|
10
|
+
|
11
|
+
def run
|
12
|
+
@response_array.each do |model_name, raw_response |
|
13
|
+
@results[model_name] = Objectifier.new(raw_response.body)
|
14
|
+
end
|
15
|
+
|
16
|
+
return @results
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Clarification
|
2
|
+
class Objectifier
|
3
|
+
|
4
|
+
attr_reader :response_json, :status, :concepts
|
5
|
+
|
6
|
+
def initialize(response)
|
7
|
+
@response_json = JSON.parse(response)
|
8
|
+
@status = OpenStruct.new(@response_json["status"])
|
9
|
+
@concepts = []
|
10
|
+
|
11
|
+
build_concept_objects
|
12
|
+
end
|
13
|
+
|
14
|
+
def build_concept_objects
|
15
|
+
@response_json["outputs"][0]["data"]["concepts"].each do |concept|
|
16
|
+
@concepts << OpenStruct.new(concept)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
@@ -1,12 +1,20 @@
|
|
1
1
|
module Clarification
|
2
2
|
class Requester
|
3
3
|
|
4
|
-
def initialize(
|
5
|
-
@
|
4
|
+
def initialize(model_array)
|
5
|
+
@model_array = model_array
|
6
6
|
end
|
7
7
|
|
8
8
|
def get(target_url)
|
9
|
-
|
9
|
+
response = {}
|
10
|
+
@model_array.each do |model|
|
11
|
+
response[model] = get_with_model(target_url, model)
|
12
|
+
end
|
13
|
+
return response
|
14
|
+
end
|
15
|
+
|
16
|
+
def get_with_model(target_url, model)
|
17
|
+
uri = uri_builder(model)
|
10
18
|
body = body_builder(target_url)
|
11
19
|
request = request_builder(uri, body)
|
12
20
|
options = options_builder(uri)
|
@@ -18,7 +26,6 @@ module Clarification
|
|
18
26
|
return response
|
19
27
|
end
|
20
28
|
|
21
|
-
|
22
29
|
private
|
23
30
|
|
24
31
|
def body_builder(url)
|
@@ -35,8 +42,10 @@ module Clarification
|
|
35
42
|
}
|
36
43
|
end
|
37
44
|
|
38
|
-
def uri_builder
|
39
|
-
|
45
|
+
def uri_builder(model)
|
46
|
+
model_key = Clarification::PUBLIC_MODELS[model]
|
47
|
+
url = "#{Clarification::BASE_URL}#{model_key}/outputs"
|
48
|
+
uri = URI.parse(url)
|
40
49
|
end
|
41
50
|
|
42
51
|
def request_builder(uri, body)
|
data/lib/clarification.rb
CHANGED
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: clarification
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nichol Alexander
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-09-
|
11
|
+
date: 2017-09-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: json
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: bundler
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -94,6 +108,34 @@ dependencies:
|
|
94
108
|
- - ">="
|
95
109
|
- !ruby/object:Gem::Version
|
96
110
|
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: simplecov
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: codacy-coverage
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
97
139
|
description: Alpha Version - configure, access Clarifai set end points, interrogate
|
98
140
|
responses.
|
99
141
|
email:
|
@@ -118,6 +160,8 @@ files:
|
|
118
160
|
- lib/clarification/client.rb
|
119
161
|
- lib/clarification/configuration.rb
|
120
162
|
- lib/clarification/end_points.rb
|
163
|
+
- lib/clarification/enrich.rb
|
164
|
+
- lib/clarification/objectifier.rb
|
121
165
|
- lib/clarification/requester.rb
|
122
166
|
- lib/clarification/version.rb
|
123
167
|
homepage: https://github.com/nicholalexander/clarification
|
@@ -132,7 +176,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
132
176
|
requirements:
|
133
177
|
- - ">="
|
134
178
|
- !ruby/object:Gem::Version
|
135
|
-
version: '
|
179
|
+
version: '2.2'
|
136
180
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
137
181
|
requirements:
|
138
182
|
- - ">="
|