docs: def iterate(self, max_number_of_files=None):
      """iterate([max_number_of_files]) -> image, bounding_boxes, image_file
  
      Yields the image and the bounding boxes stored in the training set as an iterator.
  
      This function loads the images and converts them to gray-scale.
      It yields the image, the list of bounding boxes and the original image file name.
  
      **Parameters:**
  
      ``max_number_of_files`` : int or ``None``
        If specified, limit the number of returned data by sub-selection using :py:func:`quasi_random_indices`
  
      **Yields:**
  
      ``image`` : array_like(2D)
        The image loaded from file and converted to gray scale
  
      ``bounding_boxes`` : [:py:class:`BoundingBox`]
        A list of bounding boxes, where faces are found in the image; might be empty (in case of pure background images)
  
      `` image_file`` : str
        The name of the original image that was read
      """
      indices = quasi_random_indices(len(self), max_number_of_files)
      for index in indices:
        image = bob.io.base.load(self.image_paths[index])
        if len(image.shape) == 3:
          image = bob.ip.color.rgb_to_gray(image)
        # return image and bounding box as iterator
        yield image, self.bounding_boxes[index], self.image_paths[index]