          top_left_width, top_left_height = top_left[0].astype('int32')
          new_dim = (bottom_right_height - top_left_height,
                     bottom_right_width - top_left_width,
                     3 if image.ndim > 2 else 1)
          new_img = np.empty(new_dim, dtype=np.uint8)
  
          new_x = slice(max(0, -top_left_width),
                        min(bottom_right_width, image.shape[1]) - top_left_width)
          new_y = slice(max(0, -top_left_height),
                        min(bottom_right_height, image.shape[0]) - top_left_height)
 
</s> remove         for prediction, roi, offset in zip(batch.prediction,
                                           batch.data[0]["roi"],
                                           batch.data[0]["offsets"]):
            points = np.reshape(prediction, (-1, 2))
            points *= (roi[2] - roi[0])
            points[:, 0] += (roi[0] - offset[0])
            points[:, 1] += (roi[1] - offset[1])
            landmarks.append(points)
        batch.landmarks = np.array(landmarks)
 </s> add         if batch.second_pass:
            batch.landmarks = batch.prediction.reshape(self.batchsize, -1, 2) * self.input_size
        else:
            for prediction, roi, offset in zip(batch.prediction,
                                               batch.data[0]["roi"],
                                               batch.data[0]["offsets"]):
                points = np.reshape(prediction, (-1, 2))
                points *= (roi[2] - roi[0])
                points[:, 0] += (roi[0] - offset[0])
                points[:, 1] += (roi[1] - offset[1])
                landmarks.append(points)
            batch.landmarks = np.array(landmarks) </s> remove                      "min_size: %s, normalize_method: %s, re_feed: %s, disable_filter: %s, )",
                     self.__class__.__name__, detector, aligner, masker, recognition, configfile,
                     multiprocess, exclude_gpus, rotate_images, min_size, normalize_method,
                     re_feed, disable_filter)
 </s> add                      "min_size: %s, normalize_method: %s, re_feed: %s, re_align: %s, "
                     "disable_filter: %s)", self.__class__.__name__, detector, aligner, masker,
                     recognition, configfile, multiprocess, exclude_gpus, rotate_images, min_size,
                     normalize_method, re_feed, re_align, disable_filter)
        new_img = np.zeros(new_dim, dtype=np.uint8)
          top_left_width, top_left_height = top_left[0].astype('int32')
          new_dim = (bottom_right_height - top_left_height,
                     bottom_right_width - top_left_width,
                     3 if image.ndim > 2 else 1)
        new_img = np.zeros(new_dim, dtype=np.uint8)
  
          new_x = slice(max(0, -top_left_width),
                        min(bottom_right_width, image.shape[1]) - top_left_width)
          new_y = slice(max(0, -top_left_height),
                        min(bottom_right_height, image.shape[0]) - top_left_height)
keep keep keep keep replace keep keep keep keep keep
 Extract: Implement re-align/2nd pass
   - implement configurable re-align function in extract
  - update locales + documentation
  - re-factor align._base and split to separate modules
  - move normalization method to plugin parent
  - bugfix: FAN use zeros for pre-processing crop
  - lint AlignedFilter 
plugins/extract/align/fan.py