最近在写一个小项目,需要使用paddleocr进行文字识别,然后发现存在严重的内存泄漏,运行时间越长,cpu和内存的占用率就越高。很容易导致程序的崩溃。
代码的主要逻辑如下:
import os
import numpy as np
from paddleocr import PaddleOCR, draw_ocr
from PIL import Image
import time
# 设置输入和输出目录
input_dir = '/content/img'
output_dir = '/content/log'
# 初始化 OCR
ocr = PaddleOCR(use_angle_cls=True, lang='en') # 运行一次以下载并加载模型到内存中
# 进入无限循环以持续进行检测
while True:
# 遍历输入目录中的图像文件
for filename in os.listdir(input_dir):
if filename.endswith('.png') or filename.endswith('.jpg') or filename.endswith('.jpeg'):
# 读取图像
img_path = os.path.join(input_dir, filename)
img = Image.open(img_path).convert('RGB')
img_np = np.array(img)
# 进行 OCR
result = ocr.ocr(img_np, cls=True)
# 提取 OCR 结果
res = result[0]
boxes = [line[0] for line in res]
txts = [line[1][0] for line in res]
scores = [line[1][1] for line in res]
# 在图像上绘制 OCR 结果
im_show = draw_ocr(img_np, boxes, txts, scores, font_path='/content/Humor-Sans.ttf')
im_show = Image.fromarray(im_show)
# 将带有 OCR 结果的图像保存到输出目录中
output_path = os.path.join(output_dir, filename)
im_show.save(output_path)
print(f"检测到 {filename} 中的文本,并将结果保存在 {output_path}")
# 在检查新图像之前暂停一段时间
time.sleep(1)
内存一直在增加,没有减少的痕迹。github官网有很多人都在讨论这个问题。
报告在 CPU 机器上使用 PaddleOCR CPU包, 2小时后遇到内存泄漏问题 · Issue #12150 · PaddlePaddle/PaddleOCR (github.com)
然后,我找到了一个大佬的解释:
大概就是说,这是paddle框架将Tensor做了缓存复用。但是这个缓存复用的策略对于我的项目需求没有好处,或者说是负担。所以我们可以修改这个策略:
export FLAGS_allocator_strategy=naive_best_fit
经过测试,内存确实不会一直涨到100%,但是可能还是会增长。
参考:PaddleOCR 中的内存泄漏。·问题 #11639 ·PaddlePaddle/PaddleOCR (github.com)