粉押淫 发表于 2025-12-2 21:00:08

PaddlePaddle RapidOcr 使用一则

[]
github 项目
PaddleOCR 快速开始

https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.7/doc/doc_ch/quickstart.md#11
安装 PaddlePaddle

如果您没有基础的Python运行环境,请参考运行环境准备。


[*]您的机器安装的是CUDA9或CUDA10,请运行以下命令安装
python3 -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
[*]您的机器是CPU,请运行以下命令安装
# python3 -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple # 不行
# 用 pip
pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
安装PaddleOCR whl包

pip install "paddleocr>=2.0.1"-i https://mirror.baidu.com/pypi/simple # 推荐使用2.0.1+版本paddleocr默认使用PP-OCRv4模型(--ocr_version PP-OCRv4),如需使用其他版本可通过设置参数--ocr_version,具体版本说明如下:
版本名称版本说明PP-OCRv4支持中、英文检测和识别,方向分类器,支持多语种识别PP-OCRv3支持中、英文检测和识别,方向分类器,支持多语种识别PP-OCRv2支持中英文的检测和识别,方向分类器,多语言暂未更新PP-OCR支持中、英文检测和识别,方向分类器,支持多语种识别Python脚本调用

中英文与多语言使用
通过Python脚本使用PaddleOCR whl包,whl包会自动下载ppocr轻量级模型作为默认模型。

[*]检测+方向分类器+识别全流程
from paddleocr import PaddleOCR, draw_ocr

# Paddleocr目前支持的多语言语种可以通过修改lang参数进行切换
# 例如`ch`, `en`, `fr`, `german`, `korean`, `japan`
ocr = PaddleOCR(use_angle_cls=True, lang="ch")# need to run only once to download and load model into memory
img_path = './imgs/11.jpg'
result = ocr.ocr(img_path, cls=True)
for idx in range(len(result)):
    res = result
    for line in res:
      print(line)

# 显示结果
from PIL import Image
result = result
image = Image.open(img_path).convert('RGB')
boxes = for line in result]
txts = for line in result]
scores = for line in result]
im_show = draw_ocr(image, boxes, txts, scores, font_path='./fonts/simfang.ttf')
im_show = Image.fromarray(im_show)
im_show.save('result.jpg')结果是一个list,每个item包含了文本框,文字和识别置信度
[[, , , ], ('纯臻营养护发素', 0.9658738374710083)]RapidOcr (PaddleOCR)

apache 开源文件内容提取 - https://tika.apache.org/
官方仓库PaddleOCR - https://github.com/PaddlePaddle/PaddleOCR
[]
RapidOcrNcnnJvm

jni 调用

参考 RapidOcrNcnnJvm   - https://github.com/RapidAI/RapidOcrNcnnJvm

[*]预先编译好的动态运行库复制到run-test文件夹,根据您选择的编译类型,macOS、linux可能还需要额外配置动态库的搜索路径
[*]从第1步的说明中找到模型下载地址,放到run-test/models文件夹,测试的目标图片放到run-test/images文件夹
[*]用IDEA打开本项目
[*]Main.java为java版调用范例,main.kt为kotlin版调用范例,之后以kotlin为范例来说明
[*]IDEA中直接在在main方法左边点击绿色的运行图标,可以直接调试运行范例,但此时没有输入参数。


[*]编辑运行参数:顶部工具栏“运行”图标左边,点开下拉菜单“Edit Configurations”
[*]VM options:添加-Djava.library.path=run-test,(把run-test文件夹加到java的lib搜索路径)
[*]Program arguments添加命令行输入参数
run-test/models dbnet_op angle_op crnn_lite_op keys.txt run-test/test_imgs/1.jpg命令行参数models文件夹里必须有相应的模型文件,接下来的四个文件名对应模型文件夹里的3种模型(不含扩展名)和1个keys文件,请确认文件名无误
run-test/images/1.jpg是待识别的目标图片

[*]点击运行,正常的话就可以输出识别结果。
本质上是jni 调用
编译好的动态库 - https://github.com/RapidAi/RapidOcrNcnn/releases 注意是 Ncnn
看项目dll项目 源码.
入口在 https://github.com/RapidAI/RapidOcrOnnx/blob/main/src/main.cpp ;
导出的对象是 https://github.com/RapidAI/RapidOcrOnnx/blob/main/src/OcrLiteJni.cpp   ?
um... 实际有哪些函数, 还得看 dll 导出的函数表.. 用IDA静态分析看看
名称        地址        序号
JNI_OnLoad        0000000180010C20        1
JNI_OnUnload        0000000180010C70        2
Java_com_benjaminwan_ocrlibrary_OcrEngine_detect        0000000180010CB0        3
Java_com_benjaminwan_ocrlibrary_OcrEngine_enableResultText        0000000180011410        4
Java_com_benjaminwan_ocrlibrary_OcrEngine_getVersion        0000000180011780        5
Java_com_benjaminwan_ocrlibrary_OcrEngine_initLogger        00000001800117A0        6
Java_com_benjaminwan_ocrlibrary_OcrEngine_initModels        00000001800117D0        7
Java_com_benjaminwan_ocrlibrary_OcrEngine_setGpuIndex        0000000180012730        8
Java_com_benjaminwan_ocrlibrary_OcrEngine_setNumThread        0000000180012740        9
DllEntryPoint        00000001807D7030        package com.benjaminwan.ocrlibrary

class OcrEngine() {
    init {
      try {
                //对应的是 https://github.com/RapidAI/RapidOcrNcnn/releases/download/1.2.0/windows-jni.7z 下载的 dll库
            System.loadLibrary("RapidOcrNcnn")
      } catch (e: Exception) {
            e.printStackTrace()
      }
    }
    ............
   
    更多模型可以在官网 https://rapidai.github.io/RapidOCRDocs/model_list/#_1 下载(Onnx格式)
package com.benjaminwan.ocr

import com.benjaminwan.ocrlibrary.OcrEngine

fun main(args: Array<String>) {
        //System.setProperty("java.library.path", "D:\\libarry\\RapidOcrNcnnJvm\\win-JNI-CPU-x64\\bin")
    val jniLibDir = System.getProperty("java.library.path")
    println("java.library.path=$jniLibDir")

        // 对应的是 (https://github.com/RapidAI/RapidOcrNcnn/releases/download/1.2.0/Project_RapidOcrNcnn-1.2.0.7z) 下载的模型 及文件
    //------- init models/dir image/path -------
    val modelsDir = "E:\\projects-work\\pdf-classify\\run-test\\models"
    val detName = "ch_PP-OCRv3_det_infer"
    val clsName = "ch_ppocr_mobile_v2.0_cls_infer"
    val recName = "ch_PP-OCRv3_rec_infer"
    val keysName = "ppocr_keys_v1.txt"
    val imagePath = "E:\\projects-work\\pdf-classify\\run-test\\images\\1.jpg"
    println("modelsDir=$modelsDir, detName=$detName, clsName=$clsName, recName=$recName, keysName=$keysName, imagePath=$imagePath")

    //------- numThread -------
    val numThread = if (args.size > 6) args.trim().toIntOrNull() ?: 4 else 4

    //------- padding -------
    val padding = if (args.size > 7) args.trim().toIntOrNull() ?: 50 else 50

    //------- maxSideLen -------
    val maxSideLen = if (args.size > 8) args.trim().toIntOrNull() ?: 1024 else 1024

    //------- boxScoreThresh -------
    val boxScoreThresh = if (args.size > 9) args.trim().toFloatOrNull() ?: 0.5f else 0.5f

    //------- boxThresh -------
    val boxThresh = if (args.size > 10) args.trim().toFloatOrNull() ?: 0.3f else 0.3f

    //------- unClipRatio -------
    val unClipRatio = if (args.size > 11) args.trim().toFloatOrNull() ?: 1.6f else 1.6f

    //------- doAngle -------
    val doAngleFlag = if (args.size > 12) args.trim().toIntOrNull() ?: 1 else 1
    val doAngle = (doAngleFlag == 1)

    //------- mostAngle -------
    val mostAngleFlag = if (args.size > 13) args.trim().toIntOrNull() ?: 1 else 1
    val mostAngle = (mostAngleFlag == 1)

    //------- gpuIndex -------
    val gpuIndex = if (args.size > 14) args.trim().toIntOrNull() ?: 0 else 0
    println("gpuIndex=$gpuIndex")

    //------- get jni version -------
    val ocrEngine = OcrEngine()
    val version = ocrEngine.getVersion()
    println("version=$version")

    //------- setNumThread -------
    ocrEngine.setNumThread(numThread)

    //------- init Logger -------
    ocrEngine.initLogger(
      isConsole = true,//jni启用命令行输出
      isPartImg = true,
      isResultImg = true
    )
    ocrEngine.enableResultText(imagePath)
    ocrEngine.setGpuIndex(gpuIndex)//GPU0一般为默认GPU,参数选项:使用CPU(-1)/使用GPU0(0)/使用GPU1(1)/...
    //------- init Models -------
    val initModelsRet = ocrEngine.initModels(modelsDir, detName, clsName, recName, keysName)
    if (!initModelsRet) {
      println("Error in models initialization, please check the models/keys path!")
      return
    }

    //------- set param -------
    println("padding($padding) boxScoreThresh($boxScoreThresh) boxThresh($boxThresh) unClipRatio($unClipRatio) doAngle($doAngle) mostAngle($mostAngle)")
    ocrEngine.padding = padding //图像外接白框,用于提升识别率,文字框没有正确框住所有文字时,增加此值。
    ocrEngine.boxScoreThresh = boxScoreThresh //文字框置信度门限,文字框没有正确框住所有文字时,减小此值
    ocrEngine.boxThresh = boxThresh //请自行试验
    ocrEngine.unClipRatio = unClipRatio //单个文字框大小倍率,越大时单个文字框越大
    ocrEngine.doAngle = doAngle //启用(1)/禁用(0) 文字方向检测,只有图片倒置的情况下(旋转90~270度的图片),才需要启用文字方向检测
    ocrEngine.mostAngle = mostAngle //启用(1)/禁用(0) 角度投票(整张图片以最大可能文字方向来识别),当禁用文字方向检测时,此项也不起作用

    //------- start detect -------
    val ocrResult =
      ocrEngine.detect(imagePath, maxSideLen = maxSideLen) //按图像长边进行总体缩放,放大增加识别耗时但精度更高,缩小减小耗时但精度降低,maxSideLen=0代表不缩放
    //使用native方法,可以让OcrEngine成为单例
    /*val ocrResult =
      ocrEngine.detect(imagePath, padding, maxSideLen, boxScoreThresh, boxThresh, unClipRatio, doAngle, mostAngle)*/
    //------- print result -------
    println("识别结果: "+ ocrResult.toString())
    return
}RapidOcrOnnxJvm (推荐)

官方说明项目- https://github.com/RapidAI/RapidOcrOnnxJvm
dll库项目 - https://github.com/RapidAi/RapidOcrOnnx/releases
模型下载- https://github.com/RapidAI/RapidOcrOnnx/releases/tag/1.2.2
object INSTANCE {
    val log = LoggerFactory.getLogger(INSTANCE::class.java)
    val ocrEngine = OcrEngine()
    init {
      val modelsDir = System.getProperty("user.dir") + "\\run\\models_onnx"
      println("加载模型目录 : "+modelsDir)
      //注意 他这里需要模型后缀了, 我靠
      val detName = "ch_PP-OCRv3_det_infer.onnx"
      val clsName = "ch_ppocr_mobile_v2.0_cls_infer.onnx"
      val recName = "ch_PP-OCRv3_rec_infer.onnx"
      val keysName = "ppocr_keys_v1.txt"
      val numThread = 4;
      ocrEngine.setNumThread(numThread)

      //------- init Logger -------
      ocrEngine.initLogger(
            isConsole = false,
            isPartImg = false,
            isResultImg = false
      )
      //------- init Models -------
      val initModelsRet = ocrEngine.initModels(modelsDir, detName, clsName, recName, keysName)
      if (!initModelsRet) {
            log.error("模型初始化失败")
      }else{
            log.info("模型初始化成功")
      }
    }
}更换模型

更多模型可以在官网 https://rapidai.github.io/RapidOCRDocs/model_list/#_1 下载(Onnx格式)
在PC端识别用到的就是:
val detName = "ch_PP-OCRv4_det_infer.onnx"
val recName = "ch_PP-OCRv4_rec_infer.onnx"ppocr_keys_v1.txt 用原来的即可

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: PaddlePaddle RapidOcr 使用一则