Deeplab — несогласованный вывод и производительность визуализации на обученной модели Deeplab

#python #tensorflow #deeplab

#python #тензорный поток #deeplab

Вопрос:

Опишите проблему

Я успешно обучил свою модель на пользовательском наборе данных с 4 классами размером 480×640, с кодировщиком xception65, используя Deeplab. Я получаю приличные результаты в наборе проверки всякий раз, когда использую vis.py скрипт: evalimagea_cckpt, EvalImageB_ckpt. Однако я не получаю одинаковые результаты на одних и тех же изображениях, когда замораживаю модель.

Я заморозил модель, используя export_model.py и успешно вывел файл frozen_model.pb. Однако, когда я выполняю выводы с использованием этого файла pb, Выходные данные всегда равны 0 (т. Е. Все классифицируется как «фоновые») на тех же самых изображениях, ссылки на которые я предоставил выше. Все черное!

Я считаю, что это проблема с тем, как я экспортирую или загружаю модель, и не обязательно с самой моделью, потому что производительность изображений различается между запуском vis.py скрипта и моим пользовательским кодом для вывода. Возможно, я неправильно загружаю график или инициализирую переменные. Или, возможно, я изначально неправильно сохраняю веса. Любая помощь будет с благодарностью!

Исходный код

Ниже я предоставляю свой код для вывода:

 from deeplab.utils import get_dataset_colormap
from PIL import Image
import tensorflow as tf
import time
import matplotlib.pyplot as plt
import numpy as np
import cv2
import os
import glob


# tensorflow arguments
flags = tf.app.flags  # flag object for setup
FLAGS = flags.FLAGS   # object to access initialized flags
flags.DEFINE_string('frozen', None,
                    'The path/to/frozen.pb file.')

def _load_graph(frozen):
    print('Loading model `deeplabv3_graph` into memory from',frozen)
    with tf.gfile.GFile(frozen, "rb") as f:
        graph_def = tf.GraphDef()
        graph_def.ParseFromString(f.read())
    with tf.Graph().as_default() as graph:
        tf.import_graph_def(
            graph_def, 
            input_map=None, 
            return_elements=None, 
            name="", 
            op_dict=None, 
            producer_op_list=None
        )
    return graph

def _run_inferences(sess, image, title):
    batch_seg_map = sess.run('SemanticPredictions:0',
        feed_dict={'ImageTensor:0': [np.asarray(image)]})
    semantic_prediction = get_dataset_colormap.label_to_color_image(batch_seg_map[0],
        dataset=get_dataset_colormap.__PRDL3_V1).astype(np.uint8)
    plt.imshow(semantic_prediction)
    plt.axis('off')
    plt.title(title)
    plt.show()


def main(argv):
    # initialize model
    frozen = os.path.normpath(FLAGS.frozen)
    assert os.path.isfile(frozen)
    graph = _load_graph(frozen)

    # open graph resource and begin inference in-loop
    with tf.Session(graph=graph) as sess:
        for img_path in glob.glob('*.png'):
            img = Image.open(img_path).convert('RGB')
            _run_inferences(sess, img, img_path)

if __name__ == '__main__':
    flags.mark_flag_as_required('frozen')
    tf.app.run()  # call the main() function
 

И ниже приведен мой код для экспорта модели с использованием предоставленного export_model.py скрипта.

 python export_model.py 
--logtostderr 
--atrous_rates=6 
--atrous_rates=12 
--atrous_rates=18 
--output_stride=16 
--checkpoint_path="/path/to/.../model.ckpt-32245" 
--export_path="/path/to/.../frozen_4_11_19.pb" 
--model_variant="xception_65" 
--num_classes=4 
--crop_size=481 
--crop_size=641 
--inference_scales=1.0
 

Системная информация

  • Какой каталог верхнего уровня используемой вами модели: deeplab
  • Написал ли я пользовательский код (в отличие от использования стандартного примера сценария, предоставленного в TensorFlow): Да
  • Платформа и дистрибутив ОС (например, Linux Ubuntu 16.04): Windows 10 Enterprise
  • TensorFlow, установленный из (исходного или двоичного): двоичный
  • Версия TensorFlow (используйте команду ниже): 1.12.0
  • Базовая версия (при компиляции из исходного кода): нет
  • Версия CUDA / cuDNN: 9
  • Модель графического процессора и память: NVIDIA Quadro M4000, 8 ГБ
  • Точная команда для воспроизведения: не применяется

Ответ №1:

Запустите сценарий экспорта модели со следующими флагами

 python deeplab/export_model.py 
--logtostderr 
--model_variant="xception_65" 
--atrous_rates=6 
--atrous_rates=12 
--atrous_rates=18 
--output_stride=16 
--num_classes=2 
--decoder_output_stride=4 
--crop_size=<<crop width>> 
--crop_size=<<crop height>> 
--dataset="shoes" 
--checkpoint_path="<<Checkpoint path>>" 
--export_path="<<Output frozen graph path>>" 
 

Комментарии:

1. python deeplab/export_model.py —logtostderr —input_type=image_tensor —checkpoint_path=/code/models/research/deeplab/weights_input_level_17/model.ckpt-22000 —export_path=/code/models/research/deeplab/frozen_weight_level_17/frozen_inference_graph.pb —model_variant=»xception_65″ —atrous_rates=6 —atrous_rates=12 — atrous_rates=18 —output_stride=16 —decoder_output_stride=4 —crop_size=2048 —crop_size= 2048 —num_classes= 3 —dataset=»pascal_voc_seg»

Ответ №2:

Я также борюсь с результатами своих выводов. Но в моем случае у меня есть вполне удовлетворительные результаты при использовании экспортированной модели, просто они менее точны, чем мои результаты визуализации.

Вот мой сценарий, это сценарий, основанный на том, который доступен в качестве демонстрации. Надеюсь, это поможет

 import os

from matplotlib import gridspec
from matplotlib import pyplot as plt
import numpy as np
from PIL import Image
import time
import cv2
from tqdm import tqdm

import tensorflow as tf

# Needed to show segmentation colormap labels

from deeplab.utils import get_dataset_colormap
from deeplab.utils import labels_alstom

flags = tf.app.flags

FLAGS = flags.FLAGS

flags.DEFINE_string('model_dir', None, 'Where the model is')
flags.DEFINE_string('image_dir', None, 'Where the image is')
flags.DEFINE_string('save_dir', None, 'Dir for saving results')
flags.DEFINE_string('image_name', None, 'Image name')



class DeepLabModel(object):
    """Class to load deeplab model and run inference."""

    INPUT_TENSOR_NAME = 'ImageTensor:0'
    OUTPUT_TENSOR_NAME = 'SemanticPredictions:0'
    INPUT_SIZE = 513

    def __init__(self, model_dir):
        """Creates and loads pretrained deeplab model."""
        self.graph = tf.Graph()

        graph_def = None
        # Extract frozen graph from tar archive.
        model_filename = FLAGS.model_dir
        with tf.gfile.FastGFile(model_filename, 'rb') as f:
            graph_def = tf.GraphDef()
            graph_def.ParseFromString(f.read())

        if graph_def is None:
            raise RuntimeError('Cannot find inference graph in tar archive.')

        with self.graph.as_default():
            tf.import_graph_def(graph_def, name='')

        self.sess = tf.Session(graph=self.graph)

    def run(self, image):
        """Runs inference on a single image.

        Args:
            image: A PIL.Image object, raw input image.

        Returns:
            resized_image: RGB image resized from original input image.
            seg_map: Segmentation map of `resized_image`.
        """
        width, height = image.size
        resize_ratio = 1.0 * self.INPUT_SIZE / max(width, height)
        target_size = (int(resize_ratio * width), int(resize_ratio * height))
        resized_image = image.convert('RGB').resize(target_size, Image.ANTIALIAS)
        print('Image resized')
        start_time = time.time()
        batch_seg_map = self.sess.run(
            self.OUTPUT_TENSOR_NAME,
            feed_dict={self.INPUT_TENSOR_NAME: [np.asarray(resized_image)]})
        print('Image processing finished')
        print('Elapsed time : '   str(time.time() - start_time))
        seg_map = batch_seg_map[0]
        return resized_image, seg_map


model = DeepLabModel(FLAGS.model_dir)
print('Model created successfully')



def vis_segmentation(image, seg_map):
    
    seg_image = get_dataset_colormap.label_to_color_image(
         seg_map, get_dataset_colormap.get_alstom_name()).astype(np.uint8)
         
    return seg_image



def run_demo_image(image_path):
    try:
        print(image_path)
        orignal_im = Image.open(image_path)

    except IOError:
        print ('Failed to read image from %s.' % image_path)
        return
    print ('running deeplab on image...')
    resized_im, seg_map = model.run(orignal_im)

    return vis_segmentation(resized_im, seg_map)



IMAGE_DIR = FLAGS.image_dir


files = os.listdir(FLAGS.image_dir)
for f in tqdm(files):

    prediction = run_demo_image(IMAGE_DIR f)
    Image.fromarray(prediction).save(FLAGS.save_dir 'prediction_' f)