  
  
  class ImageManipulation():
      """ Manipulations to be performed on training images """
      def __init__(self, input_size, output_size, coverage_ratio, config):
          """ input_size: Size of the face input into the model
              output_size: Size of the face that comes out of the modell
              coverage_ratio: Coverage ratio of full image. Eg: 256 * 0.625 = 160
          """
          logger.debug("Initializing %s: (input_size: %s, output_size: %s, coverage_ratio: %s, "
 
</s> remove             output_size: Size of the face that comes out of the modell
 </s> add             output_shapes: Shapes that come out of the model </s> remove         logger.debug("Initializing %s: (input_size: %s, output_size: %s, coverage_ratio: %s, "
                     "config: %s)", self.__class__.__name__, input_size, output_size,
 </s> add         logger.debug("Initializing %s: (input_size: %s, output_shapes: %s, coverage_ratio: %s, "
                     "config: %s)", self.__class__.__name__, input_size, output_shapes, </s> remove     def __init__(self, model_input_size, model_output_size, training_opts, config):
        logger.debug("Initializing %s: (model_input_size: %s, model_output_shape: %s, "
 </s> add     def __init__(self, model_input_size, model_output_shapes, training_opts, config):
        logger.debug("Initializing %s: (model_input_size: %s, model_output_shapes: %s, " </s> remove         return tuple(out[0])
 </s> add         return [tuple(shape) for shape in out]

    @property
    def output_shape(self):
        """ The output shape of the model (shape of largest face output) """
        return self.output_shapes[self.largest_face_index]

    @property
    def largest_face_index(self):
        """ Return the index from model.outputs of the largest face
            Required for multi-output model prediction. The largest face
            is assumed to be the final output
        """
        sizes = [shape[1] for shape in self.output_shapes if shape[2] == 3]
        if not sizes:
            return None
        max_face = max(sizes)
        retval = [idx for idx, shape in enumerate(self.output_shapes)
                  if shape[1] == max_face and shape[2] == 3][0]
        logger.debug(retval)
        return retval

    @property
    def largest_mask_index(self):
        """ Return the index from model.outputs of the largest mask
            Required for multi-output model prediction. The largest face
            is assumed to be the final output
        """
        sizes = [shape[1] for shape in self.output_shapes if shape[2] == 1]
        if not sizes:
            return None
        max_mask = max(sizes)
        retval = [idx for idx, shape in enumerate(self.output_shapes)
                  if shape[1] == max_mask and shape[2] == 1][0]
        logger.debug(retval)
        return retval </s> remove         self.output_size = output_size
 </s> add         self.output_sizes = [shape[1] for shape in output_shapes if shape[2] == 3]
        logger.debug("Output sizes: %s", self.output_sizes)
    def __init__(self, input_size, output_shapes, coverage_ratio, config):
  
  
  class ImageManipulation():
      """ Manipulations to be performed on training images """
    def __init__(self, input_size, output_shapes, coverage_ratio, config):
          """ input_size: Size of the face input into the model
              output_size: Size of the face that comes out of the modell
              coverage_ratio: Coverage ratio of full image. Eg: 256 * 0.625 = 160
          """
          logger.debug("Initializing %s: (input_size: %s, output_size: %s, coverage_ratio: %s, "
keep keep keep keep replace keep keep keep keep keep
 Training: Add Multi-Output Support

- Name output nodes of models
- Add support for multiple outputs in models and in training
- Update loss output format for cli and gui
- Sort graphs tabs on training
- Fix analysis graph for new loss names
- Multi output support in convert 
lib/training_data.py