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]