Tensorflow: restaurando um gráfico e modelo e executando a avaliação em uma única imagem
Eu acho que seria imensamente útil para a comunidade Tensorflow se houvesse uma solução bem documentada para a tarefa crucial de testar uma única nova imagem contra o modelo criado peloconvnet no tutorial CIFAR-10.
Eu posso estar errado, mas esta etapa crítica que torna o modelo treinado utilizável na prática parece estar faltando. Há um "link ausente" nesse tutorial - um script que carregaria diretamente uma única imagem (como matriz ou binária), a compararia com o modelo treinado e retornaria uma classificação.
As respostas anteriores fornecem soluções parciais que explicam a abordagem geral, mas nenhuma das quais consegui implementar com sucesso. Outros bits podem ser encontrados aqui e ali, mas infelizmente não foram adicionados a uma solução funcional. Por favor, considere a pesquisa que fiz antes de marcar isso como duplicado ou já respondido.
Tensorflow: como salvar / restaurar um modelo?
Restaurando o modelo TensorFlow
Não foi possível restaurar modelos no tensorflow v0.8
https://gist.github.com/nikitakit/6ef3b72be67b86cb7868
A resposta mais popular é a primeira, na qual @RyanSepassi e @YaroslavBulatov descrevem o problema e uma abordagem: é preciso "construir manualmente um gráfico com nomes de nó idênticos e usar o Saver para carregar os pesos nele". Embora ambas as respostas sejam úteis, não é aparente como alguém poderia inseri-las no projeto CIFAR-10.
Uma solução totalmente funcional seria altamente desejável para que pudéssemos portá-la para outros problemas de classificação de imagem única. Existem várias perguntas sobre SO nesse sentido que solicitam isso, mas ainda não há resposta completa (por exemplo,Carregue o ponto de verificação e avalie a imagem única com o DNN do tensorflow)
Espero que possamos convergir para um script de trabalho que todos possam usar.
O script abaixo ainda não está funcional e ficarei feliz em saber como isso pode ser aprimorado para fornecer uma solução para classificação de imagem única usando o modelo treinado pelo tutorial CIFAR-10 TF.
Suponha que todas as variáveis, nomes de arquivos etc. estejam intocados do tutorial original.
Novo arquivo:cifar10_eval_single.py
import cv2
import tensorflow as tf
FLAGS = tf.app.flags.FLAGS
tf.app.flags.DEFINE_string('eval_dir', './input/eval',
"""Directory where to write event logs.""")
tf.app.flags.DEFINE_string('checkpoint_dir', './input/train',
"""Directory where to read model checkpoints.""")
def get_single_img():
file_path = './input/data/single/test_image.tif'
pixels = cv2.imread(file_path, 0)
return pixels
def eval_single_img():
# below code adapted from @RyanSepassi, however not functional
# among other errors, saver throws an error that there are no
# variables to save
with tf.Graph().as_default():
# Get image.
image = get_single_img()
# Build a Graph.
# TODO
# Create dummy variables.
x = tf.placeholder(tf.float32)
w = tf.Variable(tf.zeros([1, 1], dtype=tf.float32))
b = tf.Variable(tf.ones([1, 1], dtype=tf.float32))
y_hat = tf.add(b, tf.matmul(x, w))
saver = tf.train.Saver()
with tf.Session() as sess:
sess.run(tf.initialize_all_variables())
ckpt = tf.train.get_checkpoint_state(FLAGS.checkpoint_dir)
if ckpt and ckpt.model_checkpoint_path:
saver.restore(sess, ckpt.model_checkpoint_path)
print('Checkpoint found')
else:
print('No checkpoint found')
# Run the model to get predictions
predictions = sess.run(y_hat, feed_dict={x: image})
print(predictions)
def main(argv=None):
if tf.gfile.Exists(FLAGS.eval_dir):
tf.gfile.DeleteRecursively(FLAGS.eval_dir)
tf.gfile.MakeDirs(FLAGS.eval_dir)
eval_single_img()
if __name__ == '__main__':
tf.app.run()