我正在尝试使用输入队列在目录“ test_images”中将jpeg格式的多个图像分类。我认为最好的选择是使用输入队列来输入这些图像并对其进行分类(最好是批量)。但是,当我尝试执行此操作时,出现错误:“无法将类型的对象转换为Tensor”。任何建议如何解决此问题将不胜感激!
这是代码:
class image_recognition_algorithm():
def __init__(self, file_name, model_file, label_file):
self.model_file = model_file
self.label_file = label_file
self.file_name = file_name
def load_graph(self):
graph = tf.Graph()
graph_def = tf.GraphDef()
with open(model_file, "rb") as f:
graph_def.ParseFromString(f.read())
with graph.as_default():
tf.import_graph_def(graph_def)
return graph
def read_images_from_file(self, input_queue, input_height=299, input_width=299,
input_mean=128, input_std=128):
input_queue = "file_contents"
output_name = "normalized"
input_queue = [f for f in listdir('test_images') if isfile(join('test_images', f))]
file_contents = tf.read_file(input_queue[0])
image_reader = tf.image.decode_jpeg(file_contents, channels=3)
float_caster = tf.expand_dims(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])
images = tf.convert_to_tensor(image_list)
input_queue = tf.train.slice_input_producer([images], shuffle=True)
image = read_images_from_file(input_queue)
image = preprocess_image(image)
image_batch = tf.train.batch([image], batch_size=5)
sess = tf.Session()
result = sess.run(image)
return result
def load_labels(self, label_file):
label = []
proto_as_ascii_lines = tf.gfile.GFile(label_file).readlines()
for l in proto_as_ascii_lines:
label.append(l.rstrip())
return label
def main(self, file_name):
self.model_file = "tf_files/retrained_graph.pb"
self.label_file = "tf_files/retrained_labels.txt"
input_layer = "Mul"
output_layer = "final_result"
graph = self.load_graph()
res_list = []
for f in file_name:
t = self.read_images_from_file(f)
input_name = "import/" + input_layer
output_name = "import/" + output_layer
input_operation = graph.get_operation_by_name(input_name);
output_operation = graph.get_operation_by_name(output_name);
config = tf.ConfigProto(device_count={"CPU": 4},
inter_op_parallelism_threads=1,
intra_op_parallelism_threads=4)
self.sess = tf.Session(graph=graph, config=config)
start = time.time()
results = self.sess.run(output_operation.outputs[0],
{input_operation.outputs[0]: t})
end=time.time()
results = np.squeeze(results)
top_k = results.argsort()[-5:][::-1]
labels = load_labels(label_file)
print('\nEvaluation time (1-image): {:.3f}s\n'.format(end-start))
for i in top_k:
print(file_name, labels[i], results[i])
return [file_names] + list(results)
res_list = [f for f in listdir('test_images') if isfile(join('test_images', f))]
for image in res_list:
if image.lower().endswith(('.png', '.jpg', '.jpeg', '.gif')):
res_list.append(join('test_images', image))
return res_list
if __name__ == '__main__':
model_file = "tf_files/retrained_graph.pb"
label_file = "tf_files/retrained_labels.txt"
file_name = [f for f in listdir('test_images') if
isfile(join('test_images', f))]
image_recognition_algorithm_obj =
image_recognition_algorithm(model_file, label_file, file_name)
image_recognition_algorithm_obj.main(file_name)