3.3.3. Python代码解析

3.3.3.1. Case 0: 使用 opencv 解码和数据预处理

在该示例中,我们封装了一个函数,完成目标检测的任务,如下:

def inference(bmodel_path, input_path, loops, tpu_id, compare_path):
  """ Load a bmodel and do inference.
  Args:
    bmodel_path: Path to bmodel
    input_path: Path to input file
    loops: Number of loops to run
    tpu_id: ID of TPU to use
    compare_path: Path to correct result file

  Returns:
    True for success and False for failure
  """

在该函数中,我们通过循环处理视频的连续帧来模拟真实的目标检测业务。 在本示例程序中,我们使用 opencv 进行视频解码和预处理。

# pipeline of inference
for i in range(loops):
  # read an image from a image file or a video file
  ret, img0 = cap.read()
  if not ret:
    break
  h, w, _ = img0.shape
  # preprocess
  data = preprocessor.process(img0)
  # inference
  input_tensors = {input_name: np.array([data], dtype=np.float32)}
  output = engine.process(graph_name, input_tensors)
  # postprocess
  dets = postprocessor.process(output[output_name], w, h)
  # print result
  # ...

3.3.3.2. Case 1: 使用 bm-ffmpeg 解码、使用 bmcv 做预处理

在该示例程序中,我们使用 bm-ffmpeg 做解码,bmcv 库做预处理。 我们已经在 SAIL 封装了 bm-ffmpeg 与 bmcv 的 API,因此用户无需关注其底层实现。

# init decoder
decoder = sail.Decoder(input_path, True, tpu_id)
# pipeline of inference
for i in range(loops):
  # read an image from a image file or a video file
  img0 = decoder.read(handle)
  # do somethig ...

3.3.3.3. Case 2: case 1 的 4N 模式

case 2 的流程与 case 1 几乎一致,但其 bmodel 的 batch 维度是 4。 因此,需要 4 张图像或者 4 帧视频一起处理。

当 bmodel 的 batch 为 4 的倍数时,可以发挥出 TPU 上 int8 算力的最大性能。