TensorRT для масштабирования изображений не дает ожидаемых результатов - PullRequest
0 голосов
/ 24 мая 2018

Я сражаюсь с TensorRT (TensorRT 4 для python прямо сейчас) уже несколько недель.Я прошел много проблем, чтобы запустить TensorRT.Пример кода от NVIDIA хорошо работает для меня: Пример TensorRT MNIST

Теперь я создал свою собственную сеть в тензорном потоке (очень простом) для масштабирования изображений, скажем (в HWC)От 320x240x3 до 640x480x3. Обычный способ создания замороженного графа и запуска логического модуля, основанного только на Tensorflow, дал мне ожидаемые результаты, но не с помощью TensorRT.

У меня странное ощущение, что я сделал что-то не так, подаваяизображения в GPU-память (вероятно, это проблема Pycuda и / или TensorRT).

В худшем случае TensorRT уничтожает мою сеть в процессе оптимизации.

Надеюсь, у кого-то есть только небольшая идея спасти мою жизнь.Это моя модель Tensorflow (я только что обернул функции):

net = conv2d(input,
             64,
             k_size=3,
             activation=tf.nn.relu,
             name='conv1')

net = deconv2d(net,
               3,
               k_size=5,
               activation=tf.tanh,
               stride=self.params.resize_factor,
               scale=self.params.resize_factor,
               name='deconv')

Это важный фрагмент моего логического вывода:

import tensorrt as trt
import uff
from tensorrt.parsers import uffparser
import pycuda.driver as cuda
import numpy as np
...

def _init_infer(self, uff_model):

   g_logger = trt.infer.ConsoleLogger(trt.infer.LogSeverity.ERROR)

   parser = uffparser.create_uff_parser()
   parser.register_input(self.input_node, (self.channels, self.height, self.width), 0)
   parser.register_output(self.output_node)

   self.engine = trt.utils.uff_to_trt_engine(g_logger, uff_model, parser, self.max_batch_size,
                                              self.max_workspace_size)

   parser.destroy()

   self.runtime = trt.infer.create_infer_runtime(g_logger)
   self.context = self.engine.create_execution_context()

   self.output = np.empty(self.output_size, dtype=self.dtype)

   # create CUDA stream
   self.stream = cuda.Stream()

   # allocate device memory
   self.d_input = cuda.mem_alloc(self.channels * self.max_batch_size * self.width *
                                  self.height * self.output.dtype.itemsize)
   self.d_output = cuda.mem_alloc(self.output_size * self.output.dtype.itemsize)

   self.bindings = [int(self.d_input), int(self.d_output)]

def infer(self, input_batch, batch_size=1):

    # transfer input data to device
    cuda.memcpy_htod_async(self.d_input, input_batch, self.stream)
    # execute model
    self.context.enqueue(batch_size, self.bindings, self.stream.handle, None)
    # transfer predictions back
    cuda.memcpy_dtoh_async(self.output, self.d_output, self.stream)
    # synchronize threads
    self.stream.synchronize()

    return self.output

И исполняемый фрагмент:

...
# create trt inferencer
trt_inferencer = TensorRTInferencer(params=params)

img = [misc.imread('./test_images/lion.png')]
img[0] = normalize(img[0])
img = img[0]

# inferencing method
result = trt_inferencer.infer(img)
result = inormalize(result, dtype=np.uint8)

result = result.reshape(1, params.height * 2, params.width * 2, 3)
...

И странный результат при сравнении :( лев масштабированный TensorRT, Tensorflow, Original

1 Ответ

0 голосов
/ 25 мая 2018

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

...
# create trt inferencer
trt_inferencer = TensorRTInferencer(params=params)

img = [misc.imread('./test_images/lion.png')]
img[0] = normalize(img[0])
img = img[0]

img = np.transpose(img, (2, 0, 1))
img = img.ravel()

# inferencing method
result = trt_inferencer.infer(img)
result = inormalize(result, dtype=np.uint8)

result = np.reshape(result, newshape=[3, params.height * 2, params.width * 2])
result = np.transpose(result, (1, 2, 0))
...
...