Exemple #1
0
    def sort_face_cnn(self):
        """ Sort by CNN similarity """
        self.launch_aligner()
        input_dir = self.args.input_dir

        logger.info("Sorting by face-cnn similarity...")
        img_list = []
        for img in tqdm(self.find_images(input_dir),
                        desc="Loading",
                        file=sys.stdout):
            landmarks = self.get_landmarks(img)
            img_list.append([img, np.array(landmarks)
                             if landmarks
                             else np.zeros((68, 2))])

        queue_manager.terminate_queues()
        img_list_len = len(img_list)
        for i in tqdm(range(0, img_list_len - 1),
                      desc="Sorting",
                      file=sys.stdout):
            min_score = float("inf")
            j_min_score = i + 1
            for j in range(i + 1, len(img_list)):
                fl1 = img_list[i][1]
                fl2 = img_list[j][1]
                score = np.sum(np.absolute((fl2 - fl1).flatten()))

                if score < min_score:
                    min_score = score
                    j_min_score = j
            (img_list[i + 1],
             img_list[j_min_score]) = (img_list[j_min_score],
                                       img_list[i + 1])
        return img_list
Exemple #2
0
def safe_shutdown():
    """ Close queues, threads and processes in event of crash """
    logger.debug("Safely shutting down")
    from lib.queue_manager import queue_manager
    from lib.multithreading import terminate_processes
    queue_manager.terminate_queues()
    terminate_processes()
    logger.debug("Cleanup complete. Shutting down queue manager and exiting")
    queue_manager._log_queue.put(None)  # pylint: disable=protected-access
    while not queue_manager._log_queue.empty():  # pylint: disable=protected-access
        continue
    queue_manager.manager.shutdown()
Exemple #3
0
    def process(self):
        """ Process the conversion """
        logger.debug("Starting Conversion")
        # queue_manager.debug_monitor(2)
        self.convert_images()
        self.disk_io.save_thread.join()
        queue_manager.terminate_queues()

        Utils.finalize(self.images.images_found,
                       self.predictor.faces_count,
                       self.predictor.verify_output)
        logger.debug("Completed Conversion")
Exemple #4
0
    def display_frames(self):
        """ Iterate through frames """
        # pylint: disable=no-member
        logger.debug("Display frames")
        is_windows = platform.system() == "Windows"
        is_conda = "conda" in sys.version.lower()
        logger.debug("is_windows: %s, is_conda: %s", is_windows, is_conda)
        cv2.namedWindow("Frame")
        cv2.namedWindow("Faces")
        cv2.setMouseCallback('Frame', self.mouse_handler.on_event)

        frame, faces = self.get_frame()
        press = self.get_keys()

        while True:
            self.help.render()
            cv2.imshow("Frame", frame)
            cv2.imshow("Faces", faces)
            key = cv2.waitKey(1)

            if self.window_closed(is_windows, is_conda, key):
                queue_manager.terminate_queues()
                break

            if key:
                logger.trace("Keypress received: '%s'", key)
            if key in press.keys():
                action = press[key]["action"]
                logger.debug("Keypress action: key: ('%s', action: '%s')", key, action)
                if action == "quit":
                    break

                if press[key].get("key_type") == range:
                    args = press[key]["args"] + [chr(key)]
                else:
                    args = press[key]["args"]
                action(*args)

            if not self.interface.redraw():
                continue

            logger.trace("Redraw requested")
            frame, faces = self.get_frame()
            self.interface.set_redraw(False)

        cv2.destroyAllWindows()
Exemple #5
0
    def process_item_count(self):
        """ Return the number of items to be processedd """
        processed = sum(os.path.basename(frame) in self.alignments.data.keys()
                        for frame in self.images.input_images)
        logger.debug("Items already processed: %s", processed)

        if processed != 0 and self.args.skip_existing:
            logger.info("Skipping previously extracted frames: %s", processed)
        if processed != 0 and self.args.skip_faces:
            logger.info("Skipping frames with detected faces: %s", processed)

        to_process = (self.images.images_found - processed) // self.skip_num
        logger.debug("Items to be Processed: %s", to_process)
        if to_process == 0:
            logger.error("No frames to process. Exiting")
            queue_manager.terminate_queues()
            exit(0)
        return to_process
Exemple #6
0
    def detect_faces(self, extract_pass="******"):
        """ Detect faces from in an image """
        if self.is_parallel or extract_pass == "align":
            out_queue = queue_manager.get_queue("align")
        if not self.is_parallel and extract_pass == "detect":
            out_queue = queue_manager.get_queue("detect")

        while True:
            try:
                faces = out_queue.get(True, 1)
                if faces == "EOF":
                    break
                exception = faces.get("exception", None)
                if exception is not None:
                    queue_manager.terminate_queues()
                    yield faces
                    break
            except QueueEmpty:
                continue

            yield faces
Exemple #7
0
    def display_frames(self):
        """ Iterate through frames """
        # pylint: disable=no-member
        is_windows = True if platform.system() == "Windows" else False
        is_conda = True if "conda" in sys.version.lower() else False
        cv2.namedWindow("Frame")
        cv2.namedWindow("Faces")
        cv2.setMouseCallback('Frame', self.mouse_handler.on_event)

        frame, faces = self.get_frame()
        press = self.get_keys()

        while True:
            self.help.render()
            cv2.imshow("Frame", frame)
            cv2.imshow("Faces", faces)
            key = cv2.waitKey(1)

            if self.window_closed(is_windows, is_conda, key):
                queue_manager.terminate_queues()
                break

            if key in press.keys():
                action = press[key]["action"]
                if action == "quit":
                    break

                if press[key].get("key_type") == range:
                    args = press[key]["args"] + [chr(key)]
                else:
                    args = press[key]["args"]
                action(*args)

            if not self.interface.redraw():
                continue

            frame, faces = self.get_frame()
            self.interface.set_redraw(False)

        cv2.destroyAllWindows()
Exemple #8
0
    def process(self):
        """ Process the conversion """
        logger.debug("Starting Conversion")
        # queue_manager.debug_monitor(5)
        try:
            self.convert_images()
            self.disk_io.save_thread.join()
            queue_manager.terminate_queues()

            Utils.finalize(self.images.images_found,
                           self.predictor.faces_count,
                           self.predictor.verify_output)
            logger.debug("Completed Conversion")
        except MemoryError as err:
            msg = (
                "Faceswap ran out of RAM running convert. Conversion is very system RAM "
                "heavy, so this can happen in certain circumstances when you have a lot of "
                "cpus but not enough RAM to support them all."
                "\nYou should lower the number of processes in use by either setting the "
                "'singleprocess' flag (-sp) or lowering the number of parallel jobs (-j)."
            )
            raise FaceswapError(msg) from err
Exemple #9
0
    def process(self):
        """ Original & LowMem models go with Adjust or Masked converter

            Note: GAN prediction outputs a mask + an image, while other
            predicts only an image. """
        Utils.set_verbosity(self.args.loglevel)

        if not self.alignments.have_alignments_file:
            self.load_extractor()

        model = self.load_model()
        converter = self.load_converter(model)

        batch = BackgroundGenerator(self.prepare_images(), 1)

        for item in batch.iterator():
            self.convert(converter, item)

        if self.extract_faces:
            queue_manager.terminate_queues()

        Utils.finalize(self.images.images_found, self.faces_count,
                       self.verify_output)
Exemple #10
0
    def process(self):
        """ The entry point for triggering the Conversion Process.

        Should only be called from  :class:`lib.cli.launcher.ScriptExecutor`
        """
        logger.debug("Starting Conversion")
        # queue_manager.debug_monitor(5)
        try:
            self._convert_images()
            self._disk_io.save_thread.join()
            queue_manager.terminate_queues()

            finalize(self._images.count,
                     self._predictor.faces_count,
                     self._predictor.verify_output)
            logger.debug("Completed Conversion")
        except MemoryError as err:
            msg = ("Faceswap ran out of RAM running convert. Conversion is very system RAM "
                   "heavy, so this can happen in certain circumstances when you have a lot of "
                   "cpus but not enough RAM to support them all."
                   "\nYou should lower the number of processes in use by either setting the "
                   "'singleprocess' flag (-sp) or lowering the number of parallel jobs (-j).")
            raise FaceswapError(msg) from err
Exemple #11
0
    def display_frames(self):
        """ Iterate through frames """
        # pylint: disable=no-member
        logger.debug("Display frames")
        is_windows = platform.system() == "Windows"
        is_conda = "conda" in sys.version.lower()
        logger.debug("is_windows: %s, is_conda: %s", is_windows, is_conda)
        cv2.namedWindow("Frame")
        cv2.setMouseCallback('Frame', self.mouse_handler.on_event)

        frame = self.get_frame()
        press = self.get_keys()
        self.interface.set_redraw(True)

        while True:
            if self.interface.redraw():
                self.help.render()
                cv2.imshow("Frame", frame)

                hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

                # define range of red color in HSV
                lower_red = np.array([30, 150, 50])
                upper_red = np.array([255, 255, 180])

                # create a red HSV colour boundary and
                # threshold HSV image
                mask = cv2.inRange(hsv, lower_red, upper_red)

                # Bitwise-AND mask and original image
                res = cv2.bitwise_and(frame, frame, mask=mask)

                # finds edges in the input image image and
                # marks them in the output map edges
                edges = cv2.Canny(frame, 100, 200)

                # Display edges in a frame
                cv2.imshow('Edges', edges)

                self.interface.set_redraw(False)
            key = cv2.waitKey(1000)

            if self.window_closed(is_windows, is_conda, key):
                queue_manager.terminate_queues()
                break

            if key and key != -1:
                logger.trace("Keypress received: '%s'", key)
            if key in press.keys():
                action = press[key]["action"]
                logger.debug("Keypress action: key: ('%s', action: '%s')", key,
                             action)
                if action == "quit":
                    break

                if press[key].get("key_type") == range:
                    args = press[key]["args"] + [chr(key)]
                else:
                    args = press[key]["args"]
                action(*args)

            if not self.interface.redraw():
                continue

            logger.trace("Redraw requested")
            frame = self.get_frame()

        cv2.destroyAllWindows()