levdon 0.1.0 → 0.1.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 61b634c08e78823b483f945704724721b32f52fc
4
- data.tar.gz: 4a481f533a47d9e78fc6678536882d30334b2237
3
+ metadata.gz: f644b9bcbe5fcd9e5a453bae0b8a0e34c9da18f5
4
+ data.tar.gz: 831a339cec878dc9266c50476d9d36c623f5d677
5
5
  SHA512:
6
- metadata.gz: 4a5fef5c1ddb5ee772b2d4a7082e1a3867e61863c89ab709d8770fa0eedc189dfc9d21fe7e4fb6422446fe24449f119d99b5c329b17824a77e3503ce087b15ee
7
- data.tar.gz: 955b51cf623e9ac600cdd339f05466bd434045c5080c7a349a471d01c496cbcf19b739dc8cc87f55a8a6825146b6f879eda8d7ee84f9b76a846d9552d272f23b
6
+ metadata.gz: 2a4baebf126b1b294c46ac94db7abed58ead303dfa9ca4df11179c4f3304c234ac947a6e1be89302880771790f1cc0905c2e4b881c0097345464732204ee4bf7
7
+ data.tar.gz: 15a5682baca2fc30062b2d01d8d82e48fe71d4d14f74df9f357ca7c5506039a58cf4d58db5d57b92e21b6ee696ed74ed446839bd632e8341f270077fd4d1e6b6
data/denoise.rb ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'levdon'
4
+
5
+ if(ARGV.length == 0)
6
+ puts "standerdize script"
7
+ puts " => script [image directory]"
8
+ else
9
+ Levdon::standardize(ARGV[0])
10
+ end
data/denoise.sh ADDED
@@ -0,0 +1,3 @@
1
+
2
+ bundle exec ruby denoise.rb $1
3
+
data/example1.rb ADDED
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'levdon'
4
+
5
+ # Account is not necessary during for free version.
6
+ ACCESS_TOKEN = "TODO: specify your API key."
7
+ TARGET_PATH = "/Users/johndoe/Desktop/Unknown.jpeg"
8
+
9
+ api = Levdon.new()
10
+ state = api.start(ACCESS_TOKEN)
11
+ if state[:error]
12
+ puts state[:error]
13
+ else
14
+
15
+ res = api.predict({:target=>TARGET_PATH})
16
+ if res[:error]
17
+ puts res[:error]
18
+ else
19
+ puts res[:results]
20
+ end
21
+
22
+ end
23
+ api.close()
24
+
data/example1.sh ADDED
@@ -0,0 +1 @@
1
+ bundle exec ruby example1.rb
data/example2.rb ADDED
@@ -0,0 +1,44 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'levdon'
4
+
5
+ # Account is not necessary during for free version.
6
+ ACCESS_TOKEN = "TODO: specify your API key."
7
+ TARGET_PATH = "/Users/johndoe/Desktop/data/examples"
8
+
9
+ api = Levdon.new()
10
+ api.option({
11
+ :CLASS => [:CLASS_ADULT],
12
+ :PARALLEL => 32
13
+ })
14
+
15
+ api.async_start(ACCESS_TOKEN) {|state|
16
+ if(state[:error])
17
+ puts state[:error]
18
+ else
19
+ Levdon.find_image(TARGET_PATH,{:no_check=>true}) {|obj|
20
+ path = obj[:source_path]
21
+ while(api.queue_size() > 32*4)
22
+ api.poll()
23
+ sleep(0.01)
24
+ end
25
+
26
+ api.async_predict({:target => path}) {|res|
27
+ if res[:error]
28
+ puts res[:error]
29
+ else
30
+ result = res[:results]
31
+ puts "Score: "+(result[:CLASS_ADULT]*100).to_i.to_s + " : " + path
32
+ end
33
+ }
34
+ }
35
+
36
+ while(api.queue_size()!=0)
37
+ api.poll()
38
+ sleep(0.01)
39
+ end
40
+
41
+ end
42
+ }
43
+ api.close()
44
+
data/example2.sh ADDED
@@ -0,0 +1 @@
1
+ bundle exec ruby example2.rb
@@ -1,3 +1,3 @@
1
1
  module Levdon
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
data/lib/levdon.rb CHANGED
@@ -33,7 +33,7 @@ module Levdon
33
33
  }
34
34
 
35
35
  ONTOLOGY_REV_LIST = {}
36
- ONTOLOGY_LIST.map{|k,v| ONTOLOGY_REV_LIST[v[:key]] = k }
36
+ ONTOLOGY_LIST.each{|k,v| ONTOLOGY_REV_LIST[v[:key]] = k }
37
37
 
38
38
  class NonBlockLineStream
39
39
  def initialize(input_stream, output_stream)
@@ -555,67 +555,60 @@ module Levdon
555
555
  @ontologies = [:CLASS_ADULT]
556
556
  end
557
557
 
558
-
559
- def async_start(access_token,&block)
560
- @access_token = access_token
561
- @workers = @request_cluster_num.times.map{
562
- Worker.new{|*args|
563
- ret = nil
564
- error = nil
565
- user_object = nil
558
+ def _predict_impl(parameter)
559
+ ret = nil
560
+ error = nil
561
+
562
+ f = parameter[:target]
563
+ request_id = parameter[:request_id]
564
+ ontologies = parameter[:ontologies]
565
+ access_token = parameter[:access_token]
566
+ url = URI.parse(API_URL)
567
+
568
+ options = {}
569
+ options['ontologies'] = []
570
+ error = "Class is not specified." if ontologies.length == 0
571
+ ontologies.each{|key|
572
+ obj = ONTOLOGY_LIST[key]
573
+ unless obj
574
+ error = "Invalid key => " + key.to_s
575
+ break
576
+ end
577
+ unless obj[:available]
578
+ error = key.to_s + " class is not available.\n Reason => #{obj[:desc]}"
579
+ break
580
+ end
581
+ options['ontologies'] += [obj[:key]]
582
+ }
583
+ if(!error)
584
+ stream = load(f)
585
+ if(stream)
586
+ io = nil
566
587
  begin
567
- parameter = args[0]
568
- f = parameter[:target]
569
- request_id = parameter[:request_id]
570
- ontologies = parameter[:ontologies]
571
- url = URI.parse(API_URL)
572
-
573
- options = {}
574
- options['ontologies'] = []
575
- error = "Class is not specified." if ontologies.length == 0
576
- ontologies.each{|key|
577
- obj = ONTOLOGY_LIST[key]
578
- unless obj
579
- error = "Invalid key => " + key.to_s
580
- break
581
- end
582
- unless obj[:available]
583
- error = key.to_s + " class is not available.\n Reason => #{obj[:desc]}"
584
- break
585
- end
586
- options['ontologies'] += [obj[:key]]
587
- }
588
- if(!error)
589
- stream = load(f)
590
- if(stream)
591
- io = StringIO.new(Levdon.prob_resize(stream))
592
- req = Net::HTTP::Post::Multipart.new url.path,
593
- "api_version" => API_VERSION,
594
- "upload" => UploadIO.new(io, "image/jpeg", "image.jpg"),
595
- "request_id" => request_id,
596
- "access_token" => access_token,
597
- "constant_id" => APPLICATION_ID,
598
- "options" => JSON.generate(options)
599
-
600
- n = Net::HTTP.new(url.host, url.port)
601
- n.use_ssl = ENABLE_SSL
602
-
603
- res = n.start {|http| http.request(req) }
604
-
605
- j = JSON.parse(res.body)
606
- if(res.code == '200' and j['results'])
607
- # TODO: data struct problem
608
- ret = {}
609
- j['results'].each{|k,v|
610
- ret[ONTOLOGY_REV_LIST[k]] = v
611
- }
612
- else
613
- ret = nil
614
- error = j['desc']
615
- end
616
- else
617
- error = "Could not read a '#{f.to_s}'."
618
- end
588
+ io = StringIO.new(Levdon.prob_resize(stream))
589
+ req = Net::HTTP::Post::Multipart.new url.path,
590
+ "api_version" => API_VERSION,
591
+ "upload" => UploadIO.new(io, "image/jpeg", "image.jpg"),
592
+ "request_id" => request_id,
593
+ "access_token" => access_token,
594
+ "constant_id" => APPLICATION_ID,
595
+ "options" => JSON.generate(options)
596
+
597
+ n = Net::HTTP.new(url.host, url.port)
598
+ n.use_ssl = ENABLE_SSL
599
+
600
+ res = n.start {|http| http.request(req) }
601
+
602
+ j = JSON.parse(res.body)
603
+ if(res.code == '200' and j['results'])
604
+ # TODO: data struct problem
605
+ ret = {}
606
+ j['results'].each{|k,v|
607
+ ret[ONTOLOGY_REV_LIST[k]] = v
608
+ }
609
+ else
610
+ ret = nil
611
+ error = j['desc']
619
612
  end
620
613
  rescue => e
621
614
  error = ""
@@ -636,6 +629,31 @@ module Levdon
636
629
  end
637
630
  end
638
631
  end
632
+ else
633
+ error = "Could not read a '#{f.to_s}'."
634
+ end
635
+ end
636
+ return {:error=>error,:result=>ret}
637
+ end
638
+
639
+ def async_start(access_token,&block)
640
+ @access_token = access_token
641
+ @workers = @request_cluster_num.times.map{
642
+ Worker.new{|*args|
643
+ ret = nil
644
+ error = nil
645
+ begin
646
+ parameter = args[0]
647
+ parameter[:access_token] = access_token
648
+ obj = _predict_impl(parameter)
649
+ ret = obj[:result]
650
+ error = obj[:error]
651
+ rescue => e
652
+ error = ""
653
+ error += e.class.to_s + "\n"
654
+ error += e.message.to_s + "\n"
655
+ error += e.backtrace.to_s + "\n"
656
+ end
639
657
 
640
658
  {:results => ret, :error => error,:parameter => parameter}
641
659
  }
@@ -658,14 +676,8 @@ module Levdon
658
676
  end
659
677
 
660
678
  def start(access_token)
661
- ret = nil
662
- async_start(access_token){|e|
663
- ret = e
664
- }
665
- while(ret == nil)
666
- sleep(0.01)
667
- end
668
- ret
679
+ @access_token = access_token
680
+ return {:erorr => nil}
669
681
  end
670
682
 
671
683
  def option(obj)
@@ -686,9 +698,7 @@ module Levdon
686
698
  # from network
687
699
  return open(any).read
688
700
  else
689
- # TODO File path checker
690
- if(any.length < 1024)
691
- # from file
701
+ if File::ftype(any) == "file"
692
702
  return File.open(any).read # File IO
693
703
  else
694
704
  # from memory
@@ -764,33 +774,21 @@ module Levdon
764
774
  raise "required key: target. Specify a file path or URL or data." unless(parameter[:target])
765
775
  parameter[:request_id] = SecureRandom.uuid.gsub("-","")
766
776
  parameter[:ontologies] = @ontologies
767
- enqueue(parameter)
777
+ parameter[:access_token] = @access_token
778
+
779
+ ret = nil
780
+ error = nil
768
781
  begin
769
- time = Time.new
770
- loop {
771
- if(Time.new - time > @timeout)
772
- puts ("Timeout")
773
- break
774
- end
775
- result = nil
776
- @workers.each(&:poll)
777
- @workers.map(&:nonblock_read_from_child).each_with_index{|ret,i|
778
- result = ret
779
- break if(ret)
780
- }
781
- if(result)
782
- return result
783
- else
784
- sleep(0.01)
785
- end
786
- }
782
+ obj = _predict_impl(parameter)
783
+ ret = obj[:result]
784
+ error = obj[:error]
787
785
  rescue => e
788
- puts "Predict error"
789
- puts e.class
790
- puts e.message
791
- puts e.backtrace
786
+ error = ""
787
+ error += e.class.to_s + "\n"
788
+ error += e.message.to_s + "\n"
789
+ error += e.backtrace.to_s + "\n"
792
790
  end
793
- return nil
791
+ return {:results => ret, :error => error,:parameter => parameter}
794
792
  end
795
793
 
796
794
  end
data/test.rb ADDED
@@ -0,0 +1,83 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'levdon'
4
+
5
+ # Account is not necessary during for free version.
6
+ APIKEY = ENV['EATER_ACCESS_TOKEN']
7
+ TARGET_PATH = "/Users/johndoe/Desktop/data/test_data"
8
+
9
+ USE_SYNC = true
10
+ if(USE_SYNC)
11
+ api = Levdon.new()
12
+ api.option({:CLASS => [:CLASS_ADULT]})
13
+ state = api.start(APIKEY)
14
+ if(state[:error])
15
+ puts state[:error]
16
+ else
17
+ Levdon.find_image(TARGET_PATH,{:no_check=>true}) {|obj|
18
+ path = obj[:source_path]
19
+ res = api.predict({:target => path})
20
+
21
+ if res[:error]
22
+ puts res[:error]
23
+ else
24
+ result = res[:results]
25
+ score = result[:CLASS_ADULT]
26
+ sscore1 = (( (score * 10000).to_i)/100).to_s.rjust(5, " ")+"%"
27
+ sscore2 = (score * 10000).to_i.to_s.rjust(5, "0")
28
+ puts "Score: "+sscore1 + " : " + path
29
+
30
+ dst_dirname = File.dirname(path)
31
+ FileUtils.mv(path,File.join(dst_dirname,"CLASS_ADULT_"+sscore2+"_"+SecureRandom.uuid+"."+path.split(".")[-1]))
32
+ end
33
+
34
+ }
35
+ end
36
+ api.close()
37
+ else
38
+ api = Levdon.new()
39
+ api.option({
40
+ :CLASS => [:CLASS_ADULT],
41
+ :PARALLEL => 32
42
+ })
43
+
44
+ api.async_start(APIKEY) {|state|
45
+ if(state[:error])
46
+ puts state[:error]
47
+ else
48
+ Levdon.find_image(TARGET_PATH,{:no_check=>true}) {|obj|
49
+ path = obj[:source_path]
50
+ #next if(File.basename(path).index("CLASS_ADULT_") == 0)
51
+ while(api.queue_size() > 32*4)
52
+ api.poll()
53
+ sleep(0.01)
54
+ end
55
+
56
+ api.async_predict({:target => path}) {|res|
57
+ if res[:error]
58
+ puts res[:error]
59
+ else
60
+ result = res[:results]
61
+ score = result[:CLASS_ADULT]
62
+ sscore1 = (( (score * 10000).to_i)/100).to_s.rjust(5, " ")+"%"
63
+ sscore2 = (score * 10000).to_i.to_s.rjust(5, "0")
64
+ puts "Score: "+sscore1 + " : " + path
65
+
66
+ dst_dirname = File.dirname(path)
67
+ FileUtils.mv(path,File.join(dst_dirname,"CLASS_ADULT_"+sscore2+"_"+SecureRandom.uuid+"."+path.split(".")[-1]))
68
+
69
+ end
70
+ }
71
+ }
72
+
73
+ while(api.queue_size()!=0)
74
+ api.poll()
75
+ sleep(0.01)
76
+ end
77
+
78
+ end
79
+ }
80
+ api.close()
81
+
82
+ end
83
+
data/test.sh ADDED
@@ -0,0 +1 @@
1
+ bundle exec ruby test.rb
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: levdon
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pegara, Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-05-11 00:00:00.000000000 Z
11
+ date: 2017-05-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -80,9 +80,17 @@ files:
80
80
  - Rakefile
81
81
  - bin/console
82
82
  - bin/setup
83
+ - denoise.rb
84
+ - denoise.sh
85
+ - example1.rb
86
+ - example1.sh
87
+ - example2.rb
88
+ - example2.sh
83
89
  - levdon.gemspec
84
90
  - lib/levdon.rb
85
91
  - lib/levdon/version.rb
92
+ - test.rb
93
+ - test.sh
86
94
  homepage: https://www.leviadon.com
87
95
  licenses:
88
96
  - MIT