              Contains the batch that is currently being passed through the plugin process
          """
          landmarks = []
          for idx in range(self._re_feed + 1):
              subbatch = {key: val
                          for key, val in batch.items()
                          if key not in ["feed", "prediction"] + self._additional_keys}
              subbatch["prediction"] = batch["prediction"][idx]
              for key in self._additional_keys:
                  subbatch[key] = batch[key][idx]
              self.process_output(subbatch)
              landmarks.append(subbatch["landmarks"])
          batch["landmarks"] = np.average(landmarks, axis=0)
          return batch
  
 
</s> remove         batch : dict
 </s> add         batch : :class:`AlignerBatch` </s> remove             landmarks.append(subbatch["landmarks"])
        batch["landmarks"] = np.average(landmarks, axis=0)
 </s> add             landmarks.append(subbatch.landmarks)
        batch.landmarks = np.average(landmarks, axis=0) </s> remove         dict
 </s> add         :class:`AlignerBatch` </s> remove         logger.trace("Item out: %s", {key: val.shape if isinstance(val, np.ndarray) else val
                                      for key, val in batch.items()})
 </s> add         logger.trace("Item out: %s", {key: val.shape  # type:ignore
                                      if isinstance(val, np.ndarray) else val
                                      for key, val in batch.__dict__.items()})
            # Create a pseudo object that only populates the data, feed and prediction slots with
            # the current re-feed iteration
            subbatch = AlignerBatch(image=batch.image,
                                    detected_faces=batch.detected_faces,
                                    filename=batch.filename,
                                    feed=[batch.feed[idx]],
                                    prediction=batch.prediction[idx],
                                    data=[batch.data[idx]])
              Contains the batch that is currently being passed through the plugin process
          """
          landmarks = []
          for idx in range(self._re_feed + 1):
            # Create a pseudo object that only populates the data, feed and prediction slots with
            # the current re-feed iteration
            subbatch = AlignerBatch(image=batch.image,
                                    detected_faces=batch.detected_faces,
                                    filename=batch.filename,
                                    feed=[batch.feed[idx]],
                                    prediction=batch.prediction[idx],
                                    data=[batch.data[idx]])
            # Create a pseudo object that only populates the data, feed and prediction slots with
            # the current re-feed iteration
            subbatch = AlignerBatch(image=batch.image,
                                    detected_faces=batch.detected_faces,
                                    filename=batch.filename,
                                    feed=[batch.feed[idx]],
                                    prediction=batch.prediction[idx],
                                    data=[batch.data[idx]])
            # Create a pseudo object that only populates the data, feed and prediction slots with
            # the current re-feed iteration
            subbatch = AlignerBatch(image=batch.image,
                                    detected_faces=batch.detected_faces,
                                    filename=batch.filename,
                                    feed=[batch.feed[idx]],
                                    prediction=batch.prediction[idx],
                                    data=[batch.data[idx]])
            # Create a pseudo object that only populates the data, feed and prediction slots with
            # the current re-feed iteration
            subbatch = AlignerBatch(image=batch.image,
                                    detected_faces=batch.detected_faces,
                                    filename=batch.filename,
                                    feed=[batch.feed[idx]],
                                    prediction=batch.prediction[idx],
                                    data=[batch.data[idx]])
            # Create a pseudo object that only populates the data, feed and prediction slots with
            # the current re-feed iteration
            subbatch = AlignerBatch(image=batch.image,
                                    detected_faces=batch.detected_faces,
                                    filename=batch.filename,
                                    feed=[batch.feed[idx]],
                                    prediction=batch.prediction[idx],
                                    data=[batch.data[idx]])
            # Create a pseudo object that only populates the data, feed and prediction slots with
            # the current re-feed iteration
            subbatch = AlignerBatch(image=batch.image,
                                    detected_faces=batch.detected_faces,
                                    filename=batch.filename,
                                    feed=[batch.feed[idx]],
                                    prediction=batch.prediction[idx],
                                    data=[batch.data[idx]])
              self.process_output(subbatch)
              landmarks.append(subbatch["landmarks"])
          batch["landmarks"] = np.average(landmarks, axis=0)
          return batch
  
keep keep keep keep replace replace replace replace replace replace keep keep keep keep keep
 Extract updates:
  - Default CPU detector to MTCNN
  - add basic Aligner false positive filters
  - Typing: align + plugins
  - Use specific AlignerBatch class for alignment
  - 
plugins/extract/align/_base.py