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()

questionAnswers(4)

yourAnswerToTheQuestion