OnnxOCR源代码解析:TextSystem类如何串联检测、识别与分类三大核心模块
OnnxOCR是一个基于PaddleOCR重构的轻量级OCR系统,它脱离了PaddlePaddle深度学习训练框架,实现了超快的推理速度。在OnnxOCR中,TextSystem类扮演着核心角色,它巧妙地串联起文本检测、文本识别和文本方向分类三大核心模块,构建了完整的OCR处理流程。## TextSystem类的初始化:三大模块的集成TextSystem类在初始化阶段就完成了对三大核心模块
OnnxOCR源代码解析:TextSystem类如何串联检测、识别与分类三大核心模块
OnnxOCR是一个基于PaddleOCR重构的轻量级OCR系统,它脱离了PaddlePaddle深度学习训练框架,实现了超快的推理速度。在OnnxOCR中,TextSystem类扮演着核心角色,它巧妙地串联起文本检测、文本识别和文本方向分类三大核心模块,构建了完整的OCR处理流程。
TextSystem类的初始化:三大模块的集成
TextSystem类在初始化阶段就完成了对三大核心模块的实例化,为后续的OCR流程奠定了基础。
class TextSystem(object):
def __init__(self, args):
self.text_detector = predict_det.TextDetector(args) # 文本检测模块
self.text_recognizer = predict_rec.TextRecognizer(args) # 文本识别模块
self.use_angle_cls = args.use_angle_cls
self.drop_score = args.drop_score
if self.use_angle_cls:
self.text_classifier = predict_cls.TextClassifier(args) # 文本方向分类模块
从上述代码可以看出,TextSystem的构造函数接收一个参数对象args,通过这个参数对象分别初始化了TextDetector(文本检测)、TextRecognizer(文本识别)和TextClassifier(文本方向分类)三个模块。这种设计使得各模块之间松耦合,便于独立维护和升级。
文本检测:定位图像中的文本区域
文本检测是OCR流程的第一步,其任务是从输入图像中定位出所有可能包含文本的区域。TextSystem类通过调用text_detector的__call__方法来完成这一任务。
TextDetector类位于onnxocr/predict_det.py文件中,它实现了基于ONNX模型的文本检测功能。其核心处理流程包括图像预处理、模型推理和后处理三个步骤。在预处理阶段,图像会被调整大小、归一化并转换为模型输入格式。模型推理阶段,ONNX模型会输出文本区域的概率图。后处理阶段则通过DBPostProcess等算法从概率图中提取出文本框的坐标。
文本方向分类:确保文本正确朝向
对于检测到的文本区域,还需要进行方向分类,以确保文本是正向的,便于后续的识别。当use_angle_cls参数为True时,TextSystem会调用text_classifier对每个文本区域进行方向判断。
TextClassifier类定义在onnxocr/predict_cls.py文件中,它同样基于ONNX模型实现。该模块会对输入的文本图像进行分类,判断其方向是0度还是180度。如果分类结果为180度且置信度超过阈值,系统会将图像旋转180度以校正方向。
文本识别:将图像中的文本转换为字符串
经过检测和方向校正后,文本区域将被送入文本识别模块进行识别。TextSystem通过调用text_recognizer的__call__方法来完成这一任务。
TextRecognizer类位于onnxocr/predict_rec.py文件中,它实现了基于ONNX模型的文本识别功能。该模块支持多种识别算法,如CRNN、NRTR、ViTSTR等。其核心流程包括对文本图像进行归一化处理、模型推理以及通过CTCLabelDecode等后处理算法将模型输出转换为字符串。
TextSystem的核心流程:串联三大模块
TextSystem类通过__call__方法将上述三大模块串联起来,形成完整的OCR处理流程。其核心代码如下:
def __call__(self, img, cls=True):
ori_im = img.copy()
# 文字检测
dt_boxes = self.text_detector(img)
if dt_boxes is None:
return None, None
img_crop_list = []
dt_boxes = sorted_boxes(dt_boxes)
# 图片裁剪
for bno in range(len(dt_boxes)):
tmp_box = copy.deepcopy(dt_boxes[bno])
if self.args.det_box_type == "quad":
img_crop = get_rotate_crop_image(ori_im, tmp_box)
else:
img_crop = get_minarea_rect_crop(ori_im, tmp_box)
img_crop_list.append(img_crop)
# 方向分类
if self.use_angle_cls and cls:
img_crop_list, angle_list = self.text_classifier(img_crop_list)
# 图像识别
rec_res = self.text_recognizer(img_crop_list)
# 结果过滤
filter_boxes, filter_rec_res = [], []
for box, rec_result in zip(dt_boxes, rec_res):
text, score = rec_result
if score >= self.drop_score:
filter_boxes.append(box)
filter_rec_res.append(rec_result)
return filter_boxes, filter_rec_res
从上述代码可以清晰地看到TextSystem的工作流程:
- 文本检测:调用text_detector获取文本框坐标。
- 文本区域裁剪:根据检测到的文本框坐标,从原始图像中裁剪出各个文本区域。
- 方向分类:如果启用了方向分类,则对每个文本区域进行方向判断和校正。
- 文本识别:将校正后的文本区域送入text_recognizer进行识别,得到文本内容和置信度。
- 结果过滤:根据置信度阈值过滤掉低置信度的识别结果。
总结:TextSystem类的设计亮点
TextSystem类通过巧妙的设计,将文本检测、方向分类和文本识别三大核心模块有机地串联起来,实现了高效、准确的OCR功能。其主要设计亮点包括:
- 模块化设计:将不同功能封装在独立的类中,便于维护和扩展。
- 灵活的参数配置:通过args参数对象,可以灵活配置各个模块的行为,如是否启用方向分类、置信度阈值等。
- 高效的流程控制:通过__call__方法实现了清晰的OCR处理流程,使代码易于理解和调试。
通过对TextSystem类的深入解析,我们不仅了解了OnnxOCR的核心工作原理,也为我们自己设计和实现类似的复杂系统提供了宝贵的参考。这种模块化、松耦合的设计思想,以及清晰的流程控制,是构建高效、可维护系统的关键。
如果你想深入了解OnnxOCR的更多细节,可以查看项目中的相关源代码文件,如onnxocr/predict_system.py、onnxocr/predict_det.py、onnxocr/predict_cls.py和onnxocr/predict_rec.py等。
要开始使用OnnxOCR,你可以通过以下命令克隆仓库:
git clone https://gitcode.com/gh_mirrors/on/OnnxOCR
希望这篇文章能帮助你更好地理解OnnxOCR的内部工作机制,为你的OCR相关项目开发提供有益的参考。
更多推荐





所有评论(0)