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 } } ... ...
3 Réponses :
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()
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.input_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.
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
Ce n'est pas la réponse à la question. Vous pouvez ajouter un commentaire à la question existante
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()