Listing 1: Softwarepakete aufspielen

apt-get update
apt-get install libhdf5-serial-dev hdf5-tools libhdf5-dev zlib1g-dev zip libjpeg8-dev liblapack-dev libblas-dev gfortran
apt-get install python3-pip
pip3 install -U pip testresources setuptools
pip3 install -U numpy==1.16.1 future==0.17.1 mock==3.0.5 h5py==2.9.0 keras_preprocessing==1.0.5 keras_applications==1.0.8 gast==0.2.2 futures protobuf pybind11

Listing 2: Von Keras nach ONNX mit keras2onnx
   import os
   os.environ['TF_KERAS'] = '1'
   import onnx
   import tensorflow as tf
   from tensorflow.keras.layers import Input, Dense, Add
   from tensorflow.keras.models import Model
   from core.yolov3 import YOLOv3, decode
   import onnx
   import keras2onnx

   input_size   = 416
   input_layer  = tf.keras.layers.Input([input_size, input_size, 3])
   feature_maps = YOLOv3(input_layer)

   bbox_tensors = []
   for i, fm in enumerate(feature_maps):
      bbox_tensor = decode(fm, i)
       bbox_tensors.append(bbox_tensor)
  
   keras_model = tf.keras.Model(input_layer, bbox_tensors)
  
   keras_model.load_weights("./starwars_yolov3")
   onnx_model = keras2onnx.convert_keras(keras_model,keras_model.name)
   onnx.save_model(onnx_model, "starwars_yolov3.onnx")

Listing 3: predict_image.py
...
TRT_LOGGER = trt.Logger(trt.Logger.ERROR)
trt_runtime = trt.Runtime(TRT_LOGGER)

print(f"Lade TensorRT Engine {engine_file_path}")
trt_engine = common.load_engine(trt_runtime, engine_file_path)

inputs, outputs, bindings, streams = common.allocate_buffers(trt_engine)
context = trt_engine.create_execution_context()

inputs[0].host = image_processed
print(f"Starte die Objekterkennung auf Bild {input_image_path}")
inference_start_time = time.time()

# Liefet die drei YOLOv3 Ausgaben zurück
trt_outputs = common.do_inference_v2(
    context,
    bindings=bindings,
    inputs=inputs,
    outputs=outputs,
    stream=streams
)
    
print("TensorRT Erkennungszeit: {} ms".format(int(round((time.time() - inference_start_time) * 1000))))

output_shapes = [(1, -1, new_height // 32, new_width // 32),
                 (1, -1, new_height // 16, new_width // 16),
                 (1, -1, new_height //  8, new_width //  8)]

trt_outputs  = [output.reshape(shape) for output, shape in zip(trt_outputs, output_shapes)]
...

Listing 4: Mit OpenCV-Code aus einem einfachen Objekterkennungsprogramm für Bilder ein weiteres für Bewegtbilder implementieren

import cv2
import numpy as np
import argparse
import os
import time
from PIL import Image
import tensorrt as trt
import img_utils
import common
...
	 cap = cv2.VideoCapture(0)

    if not cap.isOpened():
        print("Kann die Webcam, nicht öffnen")
        exit()

    while cap.isOpened():

        status, frame = cap.read()

        if not status:
            print("Kann kein Bild laden")
            exit()

        image_resized = cv2.resize(frame, (new_width, new_height), interpolation = cv2.INTER_AREA)
        image_resized = np.array(image_resized, dtype=np.float32, order='C')
        image_resized /= 255.0
        image_processed = np.transpose(image_resized, [2, 0, 1])
        image_processed = np.expand_dims(image_processed, axis=0)
        image_processed = np.array(image_processed, dtype=np.float32, order='C')

        inputs[0].host = image_processed

        trt_outputs = common.do_inference_v2(
           context,
           bindings=bindings,
           inputs=inputs,
           outputs=outputs,
           stream=streams
        )

        trt_outputs  = [output.reshape(shape) for output, shape in zip(trt_outputs, output_shapes)]
        ...
