Потеря имен выходных узлов в модели TensorFlow после тонкой настройки из предварительно обученной модели - PullRequest
0 голосов
/ 18 апреля 2019

Я следую инструкциям по https://tensorflow -object-detection-api-tutorial.readthedocs.io , чтобы точно настроить предварительно обученную модель для обнаружения новых объектов на изображениях.Предварительно обученная модель: ssd_inception_v2_coco .

Я успешно обучил и оценил модель после нескольких тысяч шагов с потерями от 26 до 1. Однако мне не удалось создать замороженную модель сэтот код:

#this code runs in model dir
import tensorflow as tf

#make .pb file from model at step 1000
saver = tf.train.import_meta_graph(
        './model.ckpt-1000.meta', clear_devices=True)

graph = tf.get_default_graph()
input_graph_def = graph.as_graph_def()
sess = tf.Session()
saver.restore(sess, "./model.ckpt-1000")

#node names
i=0
for n in tf.get_default_graph().as_graph_def().node:
  print(n.name,i);    
  i+=1
#end for
print("total:",i);

output_node_names=[
  "detection_boxes","detection_classes",
  "detection_scores","num_detections"
];
output_graph_def = tf.graph_util.convert_variables_to_constants(
sess,input_graph_def,output_node_names);

#save to .pb file
output_graph="./model.pb"
with tf.gfile.GFile(output_graph, "wb") as f:
  f.write(output_graph_def.SerializeToString());
#end with

sess.close();

Ошибка:

enter image description here

Кажется, что настроенная модель потеряла своюимена выходных узлов .В исходной предварительно обученной модели есть следующие имена выходных узлов (измените файлы контрольных точек в вышеприведенном коде на файлы в исходной обученной модели): display_boxes, removal_classes, detection_scores и num_detections .Имена выходных узлов точно совпадают с исходными, вот их индексы (из вышеприведенного цикла «имя» узла):

enter image description here

Мой вопростакое как сохранить имена выходных узлов из исходной предварительно обученной модели ?Имена узлов определены в коде, но здесь нет кода, только некоторые конфиги и файл train.py.

PS.После total_loss есть нечто, называемое summary_op, но я не знаю, является ли это выводом (?):

enter image description here

1 Ответ

0 голосов
/ 19 апреля 2019

Чтобы иметь ' image_tensor ' (вход) и другие имена выходных узлов ' Detection_boxes ', ' Detection_classes ', ' Detection_scores. ',' num_detections ', используйте служебный скрипт в tenorflow / models / research / object_detection с именем' export_inference_graph.py '.Этот скрипт даже оптимизирует замороженный граф (замороженную модель) для вывода.Как проверено в моей тестовой модели, количество узлов сократилось с 26 000 до 5000;это отлично подходит для скорости вывода.

Вот ссылка на export_inference_graph.py: https://github.com/tensorflow/models/blob/0558408514dacf2fe2860cd72ac56cbdf62a24c0/research/object_detection/export_inference_graph.py

Как запустить:

#bash command
python3 export_inference_graph.py \
--input_type image_tensor \
--pipeline_config_path PATH_TO_PIPELINE.config \
--trained_checkpoint_prefix PATH_TO/model.ckpt-NUMBER \
--output_directory PATH_TO_NEW_DIR 

Создание .pbрассматриваемый код работает только на модели, созданной с нуля, с именами узлов, заданными вручную, для контрольной точки модели, настроенной из предварительно обученной модели, загруженной из TensorFlow Model Zoo https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md,, она не будет работать!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...