code: def process(
      self,
      pp: scripts_postprocessing.PostprocessedImage,
      enable,
      face_weight,
      entropy_weight,
      edges_weight,
      debug,
  ):
      if not enable:
          return
  
      if not pp.shared.target_width or not pp.shared.target_height:
          return
  
      dnn_model_path = None
      try:
          dnn_model_path = autocrop.download_and_cache_models()
      except Exception:
          errors.report(
              "Unable to load face detection model for auto crop selection. Falling back to lower quality haar method.",
              exc_info=True,
          )
  
      autocrop_settings = autocrop.Settings(
          crop_width=pp.shared.target_width,
          crop_height=pp.shared.target_height,
          face_points_weight=face_weight,
          entropy_points_weight=entropy_weight,
          corner_points_weight=edges_weight,
          annotate_image=debug,
          dnn_model_path=dnn_model_path,
      )
  
      result, *others = autocrop.crop_image(pp.image, autocrop_settings)
  
      pp.image = result
      pp.extra_images = [
          pp.create_copy(
              x, nametags=["focal-crop-debug"], disable_processing=True
          )
          for x in others
      ]
  
imports: from modules import scripts_postprocessing, ui_components, errors
  import gradio
  from modules.textual_inversion import autocrop
label_desc: Use image node_id 2 for calling the ScriptPostprocessingFocalCrop obj's underlying member method code with example usage: obj.process(pp, enable, face_weight, entropy_weight, edges_weight, debug) without return types