          The 68 point landmarks as discovered in :mod:`plugins.extract.align`.
      mask: dict
          The generated mask(s) for the face as generated in :mod:`plugins.extract.mask`. Is a
          dict of {**name** (`str`): :class:`Mask`}.
      hash: str
          The hash of the face. This cannot be set until the file is saved due to image compression,
          but will be set if loading data from :func:`from_alignment`
      """
      def __init__(self, image=None, x=None, w=None, y=None, h=None, landmarks_xy=None, mask=None,
                   filename=None):
          logger.trace("Initializing %s: (image: %s, x: %s, w: %s, y: %s, h:%s, landmarks_xy: %s, "
                       "mask: %s, filename: %s)",
 
</s> remove             The face filenames as keys with the zip compressed mask as value.
 </s> add             The face filenames as keys with the :func:`functools.partial` of the mask as value </s> remove def read_image_hash(filename, output_shape=False):
    """ Return the `sha1` hash of an image saved on disk.
 </s> add def read_image_meta(filename):
    """ Read the Faceswap metadata stored in an extracted face's exif header. </s> remove         hashset = set(hash_list)
        for filename, val in self._data.items():
            for idx, face in reversed(list(enumerate(val["faces"]))):
                if ((filter_out and face.get("hash", None) in hashset) or
                        (not filter_out and face.get("hash", None) not in hashset)):
                    logger.verbose("Filtering out face: (filename: %s, index: %s)", filename, idx)
                    del val["faces"][idx]
                else:
                    logger.trace("Not filtering out face: (filename: %s, index: %s)",
                                 filename, idx)
 </s> add         logger.debug("filter_dict: %s, filter_out: %s", filter_dict, filter_out)
        for source_frame, frame_data in self._data.items():
            face_indices = filter_dict.get(source_frame, [])
            if filter_out:
                filter_list = face_indices
            else:
                filter_list = [idx for idx in range(len(frame_data["faces"]))
                               if idx not in face_indices]
            logger.trace("frame: '%s', filter_list: %s", source_frame, filter_list)

            for face_idx in reversed(sorted(filter_list)):
                logger.verbose("Filtering out face: (filename: %s, index: %s)",
                               source_frame, face_idx)
                del frame_data["faces"][face_idx] </s> remove         sha1_hash: str
            The sha1 hash of the loaded image.
 </s> add         metadata: dict
            The Faceswap metadata associated with the loaded image. </s> remove         self._faces = faces if faces else Faces(arguments.faces_dir)
 </s> add         kwargs = dict()
        if alignments.version < 2.1:
            # Update headers of faces generated with hash based alignments
            kwargs["alignments"] = alignments
        self._faces = faces if faces else Faces(arguments.faces_dir, **kwargs)
          The 68 point landmarks as discovered in :mod:`plugins.extract.align`.
      mask: dict
          The generated mask(s) for the face as generated in :mod:`plugins.extract.mask`. Is a
          dict of {**name** (`str`): :class:`Mask`}.



      """
      def __init__(self, image=None, x=None, w=None, y=None, h=None, landmarks_xy=None, mask=None,
                   filename=None):
          logger.trace("Initializing %s: (image: %s, x: %s, w: %s, y: %s, h:%s, landmarks_xy: %s, "
                       "mask: %s, filename: %s)",
keep keep keep keep 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 
lib/align/detected_face.py