code: def predict_dataflow(df, model_func, tqdm_bar=None):
      
      df.reset_state()
      all_results = []
      with ExitStack() as stack:
          # tqdm is not quite thread-safe: https://github.com/tqdm/tqdm/issues/323
          if tqdm_bar is None:
              tqdm_bar = stack.enter_context(get_tqdm(total=df.size()))
          for img, img_id in df:
              results = predict_image(img, model_func)
              for r in results:
                  # int()/float() to make it json-serializable
                  res = {
                      'image_id': img_id,
                      'category_id': int(r.class_id),
                      'bbox': [round(float(x), 4) for x in r.box],
                      'score': round(float(r.score), 4),
                  }
  
                  # also append segmentation to results
                  if r.mask is not None:
                      rle = cocomask.encode(
                          np.array(r.mask[:, :, None], order='F'))[0]
                      rle['counts'] = rle['counts'].decode('ascii')
                      res['segmentation'] = rle
                  all_results.append(res)
              tqdm_bar.update(1)
      return all_results
docs: Args:
          df: a DataFlow which produces (image, image_id)
          model_func: a callable from the TF model.
              It takes image and returns (boxes, probs, labels, [masks])
          tqdm_bar: a tqdm object to be shared among multiple evaluation instances. If None,
              will create a new one.
  
      Returns:
          list of dict, in the format used by
          `DetectionDataset.eval_or_save_inference_results`