          for side, fullpath in self._alignments_paths.items():
              logger.debug("side: '%s', path: '%s'", side, fullpath)
              path, filename = os.path.split(fullpath)
              alignments = Alignments(path, filename=filename)
              retval[side] = self._to_detected_faces(alignments, side)
          logger.debug("Returning: %s", {k: len(v) for k, v in retval.items()})
          return retval
  
      def _to_detected_faces(self, alignments, side):
          """ Convert alignments to DetectedFace objects.
  
          Filter the detected faces to only those that exist in the training folders.
 
</s> remove         retval = dict()
 </s> add  </s> remove         Returns
        -------
        dict
            For keys "a" and "b" values are a dict with the key being the sha1 hash of the face
            and the value being the corresponding :class:`lib.faces_detect.DetectedFace` object.
 </s> add         Assign the alignments file version to :attr:`_alignments_version` and the converted
        detected faces to :attr:`_detected_faces` for each side </s> remove         logger.debug({key: {k: len(v) for k, v in val.items()} for key, val in retval.items()})
 </s> add         logger.debug({key: {k: v if isinstance(v, float) else len(v)
                            for k, v in val.items()}
                      for key, val in retval.items()}) </s> remove         alignments: :class:`lib.alignments.Alignments`
 </s> add         alignments: :class:`lib.align.Alignments` </s> remove         retval = {side: self._transform_landmarks(side, detected_faces)
                  for side, detected_faces in self._detected_faces.items()}
        logger.trace(retval)
 </s> add         retval = dict()
        for side, detected_faces in self._detected_faces.items():
            centering = "legacy" if self._alignments_version[side] == 1.0 else "head"
            logger.debug("side: %s, centering: %s", side, centering)
            ret_side = dict()
            for fhash, face in detected_faces.items():
                face.load_aligned(None, size=self._training_size, centering=centering)
                for filename in self._hash_to_filenames(side, fhash):
                    ret_side[filename] = face.aligned
            retval[side] = ret_side
            self._detected_faces[side] = self._to_detected_faces(alignments, side)
            self._alignments_version[side] = alignments.version
        logger.debug("alignments_versions: %s, detected_faces: %s, ", self._alignments_version,
                     {k: len(v) for k, v in self._detected_faces.items()})
          for side, fullpath in self._alignments_paths.items():
              logger.debug("side: '%s', path: '%s'", side, fullpath)
              path, filename = os.path.split(fullpath)
              alignments = Alignments(path, filename=filename)
            self._detected_faces[side] = self._to_detected_faces(alignments, side)
            self._alignments_version[side] = alignments.version
        logger.debug("alignments_versions: %s, detected_faces: %s, ", self._alignments_version,
                     {k: len(v) for k, v in self._detected_faces.items()})
            self._detected_faces[side] = self._to_detected_faces(alignments, side)
            self._alignments_version[side] = alignments.version
        logger.debug("alignments_versions: %s, detected_faces: %s, ", self._alignments_version,
                     {k: len(v) for k, v in self._detected_faces.items()})
            self._detected_faces[side] = self._to_detected_faces(alignments, side)
            self._alignments_version[side] = alignments.version
        logger.debug("alignments_versions: %s, detected_faces: %s, ", self._alignments_version,
                     {k: len(v) for k, v in self._detected_faces.items()})
  
      def _to_detected_faces(self, alignments, side):
          """ Convert alignments to DetectedFace objects.
  
          Filter the detected faces to only those that exist in the training folders.
keep keep keep keep replace replace replace keep keep keep keep keep
 Extract - Increase area and move centering (#1095)

* Extract
  - Implement aligner re-feeding
  - Add extract type to pipeline.ExtractMedia
  - Add pose annotation to debug
* Convert
  - implement centering
  - remove usage of feed and reference face properties
  - Remove distributed option from convert
  - Force update of alignments file on legacy receive
* Train
  - Resize preview image to model output size
  - Force legacy centering if centering does not exist in model's state file
  - Enable training on legacy face sets

* Alignments Tool
  - Update draw to include head/pose
  - Remove DFL drop + linting
  - Remove remove-frames job
  - remove align-eyes option
  - Update legacy masks to new extract type
  - Exit if attempting to merge version 1.0 alignments files with version 2.0 alignments files
  - Re-generate thumbnails on legacy upgrade
* Mask Tool
  - Update for new extract + bugfix full frame
* Manual Tool
  - Update to new extraction method
   - Disable legacy alignments,
   - extract box bugfix
   - extract faces - size to 512 and center on head
* Preview Tool
  - Display based on model centering
* Sort Tool
  - Use alignments for sort by face

* lib.aligner
  - Add Pose Class
  - Add AlignedFace Class
  - center _MEAN_FACE on x
  - Add meta information with versioning to alignments file
  - lib.aligner.get_align_matrix to use landmarks not face
  - Refactor aligned faces in lib.faces_detect
* lib.logger
  - larger file log padding
* lib.config
  - Fix global changeable_items
* lib.face_filter
  - Use new extracted face images
* lib.image
  - bump thumbnail default size to 96px 
plugins/train/trainer/_base.py