Question
一段非常简单的调用代码,如图。
from paddleocr import PaddleOCR
import cv2
ocr = PaddleOCR(use_angle_cls=False, use_gpu=False)
img = cv2.imread('test.jpg')
result = ocr.ocr('test.jpg', cls=False)
但是控制台里面却是打印了一堆log和warning,就离谱,使用体验非常拉跨。
关键字包括:
Running analysis
Running IR pass
Fused 0 subgraphs into layer_norm op.
memory_optimize_pass.cc:199
analysis_predictor.cc:636 ======= optimize end =======
skip [feed], feed -> x
skip [save_infer_model/scale_0.tmp_1], fetch -> fetch
Answer
第一步
找到路径...\Anaconda3\envs\jbpp\Lib\site-packages\paddleocr\tools\infer\utility.py这个文件,在第239行找到如下代码块,
step i. 打开config.disable_glog_info()
step ii. 把config.switch_ir_optim(True) 改为 False
# enable memory optim
config.enable_memory_optim()
# config.disable_glog_info() ----> 把这行注释关掉,禁止打印log
config.delete_pass("conv_transpose_eltwiseadd_bn_fuse_pass")
if mode == 'table':
config.delete_pass("fc_fuse_pass") # not supported for table
config.switch_use_feed_fetch_ops(False)
config.switch_ir_optim(True) ----> 改为False
step i 使程序不再打印log到控制台 [参考];step ii 关闭了IR优化,经过测试,准确率没有变,所以我关了,不然会有 “Fused 0 subgraphs into layer_norm op.” 的日志输出。
第二步
调用 PaddleOCR() 时,这个函数内部竟然写了一个print。。会打印出所有参数,我也是麻了。
option i: 进去直接注释掉
option ii: 构造一个新函数,把print屏蔽,调用完再打开,如图
class HiddenPrints:
def __init__(self, activated=True):
# activated参数表示当前修饰类是否被**
self.activated = activated
self.original_stdout = None
def open(self):
sys.stdout.close()
sys.stdout = self.original_stdout
def close(self):
self.original_stdout = sys.stdout
sys.stdout = open(os.devnull, 'w')
def __enter__(self):
if self.activated:
self.close()
def __exit__(self, exc_type, exc_val, exc_tb):
if self.activated:
self.open()
先构造一个HiddenPrints类,再调用,如图
Myprint= HiddenPrints()
Myprint.close()
# 此处函数不会print
ocr = PaddleOCR(use_angle_cls=False, use_gpu=False)
img = cv2.imread('test.jpg')
result = ocr.ocr(img, cls=False)
Myprint.open()
#此处函数可以print
Appendix
1. 屏蔽warning
import warnings
warnings.filterwarnings("ignore")
2. 使用windows powershell在当前文件及其子文件中查找string [参考1][参考2]
get-childitem *.* -Recurse | sls -Pattern "你要搜索的str"
*.* 是文件名的正则表达式,sls是select-string的简写