OCR告别付费!分享两款可部署的开源工具

关注我的公众号:【编程朝花夕拾】,可获取首发内容。

01 引言

OCR文字识别已经基本覆盖我们的日常的聊天工具,如微信、QQ等都有截图识别文字甚至直接从图片可以复制文字。开发项目中使用OCR图片识别、文案提取等经常用到。大多数小型企业都会选择云厂商的文字识别,如阿里云、百度云、腾讯云等的识别功能。

那有没有白嫖的OCR呢?当然有,但是很多的识别率并不高。今天介绍两款识别率较高的OCR项目,关键是可以部署,应用到业务项目中。

02 Umi-OCR

2.1 简介

Umi-OCR 是一个免费、开源、可离线的 OCR 文字识别工具,由开发者 hiroi-sora 使用 Python 编写。它的名字中 "Umi" 在日语里是"海"的意思,寓意着其"海纳百川"的特性。

该项目是基于百度开源的PaddleOCR开发,对中文和英文的识别准确率非常高,同时支持多国语言。它的主要目标是提供一个简单易用、功能强大且完全离线的图片文字识别解决方案,完美保护用户隐私,因为所有识别过程都在本地计算机上完成,无需连接任何外部服务器。

不仅支持本地部署,还支持windows系统:

windows版本作为日常使用的工具大家可以自行探索。为了接入项目开发,我们主要了解一下本地部署的方式。

GitHub地址:github.com/hiroi-sora/...

2.2 部署

linux部署是新的项目:github.com/hiroi-sora/...

由于官方给出的测试的系统类型并没有Centos。尝试通过Centos8部署,结果失败:缺少一些基本组件,升级不成功。

所以这里我们使用Docker部署。

Docker部署的地址:github.com/hiroi-sora/...

官方文档介绍的很明白了。

检查主机CUP

因为目前主机的CPU只支持AVX指令集。

sh 复制代码
lscpu | grep avx

如果输出了类似如下的结果,那么可以继续部署。如果没有则无法部署

sh 复制代码
Flags:          ... avx ... avx2 ...

所以小编的机器是可以部署的。

构建镜像

由于远程镜像仓库里面没有上传,需要使用Dockerfile自行构建。

sh 复制代码
# 拉取Dockerfile文件
wget https://raw.githubusercontent.com/hiroi-sora/Umi-OCR_runtime_linux/main/Dockerfile

# 构建镜像
docker build -t umi-ocr-paddle .

umi-ocr-paddle表示构建的镜像名称。

启动容器

容器的运行支持无头模式和GUI模式。因为我们是为了项目的调用,所以这里我们使用悟透模式。

sh 复制代码
docker run -d --name umi-ocr \
    -e HEADLESS=true \
    -p 1224:1224 \
    umi-ocr-paddle

说明:

  • 设置容器名称为 umi-ocr 。你也可以设置为任意名称。
  • 设置环境变量 -e HEADLESS=true 启用无头模式。
  • 设置端口转发 -p xxxx:1224 ,将容器内的1224端口转发给主机xxxx端口。
  • 使用的镜像为 umi-ocr-paddle

2.3 接口调用

官方提供了HTTP接口手册:

github.com/hiroi-sora/...

我们这里以图片OCR:Base64识别为例:

Java案例

java 复制代码
 @Test
void test04() throws Exception {
    File file = new File("C:\\Users\\ws\\Desktop\\00.jpg");
    String encode = Base64.encode(Files.toByteArray(file));

    JSONObject jsonObject = new JSONObject();
    jsonObject.put("base64", encode);

    JSONObject item = new JSONObject();
//        item.put("ocr.language", "models/config_chinese.txt");
//        item.put("ocr.cls", true);
//        item.put("ocr.limit_side_len", 4320);
//        item.put("tbpu.parser", "multi_none");
    item.put("data.format", "text");
//        item.put("data.format", "dict");
    jsonObject.put("options", item);

    String post = HttpUtil.post("http://127.0.0.1:1224/api/ocr", JSON.toJSONString(jsonObject));
    System.out.println(post);
    System.out.println("----------------------------------------------");
    System.out.println(UnicodeUtil.toString(post));
}

结果

结果是识别出来了,但是有个小问题。第一行输出是unicode,需要我们将unicode转成中文。

03 TrWebOCR

3.1 简介

TrWebOCR基于开源项目 Tr 构建,目前已经停更了,tr官方说了项目转为研究性项目:

但是它仍然是一款好用的OCR工具。支持的平台比较多:

GitHub地址:github.com/alisen39/Tr...

3.2 部署

我们同样以Docker的形式部署。这个就比较简单了,可以自行构建镜像,也可以拉取镜像。

构建镜像

sh 复制代码
# dockerfile 构建
docker build -t trwebocr:latest .

# 运行镜像
docker run -itd --rm -p 8089:8089 --name trwebocr trwebocr:latest 

远程镜像

sh 复制代码
# 从 dockerhub pull
docker pull mmmz/trwebocr:latest

# 运行镜像
docker run -itd --rm -p 8089:8089 --name trwebocr mmmz/trwebocr:latest 

访问IP+端口,提供了网页端:

3.3 接口调用

我们先试试网页端:

接口文档地址:

github.com/alisen39/Tr...

Java案例

java 复制代码
@Test
void test07()  {
    File file = new File("C:\\Users\\ws\\Desktop\\34.png");

    JSONObject item = new JSONObject();
    item.put("file", file);
    item.put("is_draw", 0);

    String post = HttpUtil.post("http://127.0.0.1:8089/api/tr-run/", item);
    System.out.println(post);
    System.out.println("----------------------------------------------");
    System.out.println(UnicodeUtil.toString(post));
}

结果

04 小结

第二款虽然停更,但是已有的功能可以满足常用的OCR识别。而第一款一直活跃在GitHub上,是一款非常值得关注的项目,不断的迭代新的功能。有特殊要求的OCR可以利用开源模型自行训练。

相关推荐
五阿哥永琪22 分钟前
Spring boot 在IDEA中如何让一个应用在不同的端口多次启动?
spring boot·后端·intellij-idea
superman超哥27 分钟前
自定义迭代器的实现方法:深入Rust迭代器机制的核心
开发语言·后端·rust·编程语言·rust迭代器机制·自定义迭代器
superman超哥30 分钟前
IntoIterator Trait的转换机制:解锁Rust迭代器生态的关键
开发语言·后端·rust·编程语言·rust trait·rust迭代器·trait转换机制
qq_2562470535 分钟前
拒绝封号风险:用 Docker 混合架构实现 Gemini CLI 安全多开
后端
源代码•宸1 小时前
Leetcode—712. 两个字符串的最小ASCII删除和【中等】
开发语言·后端·算法·leetcode·职场和发展·golang·dp
何中应1 小时前
关于查询方式的总结与讨论
后端·缓存·查询
Victor3561 小时前
Hibernate(36)Hibernate如何处理多对多关系?
后端
Victor3561 小时前
Hibernate(35)什么是Hibernate的聚合函数?
后端
何中应1 小时前
@Autowrited和@Resource注解的区别及使用场景
java·开发语言·spring boot·后端·spring
源代码•宸1 小时前
Golang语法进阶(Context)
开发语言·后端·算法·golang·context·withvalue·withcancel