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