def save_face_with_hash(filename, extension, face): """ Save a face and return it's hash """ f_hash, img = encode_image_with_hash(face, extension) logger.trace("Saving face: '%s'", filename) with open(filename, "wb") as out_file: out_file.write(img) return f_hash
def _output_faces(self, saver, extract_media): """ Output faces to save thread Set the face filename based on the frame name and put the face to the :class:`~lib.image.ImagesSaver` save queue and add the face information to the alignments data. Parameters ---------- saver: lib.images.ImagesSaver The background saver for saving the image extract_media: :class:`~plugins.extract.pipeline.ExtractMedia` The output from :class:`~plugins.extract.Pipeline.Extractor` """ logger.trace("Outputting faces for %s", extract_media.filename) final_faces = list() filename, extension = os.path.splitext( os.path.basename(extract_media.filename)) for idx, face in enumerate(extract_media.detected_faces): output_filename = "{}_{}{}".format(filename, str(idx), extension) face.hash, image = encode_image_with_hash(face.aligned_face, extension) saver.save(output_filename, image) final_faces.append(face.to_alignment()) self._alignments.data[os.path.basename( extract_media.filename)] = dict(faces=final_faces) del extract_media
def _output_faces(self, saver, faces): """ Output faces to save thread Set the face filename based on the frame name and put the face to the :class:`lib.image.ImagesSaver` save queue and add the face information to the alignments data. Parameters ---------- saver: lib.images.ImagesSaver The background saver for saving the image faces: dict The output dictionary from :class:`plugins.extract.Pipeline.Extractor` """ logger.debug("Save Faces: Start") final_faces = list() filename, extension = os.path.splitext( os.path.basename(faces["filename"])) for idx, face in enumerate(faces["detected_faces"]): output_filename = "{}_{}{}".format(filename, str(idx), extension) face.hash, image = encode_image_with_hash(face.aligned_face, extension) saver.save(output_filename, image) final_faces.append(face.to_alignment()) self._alignments.data[os.path.basename( faces["filename"])] = final_faces
def _background_extract(self, output_folder, progress_queue): """ Perform the background extraction in a thread so GUI doesn't become unresponsive. Parameters ---------- output_folder: str The location to save the output faces to progress_queue: :class:`queue.Queue` The queue to place incremental counts to for updating the GUI's progress bar """ saver = ImagesSaver(str(get_folder(output_folder)), as_bytes=True) loader = ImagesLoader(self._input_location, count=self._alignments.frames_count) for frame_idx, (filename, image) in enumerate(loader.load()): logger.trace("Outputting frame: %s: %s", frame_idx, filename) basename = os.path.basename(filename) frame_name, extension = os.path.splitext(basename) final_faces = [] progress_queue.put(1) for face_idx, face in enumerate(self._frame_faces[frame_idx]): output = "{}_{}{}".format(frame_name, str(face_idx), extension) aligned = AlignedFace(face.landmarks_xy, image=image, centering="head", size=512) # TODO user selectable size face.hash, b_image = encode_image_with_hash( aligned.face, extension) saver.save(output, b_image) final_faces.append(face.to_alignment()) self._alignments.data[basename]["faces"] = final_faces saver.close()
def output_faces(self, filename, faces): """ Output faces to save thread """ final_faces = list() for idx, detected_face in enumerate(faces["detected_faces"]): output_file = detected_face["file_location"] extension = Path(filename).suffix out_filename = "{}_{}{}".format(str(output_file), str(idx), extension) face = detected_face["face"] resized_face = face.aligned_face face.hash, img = encode_image_with_hash(resized_face, extension) self.save_queue.put((out_filename, img)) final_faces.append(face.to_alignment()) self.alignments.data[os.path.basename(filename)] = final_faces