0

J'ai un réseau de segmentation d'image conçu pour classer les routes et les obstacles. Je veux figer le modèle et le servir comme API. J'ai donc utilisé l'outil TensorFlow par défaut pour geler le modèle. Après le gel, la sortie donnée par le réseau est complètement éteinte et imprécise.Freezing Model drops Exactitude de sortie

Voici un exemple.

L'image d'entrée

enter image description here

Sortie lors des tests en utilisant les fichiers Checkpoint enter image description here

Sortie après congélation du modèle enter image description here

J'ai essayé de geler en utilisant différentes versions de tensorflow, mais cela n'a pas aidé. Étant donné que le réseau fonctionne comme excepté lorsqu'il est testé par rapport au point de contrôle, le problème, je pense, est dans le script Freeze Models. Le réseau utilise Batch_normalisation. Cela pourrait-il être la raison de cette baisse parce que j'ai vu quelques problèmes liés à celui de nature similaire? Comment puis-je éviter cela?

Here's le réseau complet

prédiction en utilisant Checkpoint fichiers

with tf.Graph().as_default() as graph: 
    images_tensor = tf.train.string_input_producer(images_list, shuffle=False) 
    reader = tf.WholeFileReader() 
    key, image_tensor = reader.read(images_tensor) 
    image = tf.image.decode_png(image_tensor, channels=3) 
    image = preprocess(image) 
    images = tf.train.batch([image], batch_size = 1, allow_smaller_final_batch=True) 

    #Create the model inference 
    with slim.arg_scope(ENet_arg_scope()): 
     logits, probabilities = ENet(images, 
            num_classes=4, 
            batch_size=1, 
            is_training=True, 
            reuse=None, 
            num_initial_blocks=num_initial_blocks, 
            stage_two_repeat=stage_two_repeat, 
            skip_connections=skip_connections) 

    variables_to_restore = slim.get_variables_to_restore() 
    saver = tf.train.Saver(variables_to_restore) 
    def restore_fn(sess): 
     return saver.restore(sess, checkpoint) 
    predictions = tf.argmax(probabilities, -1) 
    predictions = tf.cast(predictions, tf.float32) 
    sv = tf.train.Supervisor(logdir=None, init_fn=restore_fn) 
    with sv.managed_session() as sess: 
     for i in xrange(int(len(images_list)/1 + 1)): 
      segmentations = sess.run(predictions) 
      for j in xrange(segmentations.shape[0]): 
       converted_image = grayscale_to_colour(segmentations[j],i,j) 
       imsave(photo_dir + "/imagelabel_%05d_edges.png" %(i*1 + j), converted_image) 

Prévision de PB fichier

def predict(): 
    start = time.time() 
    y_out = persistent_sess.run(y, feed_dict={x: x_in}) 
    end = time.time() 
    print(end-start) 
    return y_out 

with tf.Session() as sess: 
    model_filename = "frozen_model_tf_version.pb" 
    with gfile.FastGFile(model_filename, 'rb') as f: 
     graph_def = tf.GraphDef() 
     graph_def.ParseFromString(f.read()) 
     tf.import_graph_def(graph_def) 
     g_in = tf.get_default_graph() 

x = g_in.get_tensor_by_name('import/batch:0') 
y = g_in.get_tensor_by_name('import/ENet/output:0') 

persistent_sess = tf.Session(graph=g_in) 
x_in_unaltered=cv2.imread(img) 
x_in_unaltered = cv2.resize(x_in_unaltered,(480,360),interpolation=cv2.INTER_CUBIC) 
x_in = np.expand_dims(x_in_unaltered.flatten(),axis=0) 
predictions=predict() 
print(np.unique(predictions,return_counts=True)) 
out = np.array(predictions[0],dtype=np.float32) 
out = np.reshape(out, [360,480]) 
converted_image = grayscale_to_colour(out,x_in_unaltered) 
cv2.imwrite("out.png",converted_image) 
+0

Vous devez ajouter du code lié à ce problème. –

+0

@IshantMrinal Voulez-vous dire le NN Graph? Parce que j'ai utilisé l'outil de modèle de gel par défaut dans tensorflow par 'python -m tensorflow.python.tools.freeze_graph --input_graph graph.pb --input_checkpoint test_model --output_graph graph_frozen.pb --output_node_names = y' –

+0

le fichier de définition du modèle (où vous avez défini les couches de tensorflow etc) et les deux codes de prédictions –

Répondre

1

Ici, le problème est lié à is_training, puisque vous utilisez dropout et batch_norm, pendant le temps de prédiction is_training doit être défini sur False. alors vous pouvez vous attendre aux mêmes résultats.

logits, probabilities = ENet(images, 
           num_classes=4, 
           batch_size=1, 
           is_training=False, 
           reuse=None, 
           num_initial_blocks=num_initial_blocks, 
           stage_two_repeat=stage_two_repeat, 
           skip_connections=skip_connections) 
+0

Ceci est pour le cas en utilisant les fichiers de point de contrôle? –

+0

Mais le problème en termes de précision est dans le cas de prédiction du modèle Freeze. –