code: def save_inference_model(self, dirname):
      detector_dir = os.path.join(dirname, "text_detector")
      classifier_dir = os.path.join(dirname, "angle_classifier")
      recognizer_dir = os.path.join(dirname, "text_recognizer")
  
      self._save_detector_model(detector_dir)
      self._save_classifier_model(classifier_dir)
      self._save_recognizer_model(recognizer_dir)
      logger.info(
          "The inference model has been saved in the path {}".format(
              os.path.realpath(dirname)
          )
      )
  
imports: import argparse
  import ast
  import copy
  import math
  import os
  import time
  import cv2
  import numpy
  import paddle
  from paddle.inference import Config
  from paddle.inference import create_predictor
  from PIL import Image
  import paddlehub
  from .character import CharacterOps
  from .utils import base64_to_cv2
  from .utils import draw_ocr
  from .utils import get_image_ext
  from .utils import sorted_boxes
  from paddlehub.module.module import moduleinfo
  from paddlehub.module.module import runnable
  from paddlehub.module.module import serving
  from paddlehub.utils.log import logger
label_desc: Use image node_id 13 for calling the ChineseOCRDBCRNN obj's underlying member method code with example usage: obj.save_inference_model(dirname) without return types