  
          logger.info("%s alignment(s) were removed from alignments file", del_count)
          self.alignments.save()
  
          if self.type == "faces":
              rename = Rename(self.alignments, None, self.items)
              rename.process()
  
      def remove_frames(self, frame):
          """ Process to remove frames from an alignments file """
          if frame in self.items:
              logger.trace("Not deleting frame: '%s'", frame)
              return 0
          logger.debug("Deleting frame: '%s'", frame)
          del self.alignments.data[frame]
          return 1
  
      def remove_faces(self):
          """ Process to remove faces from an alignments file """
          face_hashes = self.items.items
          if not face_hashes:
              logger.error("No face hashes. This would remove all faces from your alignments file.")
              return 0
          pre_face_count = self.alignments.faces_count
          self.alignments.filter_hashes(face_hashes, filter_out=False)
          post_face_count = self.alignments.faces_count
          return pre_face_count - post_face_count
  
  
  class Rename():
      """ Rename faces in a folder to match their filename as stored in an alignments file.
  
 
</s> remove     def remove_faces(self):
        """ Process to remove faces from an alignments file """
        face_hashes = list(self.faces.items.keys())
 </s> add     def _remove_faces(self):
        """ Removes faces from the alignments file if a faces folder has been provided and the
        faces do not exist within each alignments file. """
        face_hashes = list(self._faces.items.keys()) </s> remove class Rename():
 </s> add class Rename():  # pylint:disable=too-few-public-methods </s> remove         """ run removal """
        logger.info("[REMOVE ALIGNMENTS DATA]")  # Tidy up cli output
        del_count = 0
        task = getattr(self, "remove_{}".format(self.type))

        if self.type == "frames":
            logger.debug("Removing Frames")
            for frame in tqdm(list(item[3] for item in self.alignments.yield_faces()),
                              desc="Removing Frames",
                              total=self.alignments.frames_count):
                del_count += task(frame)
        else:
            logger.debug("Removing Faces")
            del_count = task()
 </s> add         """ Run the job to remove faces from an alignments file that do not exist within a faces
        folder. """
        logger.info("[REMOVE FACES FROM ALIGNMENTS]")  # Tidy up cli output

        face_hashes = self._items.items
        if not face_hashes:
            logger.error("No matching faces found in your faces folder. This would remove all "
                         "faces from your alignments file. Process aborted.")
            return

        pre_face_count = self._alignments.faces_count
        self._alignments.filter_hashes(face_hashes, filter_out=False)
        del_count = pre_face_count - self._alignments.faces_count </s> remove         self.alignments.save()
 </s> add         self._alignments.save() </s> remove         for alignments in tqdm(self.alignments, desc="Filtering out faces"):
 </s> add         for alignments in tqdm(self._alignments, desc="Filtering out faces"):
        rename = Rename(self._alignments, None, self._items)
        rename.process()
  
          logger.info("%s alignment(s) were removed from alignments file", del_count)
          self.alignments.save()
  
        rename = Rename(self._alignments, None, self._items)
        rename.process()
        rename = Rename(self._alignments, None, self._items)
        rename.process()
        rename = Rename(self._alignments, None, self._items)
        rename.process()
        rename = Rename(self._alignments, None, self._items)
        rename.process()
        rename = Rename(self._alignments, None, self._items)
        rename.process()
        rename = Rename(self._alignments, None, self._items)
        rename.process()
        rename = Rename(self._alignments, None, self._items)
        rename.process()
        rename = Rename(self._alignments, None, self._items)
        rename.process()
        rename = Rename(self._alignments, None, self._items)
        rename.process()
        rename = Rename(self._alignments, None, self._items)
        rename.process()
        rename = Rename(self._alignments, None, self._items)
        rename.process()
        rename = Rename(self._alignments, None, self._items)
        rename.process()
        rename = Rename(self._alignments, None, self._items)
        rename.process()
        rename = Rename(self._alignments, None, self._items)
        rename.process()
        rename = Rename(self._alignments, None, self._items)
        rename.process()
        rename = Rename(self._alignments, None, self._items)
        rename.process()
        rename = Rename(self._alignments, None, self._items)
        rename.process()
        rename = Rename(self._alignments, None, self._items)
        rename.process()
        rename = Rename(self._alignments, None, self._items)
        rename.process()
        rename = Rename(self._alignments, None, self._items)
        rename.process()
        rename = Rename(self._alignments, None, self._items)
        rename.process()
        rename = Rename(self._alignments, None, self._items)
        rename.process()
        rename = Rename(self._alignments, None, self._items)
        rename.process()
  
  
  class Rename():
      """ Rename faces in a folder to match their filename as stored in an alignments file.
  
keep keep keep keep replace replace replace replace replace replace replace replace replace replace replace replace replace replace replace replace replace replace replace replace 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 
tools/alignments/jobs.py