          landmarks = self.spatially_filter()
          landmarks = self.temporally_smooth(landmarks)
          self.update_alignments(landmarks)
          self._alignments.save()
  
          logger.info("Done! To re-extract faces run: python tools.py "
                      "alignments -j extract -a %s -fr <path_to_frames_dir> -fc "
                      "<output_folder>", self.arguments.alignments_file)
  
      # Define shape normalization utility functions
      @staticmethod
      def normalize_shapes(shapes_im_coords):
          """ Normalize a 2D or 3D shape """
 
</s> remove             landmarks = np.array(val[0]["landmarks_xy"]).reshape(68, 2, 1)
 </s> add             landmarks = np.array(val[0]["landmarks_xy"]).reshape((68, 2, 1)) </s> remove         batch_dst_points = np.array([landmarks[choice(hsh)] for hsh in closest_hashes])
 </s> add         batch_dst_points = np.array([landmarks[choice(fname)] for fname in closest_matches]) </s> remove         if self.faces:
            rename = Rename(self._alignments, None, self.faces)
            rename.process()
 </s> add             logger.warning("If you have a face-set corresponding to the alignment file you "
                           "processed then you should run the 'Extract' job to regenerate it.") </s> remove     @staticmethod
    def get_faces(arguments):
        """ If faces argument is specified, load faces_dir otherwise return None """
        if not hasattr(arguments, "faces_dir") or not arguments.faces_dir:
            return None
        faces = Faces(arguments.faces_dir)
        return faces

 </s> add  </s> remove     >>> for filename, hash in read_image_hash_batch(image_filenames):
 </s> add     >>> for filename, meta in read_image_meta_batch(image_filenames):
        logger.warning("If you have a face-set corresponding to the alignment file you "
                       "processed then you should run the 'Extract' job to regenerate it.")
          landmarks = self.spatially_filter()
          landmarks = self.temporally_smooth(landmarks)
          self.update_alignments(landmarks)
          self._alignments.save()
        logger.warning("If you have a face-set corresponding to the alignment file you "
                       "processed then you should run the 'Extract' job to regenerate it.")
        logger.warning("If you have a face-set corresponding to the alignment file you "
                       "processed then you should run the 'Extract' job to regenerate it.")
        logger.warning("If you have a face-set corresponding to the alignment file you "
                       "processed then you should run the 'Extract' job to regenerate it.")
        logger.warning("If you have a face-set corresponding to the alignment file you "
                       "processed then you should run the 'Extract' job to regenerate it.")
  
      # Define shape normalization utility functions
      @staticmethod
      def normalize_shapes(shapes_im_coords):
          """ Normalize a 2D or 3D shape """
keep keep keep keep replace replace replace replace keep keep keep keep keep
 Update extracted faces to use PNG EXIF data (#1123)

Documentation
  - Update Usage.md, align.rst and image.rst
lib.image.py
  - read_image - Remove hash return, add metadata return
  - Remove read_image_hash functions
  - Add read_image_meta functios
  - Replace encode_image_with_hash with encode_image (to store metadata)
  - Add png meta reading and writing functions
  - Update Image Loaders/Savers to handle metadata rather than hashes
lib.training_data
  - Naming updates to remove references to hashes
lib.align.Alignments
  - Add versioning notes
  - Increment alignments version to 2.1
  - Deprecate hashing lookup functions
  - Replace filter_hashes with filter_faces
lib.align.detected_face
  - DetectedFace
    - Remove hash property
    - Add png header data serializing/deserializing functions
  - Mask
    - Add png header data serializing/deserializing functions
  - add update_legacy_png_header function to update png meta data
lib.cli.args - Deprecate alignments files for training
- plugins.train.trainer
  - Update alignments/mask code to read png header data
- scripts.convert
  - Aligned images folder - read data from png headers
- scripts.extract
  - Write png header information and no longer store hash of face
- tools.alignments
  - remove leftover-faces, merge and update-hashes jobs
  - Update jobs to use png meta data rather than hashes
- tools.manual
  - Update extract code to output png meta data and don't store hashes
  - Perform check on launch that tool is not pointing at a faces folder
tools.mask
  - Update to use png meta data
tools.sort
  - Update to use png meta data 
tools/alignments/jobs.py