class_docstr: OpenImagesReader supports reading the images directly from the original
  data source which is hosted in Google Cloud Storage.
  
  Before using it you have to request and configure access following the
  instructions here: https://github.com/cvdfoundation/open-images-dataset
docstr: Daemon thread that will complete queued records from `input_queue` and
  put them in `output_queue`, where they will be read and yielded by the
  main thread.
  
  This is the thread that will actually download the images of the
  dataset.
docstr_tok: ["Daemon","thread","that","will","complete","queued","records","from","`","input_queue","`","and","put","them","in","`","output_queue","`",",","where","they","will","be","read","and","yielded","by","the","main","thread",".","This","is","the","thread","that","will","actually","download","the","images","of","the","dataset","."]
code: def _complete_records(self, input_queue, output_queue):
      """
      Daemon thread that will complete queued records from `input_queue` and
      put them in `output_queue`, where they will be read and yielded by the
      main thread.
  
      This is the thread that will actually download the images of the
      dataset.
      """
      while True:
          try:
              partial_record = input_queue.get()
  
              image_id = partial_record["filename"]
              image_raw = read_image(self._get_image_path(image_id))
              image = Image.open(six.BytesIO(image_raw))
  
              for gt_box in partial_record["gt_boxes"]:
                  gt_box["xmin"] *= image.width
                  gt_box["ymin"] *= image.height
                  gt_box["xmax"] *= image.width
                  gt_box["ymax"] *= image.height
  
              partial_record["width"] = image.width
              partial_record["height"] = image.height
              partial_record["depth"] = 3 if image.mode == "RGB" else 1
              partial_record["image_raw"] = image_raw
  
              output_queue.put(partial_record)
          except Exception as e:
              tf.logging.error(
                  "Error processing record: {}".format(partial_record)
              )
              tf.logging.error(e)
              self.errors += 1
          finally:
              input_queue.task_done()
  
imports: import csv
  import os
  import signal
  import six
  import sys
  import tensorflow
  import threading
  from six.moves import queue
  from PIL import Image
  from luminoth.tools.dataset.readers import InvalidDataDirectory
  from luminoth.tools.dataset.readers.object_detection import ObjectDetectionReader
  from luminoth.utils.dataset import read_image
label_desc: Use image node_id 11 for calling the OpenImagesReader obj's underlying member method code with example usage: obj._complete_records(input_queue, output_queue) without return types