4
votes

Modification dynamique de la configuration du pipeline pour la détection d'objets Tensorflow

J'utilise l'API de détection d'objet tensorflow et je souhaite pouvoir modifier le fichier de configuration de manière dynamique en python, ce qui ressemble à ceci. J'ai pensé à utiliser la bibliothèque de tampons de protocole en python, mais je ne sais pas comment s'y prendre.

TypeError: Can't set composite field

}

Existe-t-il un moyen simple / facile de modifier des valeurs spécifiques pour des champs tels que la hauteur dans image_resizer -> fixed_shape_resizer de 300 à 500? Et réécrire le fichier avec des valeurs modifiées sans rien changer d'autre?

EDIT: Bien que la réponse fournie par @DmytroPrylipko ait fonctionné pour la plupart des paramètres de la configuration, je rencontre quelques problèmes avec le "champ composite" ..

Autrement dit, si nous avons une configuration comme:

 pipeline_config.train_input_reader.tf_record_input_reader.input_path = "/tensorflow/models/data/train100.record"

Et j'ajoute cette ligne pour éditer input_path:

train_input_reader: {
  label_map_path: "/tensorflow/data/label_map.pbtxt"
  tf_record_input_reader {
    input_path: "/tensorflow/models/data/train.record"
  }
}

Il jette une erreur:

model {
ssd {
num_classes: 1
image_resizer {
  fixed_shape_resizer {
    height: 300
    width: 300
  }
}
feature_extractor {
  type: "ssd_inception_v2"
  depth_multiplier: 1.0
  min_depth: 16
  conv_hyperparams {
    regularizer {
      l2_regularizer {
        weight: 3.99999989895e-05
      }
    }
    initializer {
      truncated_normal_initializer {
        mean: 0.0
        stddev: 0.0299999993294
      }
    }
    activation: RELU_6
    batch_norm {
      decay: 0.999700009823
      center: true
      scale: true
      epsilon: 0.0010000000475
      train: true
    }
  }
 ...
 ...


0 commentaires

3 Réponses :


9
votes

Oui, utiliser l'API Protobuf Python est assez simple:

edit_pipeline.py :

pipeline_config.eval_input_reader[0].label_map_path  = label_map_full_path
pipeline_config.eval_input_reader[0].tf_record_input_reader.input_path[0] = val_record_path

La façon dont j'appelle le script:

pipeline_config.train_input_reader.tf_record_input_reader.input_path[0] = '/tensorflow/models/data/train100.record'

Champs composites

En cas de champs répétés, vous devez les traiter comme des tableaux (par exemple, utilisez les méthodes extend() , append() ):

TOOL_DIR=tool/tf-models/research

(
   cd $TOOL_DIR
   protoc object_detection/protos/*.proto --python_out=.
)

export PYTHONPATH=$PYTHONPATH:$TOOL_DIR:$TOOL_DIR/slim

python3 edit_pipeline.py pipeline.config pipeline_new.config

Erreur du lecteur d'entrée d'évaluation

Il s'agit d'une erreur courante lors de la tentative de modification du champ composite. ( "aucun attribut tf_record_input_reader trouvé" dans le cas de eval_input_reader )

Il est mentionné ci-dessous dans la réponse de @ latida. Corrigez cela en le définissant comme un champ de tableau.

import argparse

import tensorflow as tf
from google.protobuf import text_format
from object_detection.protos import pipeline_pb2


def parse_arguments():                                                                                                                                                                                                                                                
    parser = argparse.ArgumentParser(description='')                                                                                                                                                                                                                  
    parser.add_argument('pipeline')                                                                                                                                                                                                                                   
    parser.add_argument('output')                                                                                                                                                                                                                                     
    return parser.parse_args()                                                                                                                                                                                                                                        


def main():                                                                                                                                                                                                                                                           
    args = parse_arguments()                                                                                                                                                                                                                                          
    pipeline_config = pipeline_pb2.TrainEvalPipelineConfig()                                                                                                                                                                                                          

    with tf.gfile.GFile(args.pipeline, "r") as f:                                                                                                                                                                                                                     
        proto_str = f.read()                                                                                                                                                                                                                                          
        text_format.Merge(proto_str, pipeline_config)                                                                                                                                                                                                                 

    pipeline_config.model.ssd.image_resizer.fixed_shape_resizer.height = 300                                                                                                                                                                                          
    pipeline_config.model.ssd.image_resizer.fixed_shape_resizer.width = 300                                                                                                                                                                                           

    config_text = text_format.MessageToString(pipeline_config)                                                                                                                                                                                                        
    with tf.gfile.Open(args.output, "wb") as f:                                                                                                                                                                                                                       
        f.write(config_text)                                                                                                                                                                                                                                          


if __name__ == '__main__':                                                                                                                                                                                                                                            
    main() 


6 commentaires

Merci beaucoup pour votre réponse, mais je suis confronté à des problèmes avec les "champs composites" .. Pourriez-vous s'il vous plaît me suggérer comment résoudre ce problème? J'ai mis à jour la question avec plus de détails. Merci encore.


pipeline_config.train_input_reader.tf_record_input_reader.in‌​put_path[0] = '/tensorflow/models/data/train100.record' . Voir la réponse mise à jour. En savoir plus sur les champs composites: stackoverflow.com/questions/18376190/...


Tu es incroyable! Enfin le problème des champs composites est résolu! Merci beaucoup!!


Pour moi, changer input_path et label_map_path fonctionne bien pour train_input_reader mais affiche une erreur "aucun attribut tf_record_input_reader trouvé" dans le cas de eval_input_reader


Qu'en est-il d'un champ composite dans le cas où vous souhaitez remplacer object_detection.protos.image_resizer_pb2.FixedShapeResizer par object_detection.protos.image_resizer_pb2.KeepAspectRatioRes‌ izer?


@Austin Avez-vous trouvé le moyen de remplacer FixedShapeResizer par KeepAspectRatioResizer? Je dois remplacer KeepAspectRatioResizer par FixedShapeResizer dans Faster RCNN.



0
votes
pipeline_config.eval_input_reader[0].label_map_path  = label_map_full_path
pipeline_config.eval_input_reader[0].tf_record_input_reader.input_path[0] = val_record_path

1 commentaires

Ce n'est pas la réponse à la question. Vous pouvez ajouter un commentaire à la question existante



0
votes

C'est le même code ci-dessus avec de petits changements qui conviennent au tensorflow V2.

import argparse

import tensorflow as tf
from google.protobuf import text_format
from object_detection.protos import pipeline_pb2

def parse_arguments():                                                                                                                                                                                                                                                
    parser = argparse.ArgumentParser(description='')                                                                                                                                                                                                                  
    parser.add_argument('pipeline')                                                                                                                                                                                                                                   
    parser.add_argument('output')                                                                                                                                                                                                                                     
    return parser.parse_args()                                                                                                                                                                                                                                        


def main():                                                                                                                                                                                                                                                           
    args = parse_arguments()                                                                                                                                                                                                                                          
    pipeline_config = pipeline_pb2.TrainEvalPipelineConfig()                                                                                                                                                                                                          

    with tf.io.gfile.GFile(args.pipeline, "r") as f:                                                                                                                                                                                                                     
        proto_str = f.read()                                                                                                                                                                                                                                          
        text_format.Merge(proto_str, pipeline_config)                                                                                                                                                                                                                 

    pipeline_config.model.ssd.image_resizer.fixed_shape_resizer.height = 300                                                                                                                                                                                          
    pipeline_config.model.ssd.image_resizer.fixed_shape_resizer.width = 300                                                                                                                                                                                           

    config_text = text_format.MessageToString(pipeline_config) 
                                                                                                                                                                                                   
    with tf.io.gfile.GFile(args.output, "wb") as f:                                                                                                                                                                                                                
        f.write(config_text)                                                                                                                                                                                                                                          

if __name__ == '__main__':                                                                                                                                                                                                                                            
    main() 


0 commentaires