  
      def get_multi_faces_faces(self):
          """ Return Faces when there are multiple faces in a frame """
          self.output_message = "Multiple faces in frame"
          seen_hash_dupes = set()
          for item in tqdm(self.items, desc=self.output_message):
              filename = item["face_fullname"]
              f_hash = item["face_hash"]
              frame_idx = list(self._alignments.hashes_to_frame[f_hash].items())
  
              if len(frame_idx) > 1:
                  # If the same hash exists in multiple frames, select arbitrary frame
                  # and add to seen_hash_dupes so it is not selected again
                  logger.trace("Dupe hashes: %s", frame_idx)
                  frame_idx = [f_i for f_i in frame_idx if f_i not in seen_hash_dupes][0]
                  seen_hash_dupes.add(frame_idx)
                  frame_idx = [frame_idx]
  
              frame_name, idx = frame_idx[0]
              if not self._alignments.frame_has_multiple_faces(frame_name):
                  continue
              retval = (filename, idx)
              logger.trace("Returning: '%s'", retval)
              yield retval
  
 
</s> remove     def get_multi_faces_faces(self):
 </s> add     def _get_multi_faces_faces(self): </s> remove             retval = (filename, idx)
 </s> add             retval = (item["current_filename"], item["face_index"]) </s> remove         for item in tqdm(self.items, desc=self.output_message):
 </s> add         for item in tqdm(self._items, desc=self.output_message): </s> remove     def get_missing_alignments(self):
 </s> add     def _get_missing_alignments(self): </s> remove     def get_multi_faces_frames(self):
 </s> add     def _get_multi_faces_frames(self):
        for item in tqdm(self._items, desc=self.output_message):
            if not self._alignments.frame_has_multiple_faces(item["source_filename"]):
  
      def get_multi_faces_faces(self):
          """ Return Faces when there are multiple faces in a frame """
          self.output_message = "Multiple faces in frame"
        for item in tqdm(self._items, desc=self.output_message):
            if not self._alignments.frame_has_multiple_faces(item["source_filename"]):
        for item in tqdm(self._items, desc=self.output_message):
            if not self._alignments.frame_has_multiple_faces(item["source_filename"]):
        for item in tqdm(self._items, desc=self.output_message):
            if not self._alignments.frame_has_multiple_faces(item["source_filename"]):
        for item in tqdm(self._items, desc=self.output_message):
            if not self._alignments.frame_has_multiple_faces(item["source_filename"]):
        for item in tqdm(self._items, desc=self.output_message):
            if not self._alignments.frame_has_multiple_faces(item["source_filename"]):
        for item in tqdm(self._items, desc=self.output_message):
            if not self._alignments.frame_has_multiple_faces(item["source_filename"]):
        for item in tqdm(self._items, desc=self.output_message):
            if not self._alignments.frame_has_multiple_faces(item["source_filename"]):
        for item in tqdm(self._items, desc=self.output_message):
            if not self._alignments.frame_has_multiple_faces(item["source_filename"]):
        for item in tqdm(self._items, desc=self.output_message):
            if not self._alignments.frame_has_multiple_faces(item["source_filename"]):
        for item in tqdm(self._items, desc=self.output_message):
            if not self._alignments.frame_has_multiple_faces(item["source_filename"]):
        for item in tqdm(self._items, desc=self.output_message):
            if not self._alignments.frame_has_multiple_faces(item["source_filename"]):
        for item in tqdm(self._items, desc=self.output_message):
            if not self._alignments.frame_has_multiple_faces(item["source_filename"]):
        for item in tqdm(self._items, desc=self.output_message):
            if not self._alignments.frame_has_multiple_faces(item["source_filename"]):
        for item in tqdm(self._items, desc=self.output_message):
            if not self._alignments.frame_has_multiple_faces(item["source_filename"]):
        for item in tqdm(self._items, desc=self.output_message):
            if not self._alignments.frame_has_multiple_faces(item["source_filename"]):
        for item in tqdm(self._items, desc=self.output_message):
            if not self._alignments.frame_has_multiple_faces(item["source_filename"]):
                  continue
              retval = (filename, idx)
              logger.trace("Returning: '%s'", retval)
              yield retval
  
keep keep keep keep replace replace replace replace replace replace replace replace replace replace replace replace 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