                  cv2.imwrite(filename, image)
          except Exception as err:
              print("Failed to convert image: {}. "
                    "Reason: {}".format(filename, err))
  
      def convert_one_face(self, converter, imagevars):
          """ Perform the conversion on the given frame for a single face """
          filename, image, idx, face = imagevars
  
 
</s> remove                 Utils.cv2_read_write('write', filename, image)
 </s> add                 cv2.imwrite(filename, image) </s> remove             if skip != "discard":
 </s> add  </s> remove             final_faces = [self.process_single_face(idx,
                                                    face,
                                                    filename,
                                                    image)
                           for idx, face in process_faces]
 </s> add     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) </s> remove             retval = filename, final_faces
        except Exception as err:
            if self.args.verbose:
                print("Failed to extract from image: "
                      "{}. Reason: {}".format(filename, err))
            raise
        return retval
 </s> add         if processed != 0 and self.args.skip_existing:
            print("Skipping {} previously extracted frames".format(processed))
        if processed != 0 and self.args.skip_faces:
            print("Skipping {} frames with detected faces".format(processed))

        to_process = self.images.images_found - processed
        if to_process == 0:
            print("No frames to process. Exiting")
            queue_manager.terminate_queues()
            exit(0)
        return to_process

    def run_detection(self, to_process):
        """ Run detection only """
        self.plugins.launch_detector()
        detected_faces = dict()
        for detected in tqdm(self.plugins.detect_faces(extract_pass="detect"),
                             total=to_process,
                             file=sys.stdout,
                             desc="Detecting faces"):
            exception = detected.get("exception", False)
            if exception:
                break

            del detected["image"]
            filename = detected["filename"]

            detected_faces[filename] = detected </s> remove     def process_single_face(self, idx, face, filename, image):
 </s> add         self.threaded_io("reload", detected_faces)

    def process_faces(self, filename, faces):
            raise
                  cv2.imwrite(filename, image)
          except Exception as err:
              print("Failed to convert image: {}. "
                    "Reason: {}".format(filename, err))
            raise
  
      def convert_one_face(self, converter, imagevars):
          """ Perform the conversion on the given frame for a single face """
          filename, image, idx, face = imagevars
  
keep keep keep add keep keep keep keep keep
 Extraction - Speed improvements (#522) (#523)

* Extraction - Speed improvements (#522)

* Initial Plugin restructure

* Detectors to plugins. Detector speed improvements

* Re-implement dlib aligner, remove models, FAN to TF. Parallel processing

* Update manual, update convert, implement parallel/serial switching

* linting + fix cuda check (setup.py). requirements update keras 2.2.4

* Add extract size option. Fix dlib hog init

* GUI: Increase tooltip width

* Update alignment tool to support new DetectedFace

* Add skip existing faces option

* Fix sort tool to new plugin structure

* remove old align plugin

* fix convert -skip faces bug

* Fix convert skipping no faces frames

* Convert - draw onto transparent layer

* Fix blur threshold bug

* fix skip_faces convert bug

* Fix training 
scripts/convert.py