Skip to content

Conversation

@AzureG03
Copy link

@AzureG03 AzureG03 commented Dec 13, 2025

增加PP-OCRv5 mobile模型用于OCR识别,仅支持了CPU,模型取自jingsongliujing/OnnxOCR

  1. def ocr(self, img)
    单张图像的单行文字识别
  2. def atomic_ocr_for_single_lines(self, img_list, cand_alphabet=None)
    类似CNOCR的多图单行文字识别接口,没有批处理(batch=1)
  3. def detect_then_ocr(self, img, pad=10, threshold=0.3, mode=cv2.RETR_EXTERNAL, debug=False)
    检测可能的文本区域->OCR识别,多区域也没有批处理(batch=1)

方法2和3实现了批处理,不过性能提升有限

环境要求onnxruntime,在python 3.7上通过pip安装的版本是1.14.1,会升级numpy到1.21.6,cnocr和mxnet会报错numpy版本不匹配,但实际运行目前没遇到报错,不过可能会影响打包?这个pr不处理依赖关系

OCR效果:

  1. 全屏OCR大概在0.8到1.6秒之间(Intel I7-11800H),具体取决为待识别区域数量,可以通过裁剪无效区域加快速度;单行基本100ms内
  2. 支持RGB图像和竖排文字,活动汇总下方的几个竖排都能正常识别
    竖排文字判断标准为若width*1.5<height,则逆时针旋转90°后再识别
  3. 数字识别的正确率相比已有模型会差一点
    • 小概率出现数字重复的情况,如123变成1123;食物满额的40000变成400000
    • 罗马数字的识别也不如已有的,如III大概识别为‘川’
    • 后宅的食物没有的几种由于背景色相近大概检测不到,直接制定区域识别也容易给出错误结果,依靠已有的二值化处理可以一定程度缓解,不过第一个问题依然存在

现有的OCR基本用于数字识别,PP-OCRv5不微调没什么优势,而且已有的代码也有针对性的预处理和后处理
可能的用处大概是#1200和战斗时间(不用特地适配每个战斗主题)的识别?

import time

from alas import AzurLaneAutoScript

alas = AzurLaneAutoScript()
alas.device.screenshot()

# Usage 1
from module.ocr.pp_ocr import PpOcr
ocr = PpOcr()
start = time.time()
ocr.detect_then_ocr(alas.device.image)
print(time.time() - start)

# Usage 2
from module.ocr.ocr import Ocr
ocr = Ocr(None).ppocr
ocr.detect_then_ocr(alas.device.image, debug=True)

@AzureG03 AzureG03 changed the base branch from master to dev December 13, 2025 16:53
@LmeSzinc
Copy link
Owner

我没看见产生的优势是什么,正确率下降,单行识别耗时变为现在的2倍,alas 没 det 模型,你的 det 耗时是隔壁同样调用 paddle det 模型的 src 的 2~3 倍。要首先解决这个问题。

项目接入也完全没做,你不能写个小几百行的玩具代码,然后等着我帮你擦屁股,现在是 ai 时代,这样的代码没有价值。你要解决依赖冲突,rpc调用封装,原子设置字符集白名单,多语言模型和调用,det模型和rec模型的懒加载 主动预加载 主动释放,然后慢慢收集badcase进行修复,这个工作量不小的。

@AzureG03
Copy link
Author

依赖问题:降级onnxruntime至1.10.0可以兼容numpy1.16.6,不过本机环境pip compile会在处理av时报错,pip install正常,不确定是否会有问题

PPOCR-v5不是用来替代已有的CNOCR的,例如科研任务的QDB三个字符太相似,不微调识别不准;目前主要是想在button assets中利用ocr来替代模板匹配文字图片,例如大世界的“深渊海域”,“普通海域”;宿舍计划的“选择宿舍”,“宿舍商店”等button

不确定隔壁的模型是不是指崩铁用的pponnxcr,v3和v5有较大区别,v5默认支持简繁日英四语;主要耗时都在预处理和det模型上,其中det占比80%以上,预处理约10%

性能测试:

  1. cnocr和ppocr的atomic_ocr_for_single_lines加上util的timer注解
  2. 在module.ocr.ocr.py Ocr类的ocr方法中加入代码进行测试:
            if direct_ocr:
                image_list = [self.pre_process(i) for i in image]
            else:
                image_list = [self.pre_process(crop(image, area)) for area in self.buttons]
    
            # This will show the images feed to OCR model
            # self.cnocr.debug(image_list)
    
            ppocr = self.ppocr.atomic_ocr_for_single_lines(image_list, self.alphabet)
            ppocr = self.ppocr.atomic_ocr_for_single_lines(image_list, self.alphabet)
            ppocr = self.ppocr.atomic_ocr_for_single_lines(image_list, self.alphabet)
    
            result_list = self.cnocr.atomic_ocr_for_single_lines(image_list, self.alphabet)
            result_list = self.cnocr.atomic_ocr_for_single_lines(image_list, self.alphabet)
            result_list = self.cnocr.atomic_ocr_for_single_lines(image_list, self.alphabet)
            result_list = [''.join(result) for result in result_list]
            result_list = [self.after_process(result) for result in result_list]
  3. 大多数情况下ppocr即使有det模型,耗时也比cnocr少
    case 1:
        atomic_ocr_for_single_lines: 0.0372781754 s # ppocr
        atomic_ocr_for_single_lines: 0.0289912224 s
        atomic_ocr_for_single_lines: 0.0269718170 s
        atomic_ocr_for_single_lines: 0.0678009987 s # cnocr
        atomic_ocr_for_single_lines: 0.0461361408 s
        atomic_ocr_for_single_lines: 0.0438113213 s
    case 2:
        atomic_ocr_for_single_lines: 0.0991973877 s # ppcor
        atomic_ocr_for_single_lines: 0.0386574268 s
        atomic_ocr_for_single_lines: 0.0480852127 s
        atomic_ocr_for_single_lines: 0.2229168415 s # cncor
        atomic_ocr_for_single_lines: 0.0570271015 s
        atomic_ocr_for_single_lines: 0.0451655388 s
    case 3:
        atomic_ocr_for_single_lines: 0.1258404255 s # ppcor
        atomic_ocr_for_single_lines: 0.1157152653 s
        atomic_ocr_for_single_lines: 0.0658807755 s
        atomic_ocr_for_single_lines: 0.1653769016 s # cncor
        atomic_ocr_for_single_lines: 0.0738723278 s
        atomic_ocr_for_single_lines: 0.1048374176 s
    
  4. 结论:对于裁剪后图片的ocr识别,ppocr的性能不比cnocr差,而且全屏的det->rec是不推荐的

如开头,ppocr不是来替代cnocr的,尤其是azur_lane模型,科研任务编号的识别目前替代不了

不过对于ui的按钮识别,ppocrv5自带的多语种和彩图支持是已有的cncor完全比不了的

注:单行文字的识别,默认启用了det模型(可通过参数关闭),因为部分情况下,文字周边存在无效的背景,或是文字右对齐,左边空白较大的情况下容易漏字或重复,先用det过一遍效果会好不少,而且图像裁剪后的耗时如上所述是完全可以接受的

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants