Skip to content

support show_log and save_log_dir #42

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Mar 13, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions deploy/mx_infer/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,6 @@ SVTR和CRNN在自动分档时会产生多个模型文件,使用自动挑选工
| vis_font_path | vis_pipeline_save_dir中绘制图片的字体文件路径(默认采用simfang.ttf) | False |
| save_pipeline_crop_res | 检测+分类+识别/检测+识别的任务中,是否保存检测结果 | False |
| pipeline_crop_save_dir | save_pipeline_crop_res为True时,检测结果的文件夹,保存检测后裁剪的图片 | False |
| show_log | 是否打印日志(暂未完全支持,默认打印INFO级别日志) | False |
| save_log_dir | 日志保存文件夹(暂未完全支持) | False |
| show_log | 是否打印日志 | False |
| save_log_dir | 日志保存文件夹 | False |

20 changes: 9 additions & 11 deletions deploy/mx_infer/args.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,14 @@
import os
import itertools

from deploy.mx_infer.utils import log
from deploy.mx_infer.framework.module_data_type import InferModelComb
from deploy.mx_infer.processors import SUPPORT_DET_MODEL, SUPPORT_REC_MODEL


def str2bool(v):
return v.lower() in ("true", "t", "1")

def get_args():
parser = argparse.ArgumentParser(description='Arguments for inference.')
parser.add_argument('--input_images_dir', type=str, required=True,
Expand Down Expand Up @@ -36,30 +40,24 @@ def get_args():
help='Saving dir for visualization of pipeline inference results.')
parser.add_argument('--vis_font_path', type=str, default='', required=False,
help='Font file path for recognition model.')
parser.add_argument('--save_pipeline_crop_res', type=bool, default=False, required=False,
parser.add_argument('--save_pipeline_crop_res', type=str2bool, default=False, required=False,
help='Whether save the images cropped during pipeline.')
parser.add_argument('--pipeline_crop_save_dir', type=str, required=False,
help='Saving dir for images cropped during pipeline.')

parser.add_argument('--show_log', type=bool, default=False, required=False,
parser.add_argument('--show_log', type=str2bool, default=False, required=False,
help='Whether show log when inferring.')
parser.add_argument('--save_log_dir', type=str, required=False, help='Log saving dir.')

args = parser.parse_args()
update_env_os(args)
setup_logger(args)
args = update_task_args(args)
check_args(args)
return args


def update_env_os(args):
if not args.show_log:
os.environ['MINDOCR_LOG_LEVEL'] = '2' # WARNING
else:
os.environ['MINDOCR_LOG_LEVEL'] = '1' # INFO

if args.save_log_dir:
os.environ['MINDOCR_LOG_SAVE_PATH'] = args.save_log_dir
def setup_logger(args):
log.init_logger(args.show_log, args.save_log_dir)


def update_task_args(args):
Expand Down
17 changes: 11 additions & 6 deletions deploy/mx_infer/pipeline.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,22 @@
import time
from collections import defaultdict
from multiprocessing import Process, Queue

import tqdm
from deploy.mx_infer.data_type import StopSign
from deploy.mx_infer.framework import ModuleDesc, ModuleConnectDesc, ModuleManager, SupportedTaskOrder
from deploy.mx_infer.processors import MODEL_DICT
from deploy.mx_infer.utils import log, profiling, safe_div, save_path_init, TASK_QUEUE_SIZE


def image_sender(images_path, send_queue):
def image_sender(images_path, send_queue, show_progressbar):
if os.path.isdir(images_path):
input_image_list = [os.path.join(images_path, path) for path in os.listdir(images_path)]
for image_path in input_image_list:
send_queue.put(image_path, block=True)
if show_progressbar:
for image_path in tqdm.tqdm(input_image_list, desc="send image to pipeline"):
send_queue.put(image_path, block=True)
else:
for image_path in input_image_list:
send_queue.put(image_path, block=True)
else:
send_queue.put(images_path, block=True)

Expand Down Expand Up @@ -90,12 +94,13 @@ def build_pipeline(args):
if args.save_vis_det_save_dir:
save_path_init(args.vis_det_save_dir)
if args.save_log_dir:
save_path_init(args.save_log_dir)
save_path_init(args.save_log_dir, exist_ok=True)

task_queue = Queue(TASK_QUEUE_SIZE)
process = Process(target=build_pipeline_kernel, args=(args, task_queue))
process.start()
image_sender(images_path=args.input_images_dir, send_queue=task_queue)
image_sender(images_path=args.input_images_dir, send_queue=task_queue,
show_progressbar=False if args.show_log else True)
task_queue.put(StopSign(), block=True)
process.join()
process.close()
2 changes: 2 additions & 0 deletions deploy/mx_infer/processors/common/collect_process.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,8 @@ def single_image_save(self, image_name, image):
box_line = vis_tool(image, box_list)
cv2.imwrite(filename + '.jpg', box_line)

log.info(f"{image_name} is finished.")

def final_text_save(self):
save_filename = os.path.join(self.infer_res_save_path, self.save_filename)
safe_list_writer(self.image_pipeline_res, save_filename)
Expand Down
43 changes: 19 additions & 24 deletions deploy/mx_infer/utils/logger.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,9 @@

MAX_BYTES = 100 * 1024 * 1024
BACKUP_COUNT = 10
LOG_NAME, LOG_TYPE = "logs", "mindocr"
LOG_TYPE = "mindocr"
LOG_ENV = "MINDOCR_LOG_LEVEL"
MS_INSTALL_HOME_PATH = 'mindocr-pipeline-infer'
LOG_SAVE_PATH = 'MINDOCR_LOG_SAVE_PATH'
INFER_INSTALL_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), '../../')) + "/"


class DataFormatter(logging.Formatter):
Expand Down Expand Up @@ -65,12 +64,9 @@ def format(self, record):
:param record: Format pattern.
:return: formatted log content according to format pattern.
"""
# when the Installation directory of mindocr changed,
# ms_install_home_path must be changed
idx = record.pathname.rfind(MS_INSTALL_HOME_PATH)
if idx >= 0:
if record.pathname.startswith(INFER_INSTALL_PATH):
# Get the relative path
record.filepath = record.pathname[idx:]
record.filepath = record.pathname[len(INFER_INSTALL_PATH):]
elif "/" in record.pathname:
record.filepath = record.pathname.strip().split("/")[-1]
else:
Expand All @@ -93,13 +89,14 @@ def _filter_env_level():


class LOGGER(logging.Logger):
def __init__(self, logger_name):
def __init__(self, logger_name, log_level=logging.WARNING):
super(LOGGER, self).__init__(logger_name)
self.model_name = logger_name
self.data_formatter = DataFormatter(self.model_name, self._get_formatter())
self.log_level = _name_to_log_level.get(_ms_level_to_name.get(_filter_env_level()))
self.console_log_level = _name_to_log_level.get(
_ms_level_to_name.get(_filter_env_level())) if log_level is None else log_level
console = logging.StreamHandler(sys.stdout)
console.setLevel(level=self.log_level)
console.setLevel(level=self.console_log_level)
console.setFormatter(self.data_formatter)
self.addHandler(console)

Expand Down Expand Up @@ -148,8 +145,8 @@ def setup_logging_file(self, log_dir, max_size=100 * 1024 * 1024, backup_cnt=10)
log_fn = os.path.join(log_dir, log_file_name)
fh = RotatingLogFileHandler(log_fn, 'a', max_size, backup_cnt)
fh.setFormatter(self.data_formatter)
fh.setLevel(logging.INFO)
self.addHandler(fh)
self.setLevel(self.log_level)

def filter_log_str(self, msg) -> str:
def _check_str(need_check_str):
Expand Down Expand Up @@ -201,21 +198,19 @@ def __call__(cls, *args, **kwargs):


class LoggerSystem(metaclass=SingletonType):
def __init__(self, path, model_name, max_size=MAX_BYTES, backup_cnt=BACKUP_COUNT):
self.path = path
def __init__(self, model_name=LOG_TYPE, max_size=MAX_BYTES, backup_cnt=BACKUP_COUNT):
self.model_name = model_name
self.max_bytes = max_size
self.backup_count = backup_cnt
self.logger = None

def get_logger(self):
logger = LOGGER(self.model_name)
if self.path:
if not os.path.exists(self.path):
os.makedirs(self.path, 0o750, exist_ok=True)
logger.setup_logging_file(self.path, self.max_bytes, self.backup_count)
return logger
def init_logger(self, show_info_log=False, save_path=None):
self.logger = LOGGER(self.model_name, logging.INFO if show_info_log else logging.WARNING)
if save_path:
self.logger.setup_logging_file(save_path, self.max_bytes, self.backup_count)

def __getattr__(self, item):
return object.__getattribute__(self.logger, item)

log_path = os.getenv(LOG_SAVE_PATH, None)
log_system = LoggerSystem(log_path, LOG_TYPE)
logger_instance = log_system.get_logger()

logger_instance = LoggerSystem(LOG_TYPE)
7 changes: 5 additions & 2 deletions deploy/mx_infer/utils/safe_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,10 @@ def safe_img_read(path: str):
return img


def save_path_init(path):
def save_path_init(path, exist_ok=False):
if os.path.exists(path):
shutil.rmtree(path)
if exist_ok:
return
else:
shutil.rmtree(path)
os.makedirs(path, 0o750)