Я использую пример API обнаружения объектов TF для обнаружения объектов в видео, и кажется, что конвейер данных является узким местом.
После запуска предоставленного примера кода, который делает вывод на одном изображении, который является очень медленным, и инициализирует сеанс после каждого вывода, я выполнил подачу пакетов с использованием конвейера tf-data. Это увеличило скорость примерно в 10 раз по сравнению с одиночным изображением. Тем не менее, во время логического вывода моя загрузка графического процессора примерно на 18% контролируется с помощью nvidia-smi.
Я хотел бы иметь такой конвейер данных, который может увеличить использование графического процессора и, в свою очередь, еще больше сократить время вывода.
Здесь я поделюсь двумя подходами, которые я использовал, с соответствующими временами. Пример видео имеет 484 кадра с разрешением 720x1080 с одинаковым размером пакета 128, используемым в обоих случаях.
Подход 1:
sess = tf.Session(graph=load_frozen_graph)
def getBatch(start, end):
loop from start to end:
#load one image into a numpy array
return numpy array
loop over num_batches:
get_inference = sess.run(tensor_dict, feed_dict:{getBatch(start, end)})
Подход 2:
sess = tf.Session(graph=load_frozen_graph)
dataset = tf.data.Dataset.from_tensor_slices((TEST_IMAGE_PATHS))
dataset = dataset.map(parse_function, num_parallel_calls=8)
dataset = dataset.batch(batch_size)
dataset = dataset.prefetch(1)
iterator = dataset.make_one_shot_iterator()
next_element = iterator.get_next()
sess2 = tf.Session()
while True:
i = i + 1
try:
image_batch = sess2.run(next_element)
get_inference = sess.run(tensor_dict, feed_dict = {image_tensor: image_batch})
except tf.errors.OutOfRangeError:
print("End of training dataset.")
break
Сравнение времени
Я рассчитал скрипт Python с функцией "time", как time python object_detection.py
| Approach 1 | Approach 2 |
| ----------------| ---------------- |
|real 2m29.634s| real 0m37.005s|
|user 3m46.984s| user 1m44.916s|
|sys 0m32.404s| sys 0m16.404s|