You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在EasyOCR中正确集成自定义检测与Transformer识别模型?

自定义模型集成到EasyOCR的正确流程

你直接传入模型实例的思路方向是对的,但EasyOCR对自定义模型有明确的接口规范要求,不能直接传入任意模型,必须按框架要求封装适配。下面分检测器、识别器两部分说明实现步骤:

一、自定义检测器适配

EasyOCR要求检测器必须实现detect(image)方法,输入输出格式严格遵循框架规范:

  • 输入:numpy格式的图片(HWC维度,RGB/BGR均可)
  • 输出:文本区域的四顶点坐标列表,格式为[[x1,y1,x2,y2,x3,y3,x4,y4], ...],每个框的四个顶点按顺时针排列

示例封装代码:

class CustomDetector:
    def __init__(self, model_path):
        # 加载自研检测模型(如YOLO、Faster R-CNN等)
        self.model = self._load_detector(model_path)
    
    def _load_detector(self, model_path):
        # 这里实现你的模型加载逻辑
        pass
    
    def detect(self, image):
        # 1. 预处理:和训练时的逻辑完全一致(归一化、尺寸调整等)
        processed_img = self._preprocess(image)
        # 2. 模型推理
        raw_boxes = self.model.predict(processed_img)
        # 3. 后处理:将模型输出转换为EasyOCR要求的四顶点格式
        easyocr_boxes = self._postprocess(raw_boxes)
        return easyocr_boxes
    
    def _preprocess(self, image):
        # 自定义预处理逻辑
        pass
    
    def _postprocess(self, raw_boxes):
        # 示例:如果模型输出是轴对齐框(xmin, ymin, xmax, ymax),转四顶点
        boxes = []
        for box in raw_boxes:
            xmin, ymin, xmax, ymax = box
            quad_box = [xmin, ymin, xmax, ymin, xmax, ymax, xmin, ymax]
            boxes.append(quad_box)
        return boxes

加载检测器实例:

custom_detector_model = CustomDetector("path/to/your/detector/model")

二、自定义Transformer识别器适配

EasyOCR要求识别器必须实现recognize(image_list)方法,输入输出规范如下:

  • 输入:裁剪后的单文本区域图片列表(每个元素为HWC格式的灰度/RGB图)
  • 输出:与输入列表顺序对应的(文本结果, 置信度)元组列表,格式为[("text1", 0.99), ("text2", 0.95), ...]

示例封装代码(针对Transformer模型):

class CustomRecognizer:
    def __init__(self, model_path, vocab_path):
        # 加载自研Transformer模型和对应词汇表
        self.model = self._load_transformer(model_path)
        self.vocab = self._load_vocab(vocab_path)
        self.char2idx = {char: idx for idx, char in enumerate(self.vocab)}
        self.idx2char = {idx: char for idx, char in enumerate(self.vocab)}
    
    def _load_transformer(self, model_path):
        # 实现你的Transformer模型加载逻辑
        pass
    
    def _load_vocab(self, vocab_path):
        with open(vocab_path, "r", encoding="utf-8") as f:
            vocab = [line.strip() for line in f]
        return vocab
    
    def recognize(self, image_list):
        results = []
        for img in image_list:
            # 1. 预处理:与训练时一致(灰度化、尺寸调整、归一化等)
            processed_img = self._preprocess(img)
            # 2. 模型推理得到索引序列
            pred_idx = self.model.predict(processed_img)
            # 3. 将索引序列转换为文本(需处理CTC空白符等)
            pred_text = self._idx_to_text(pred_idx)
            # 4. 计算置信度(根据模型输出实现,示例用固定值)
            confidence = self._calculate_confidence(pred_idx)
            results.append((pred_text, confidence))
        return results
    
    def _preprocess(self, img):
        # 自定义预处理逻辑
        pass
    
    def _idx_to_text(self, pred_idx):
        # 处理CTC输出的空白符,转换为可读文本
        text = ""
        prev_char = None
        blank_token = "<blank>"  # 替换为你训练时用的空白符
        for idx in pred_idx:
            char = self.idx2char.get(idx, "")
            if char != prev_char and char != blank_token:
                text += char
                prev_char = char
        return text
    
    def _calculate_confidence(self, pred_idx):
        # 示例:取概率最大值的平均值,或直接用模型输出的置信度分数
        return 0.95

加载识别器实例:

custom_recognition_model = CustomRecognizer("path/to/your/transformer/model", "path/to/vocab.txt")

三、集成与验证

现在可以按你最初的代码初始化Reader,然后测试:

import easyocr

# 加载自定义模型
custom_detector = CustomDetector("path/to/detector")
custom_recognizer = CustomRecognizer("path/to/recognizer", "path/to/vocab")

# 初始化EasyOCR Reader
reader = easyocr.Reader(lang_list=['en'], detector=custom_detector, recognizer=custom_recognizer)

# 测试图片
result = reader.readtext("test_image.jpg")
print(result)

关键注意事项

  • 预处理/后处理逻辑必须和模型训练时完全一致,否则会导致精度严重下降。
  • 检测器输出的四顶点坐标必须是顺时针顺序,否则会影响后续的文本区域裁剪。
  • 识别器的输出顺序必须和输入的图片列表严格对应,否则EasyOCR无法匹配检测框与识别结果。

内容的提问来源于stack exchange,提问作者INNA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 23:25:33