我正在使用TF运行图像识别(session.run)。我正在循环播放图像文件夹,并逐个顺序地识别它们。我遇到了奇怪的现象,在〜20-500张图像(取决于机器)之后,每个session.run的运行时间都在增加。在几百张图像之后,持续时间慢了近100倍。为了清楚起见,我在构造函数中创建会话,并在另一个函数中使用它。参见下面的类代码,我为它创建了一个实例,并针对每个图像循环使用了识别功能。
有人也遇到过这种情况吗?
def __init__(self, verboseSingleRec=True, verboseSummary=True, modelFile='model.pb', labelFile='labels.txt',
height=299, width=299, mean=0, std=255,
input_layer='Mul', output_layer='final_result'):
self.model_file = modelFile
self.label_file = labelFile
self.verbose = False
# Load Graph
graph = tf.Graph()
graph_def = tf.GraphDef()
with open(model_file, "rb") as f:
graph_def.ParseFromString(f.read())
with graph.as_default():
self.graph = tf.import_graph_def(graph_def)
# Load Labels
label = []
proto_as_ascii_lines = tf.gfile.GFile(label_file).readlines()
for l in proto_as_ascii_lines:
label.append(l.rstrip())
self.labels = label
# Init session
self.tfSession = tf.Session(graph=self.graph)
def recognize(self, image):
tf.reset_default_graph()
input_height=299,
input_width=299,
input_mean=0,
input_std=255
with tf.Graph().as_default():
# Get Tensor from image path
input_name = "file_reader"
output_name = "normalized"
file_reader = tf.read_file(image, input_name)
image_reader = tf.image.decode_png(file_reader, channels=3, name='png_reader')
float_caster = tf.cast(image_reader, tf.float32)
dims_expander = tf.expand_dims(float_caster, 0);
resized = tf.image.resize_bilinear(dims_expander, [input_height, input_width])
normalized = tf.divide(tf.subtract(resized, [input_mean]), [input_std])
sess = tf.Session()
session_result_1 = sess.run(normalized)
input_name = "import/" + self.input_layer
output_name = "import/" + self.output_layer
input_operation = self.graph.get_operation_by_name(input_name);
output_operation = self.graph.get_operation_by_name(output_name);
sess = self.tfSession
session_result_2 = sess.run(output_operation.outputs[0],
{input_operation.outputs[0]: session_result_1})
return session_result_2
答案 0 :(得分:0)
您的问题是由于错误地使用了数据流范例以及TensorFlow计算图
这个想法是您只计算一次图,然后使用会话对象运行图的节点。此外,图应完全连接。
在您的代码中,有两个不遵循此模式的问题:
对于每一次识别,您都会构建图形的整个新部分,并且图形会不断增长,从而导致您正在谈论的性能降低问题。构建封装在对象内部的模型的一种常见方法是完全在构造函数内部构建模型,并仅使用方法返回特定节点。
您正在将图形分为两个不同的部分。首先,您检索 <record id="view_order_line_form_view" model="ir.ui.view">
<field name="name">sale.order.line.forma</field>
<field name="model">sale.order.line</field>
<field name="arch" type="xml">
<form string="Sales Order Lines">
<field name="product_id" />
<field name="product_uom_qty" string="Qty" placeholder="Qty"/>
<field name="price_unit" string="Price"/>
</form>
</field>
</record>
class SaleOrderLine(models.Model):
_inherit = "sale.order.line"
@api.multi
def button_details(self):
context = self.env.context.copy()
context['view_buttons'] = True
view_id = self.env.ref('cfg.view_order_line_form_view').id
view = {
'name': _('Details'),
'view_type': 'form',
'view_mode': 'form',
'res_model': 'sale.order.line',
'views' : [(view_id,'form')],
'type': 'ir.actions.act_window',
'target': 'new',
'readonly': True,
'res_id': self.id,
'context': context
}
return view
,然后将其提供为图形的另一个组件的输入。尝试找到一种方法来连接这两个部分(构造函数中的所有内容),以便您可以通过一次执行会话来检索结果。