Class: Magick::Image

Inherits:
Object
  • Object
show all
Defined in:
lib/deepselect.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#in_dselectObject

dselect内かどうかのフラグ もう少しいい書き方ないのか



89
90
91
# File 'lib/deepselect.rb', line 89

def in_dselect
  @in_dselect
end

Instance Method Details

#==(image) ⇒ Object



119
120
121
122
123
124
125
126
127
128
129
130
# File 'lib/deepselect.rb', line 119

def ==(image)
  if self.in_dselect or image.in_dselect
    # guard
    unless image.class == Magick::Image
      raise "現状dselectの比較相手はMagick::Imageのみ対応です" +
      "images.dselect{|dselect_image| dselect_image == image} のノリで"
    end
    DSelect.compare(self, image)
  else
    return self.default_equal(image)
  end
end

#comapre_vector(image) ⇒ Object



146
147
148
149
150
151
152
153
154
155
# File 'lib/deepselect.rb', line 146

def comapre_vector(image)
  if image.class != Magick::Image # or image.class != Array
    # 文章長すぎ
    err_stdout = "Error: あとでErrorClass名追加します
     compare対象はMagick::Imageでないと駄目です
     compare arg must be Magick::Image"
    raise err_stdout
  end
  return DSelect.compare(self, image)
end

#default_equalObject

alias :to_v :to_vector さすがに他のライブラリと被りそうな気が



118
# File 'lib/deepselect.rb', line 118

alias :default_equal :==

#to_menoh_imageObject



132
133
134
135
136
137
138
139
140
141
142
143
144
# File 'lib/deepselect.rb', line 132

def to_menoh_image
  # TODO: DRYできていない場所が多すぎるので直す
  # model_optから引っ張ってくるのありだろうけどめんどいな
  input_shape = {
    channel_num: 3,
      width: 224,
      height: 224
  }
  image = self.resize_to_fill(input_shape[:width], input_shape[:height])
  'BGR'.split('').map do |color|
    image.export_pixels(0, 0, image.columns, image.rows, color).map { |pix| pix / 256 }
  end.flatten
end

#to_vectorObject

batch処理したほうが速いだろうけどとりあえず逐次処理



97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# File 'lib/deepselect.rb', line 97

def to_vector
  return @vector if @vector

  vgg16 = DSelect.vgg16
  opt = DSelect.model_opt
  model = vgg16.make_model(opt)

  # onnx variable name
  conv1_id, fc6_id, softmax_id = DSelect.id.values
  
  image = self.to_menoh_image
  image_set = [{ name: conv1_id, data: image}]
  result = model.run(image_set)

  network_output = result.find { |x| x[:name] == fc6_id }
  @vector = network_output[:data].first

  return @vector
end