SwifyTesseract
注意
这个分支仅用于支持仍依赖于 3.x.x 系列版本的用户,并解决了一些阻止在 Xcode 12 上构建的问题。此分支将只会收到错误修复更新。如果你有能力,你应该迁移到版本 4.x.x。
CocoaPods 注意事项
此分支需要 CocoaPods >= 1.10.0.rc.1。 vendored 的原始 fat 二进制文件已被 vendored xcframework 替换,但与 Xcode 12 存在问题,并且尝试使用先前的 Cocoapods 1.10.0.rc.1 版本的 arm64 库链接 iOS 模拟器 x86 实现时存在一些问题 (https://github.com/SwiftyTesseract/libtesseract)。
在项目中使用 SwiftyTesseract
导入模块
import SwiftyTesseract
有两种方式可以快速实例化 SwiftyTesseract 而不改变默认值。使用一种语言
let swiftyTesseract = SwiftyTesseract(language: .english)
或使用多种语言
let swiftyTesseract = SwiftyTesseract(languages: [.english, .french, .italian])
要执行 OCR,只需将一个 UIImage
传递到 performOCR(on:)
或 performOCRPublisher(on:)
方法中
let image = UIImage(named: "someImageWithText.jpg")!
let result: Result<String, Error> = swiftyTesseract.performOCR(on: image)
let publisher: AnyPublisher<String, Error> = swiftyTesseract.performOCRPublisher(on: image)
为什么有两种方法?
对于只想进行同步调用的人来说,performOCR(on:)
方法提供了一个返回值 Result
并在该调用所在的线程上进行阻塞。
为方便在后台线程中执行 OCR 并在主线程上接收结果,performOCRPublisher(on:)
发布者可供使用(仅在 iOS 13.0+ 上可用)
let cancellable = swiftyTesseract.performOCRPublisher(on: image)
.subscribe(on: backgroundQueue)
.receive(on: DispatchQueue.main)
.sink(
receiveCompletion: { completion in
// do something with completion
},
receiveValue: { string in
// do something with string
}
)
performOCRPublisher(on:)
提供的发布者是一个 冷 发布者,这意味着在它被订阅之前不会执行任何工作。
弃用通知
从版本 3.0.0 开始,performOCR(on:completionHandler:)
已被弃用,将在未来的版本中删除。
从版本 3.1.0 开始,init(language:bundle:engineMode:)
和 init(languages:bundle:engineMode:)
已被弃用,将在未来的版本中删除。一个新的协议 LanguageModelDataSource
提供了更多灵活性,其中引入了语言训练文件。SwiftyTesseract 附带一个扩展,用于符合 LanguageModelDataSource
的 Bundle
。请参阅 自定义位置 部分,了解更多信息 附加配置
初始化器默认值说明
主要 SwiftyTesseract
初始化器的完整签名是
public init SwiftyTesseract(
languages: [RecognitionLanguage],
dataSource: LanguageModelDataSource = Bundle.main,
engineMode: EngineMode = .lstmOnly
)
捆绑参数是必需的,用于定位 tessdata
文件夹。只有在使用除主要捆绑外的 SwiftyTesseract
时,才需要更改此参数。引擎模式决定了要放入 tessdata
文件夹中的 .traineddata
文件类型。《.lstmOnly》被选择为默认值,因为测试期间发现其速度更快、可靠性更高,但可能根据识别的语言以及图像本身而有所不同。有关可与 SwiftyTesseract
配合使用不同类型的 .traineddata
文件的信息,请参阅 您应该使用哪种语言训练数据?
从源代码构建 Tesseract 及其依赖项
构建与SwiftyTesseract一起打包的静态二进制文件的Makefile位于SwiftyTesseract/SwiftyTesseract/Makefile。还有一个名为libtesseract
的汇总目标,可以在Xcode中直接运行,用于执行构建并将二进制文件和头文件移动到正确的目录中。如果有人感兴趣更新或修改依赖项,这为提供了便利。
安装
注意:这些是将SwiftyTesseract引入项目的唯一支持的яметоды。项目已看到有几个人打开问题,发现他们包含SwiftyTesseract到他们的项目的方法是克隆、构建后复制和粘贴框架到他们的项目中。这不得到支持。
CocoaPods
测试版本:1.10.0.rc.1
# Podfile
use_frameworks!
target 'YOUR_TARGET_NAME' do
pod 'SwiftyTesseract', '~> 3.0'
end
替换YOUR_TARGET_NAME
,然后,在Podfile
目录中输入
$ pod install
Carthage
测试版本:0.29.0
将其添加到Cartfile
github "SwiftyTesseract/SwiftyTesseract" ~> 3.0
$ carthage update
其他配置
将语言训练文件作为您应用程序包的一部分运输
- 从 tessdata、tessdata_best 或 tessdata_fast 存储库中下载适当的语言训练文件。
- 将您的语言训练文件放入名为
tessdata
的文件夹中。 - 将文件夹拖到您的项目中。您必须确保选择了“创建文件夹引用”,否则 SwiftyTesseract 将无法成功实例化。请参考以下示例图片:
自定义位置
感谢 Minitour,开发者现在可以更灵活地选择在何处以及如何包含语言训练文件以便 Tesseract 使用。如果您应用程序支持多种语言但不想将所有可能的训练文件捆绑到应用程序包中(每种语言训练文件的大小可以从1 MB到15 MB不等),这可能是有益的。您需要提供以下协议的合规性
public protocol LanguageModelDataSource {
var pathToTrainedData: String { get }
}
然后将它传递给 SwiftyTesseract 初始化器
let customDataSource = CustomDataSource()
let tesseract = SwiftyTesseract(
language: .english,
dataSource: customDataSource,
engineMode: .lstmOnly
)
请参阅 SwiftyTesseractTests.swift
(文件末尾附近)中的 testDataSourceFromFiles()
测试,以了解如何执行此操作。
您应该使用哪种语言训练数据?
在 SwiftyTesseract
中,可以使用三种不同类型的 .traineddata
文件:tessdata、tessdata_best 和 tessdata_fast,它们分别对应于 SwiftyTesseract
的 EngineMode
namely .tesseractOnly
、.lstmOnly
和 .tesseractLstmCombined
。.tesseractOnly
使用传统的 Tesseract 引擎,并且只能使用来自 tessdata 存储库的语言训练文件。在测试 SwiftyTesseract
的过程中,发现 .tesseractOnly
引擎模式是最不可靠的。.lstmOnly
使用长短期记忆循环神经网络执行 OCR,可以使用来自 tessdata_best、tessdata_fast 或 tessdata 存储库的语言训练文件。在测试过程中,发现 tessdata_best 提供了最可靠的结果,但速度较慢,而 tessdata_fast 提供与 tessdata(当与 .lstmOnly
一起使用时)可比的结果,并且比两者都快。.tesseractLstmCombined
只能使用来自 tessdata 存储库的语言文件,结果和速度似乎与 tessdata_best 相当。对于大多数情况,使用 tessdata_fast 语言训练文件以及 .lstmOnly
将可能是最佳选择,但这可能取决于项目中 SwiftyTesseract 的语言和应用。
自定义训练数据
所需步骤与 附加配置 中提供的说明相同。要使用自定义的 .traineddata
文件,只需使用 RecognitionLanguage
的 .custom(String)
选项即可。
let swiftyTesseract = SwiftyTesseract(language: .custom("custom-traineddata-file-prefix"))
例如,如果您想使用由 Exteris/tesseract-mrz 提供的优化 MRZ 代码的 OCRB.traineddata
文件,则 SwiftyTesseract实例创建如下:
let swiftyTesseract = SwiftyTesseract(language: .custom("OCRB"))
您还可以将第三方 Tesseract 语言训练文件与自定义训练文件一起使用。
let swiftyTesseract = SwiftyTesseract(languages: [.custom("OCRB"), .english])
识别结果
谈及OCR(光学字符识别),那句老话“垃圾输入,垃圾输出”同样适用。SwiftyTesseract也不例外。其底层的Tesseract引擎会处理图片并返回它认为的文字内容。例如,如果给SwiftyTesseract提供这张图片(图片链接:),则会产生以下内容:
a lot of jibbersh...
‘o 1 $ : M |
© 1 3 1; ie oI
LW 2 = o .C P It R <0f
O — £988 . 18 |
SALE + . < m m & f f |
7 Abt | | . 3 I] R I|
3 BE? | is —bB (|
* , § Be x I 3 |
...a lot more jibberish
您可以看到,它从图中选出了SALE,但围绕它的所有其他内容都尝试了阅读,不论方向如何。确定如何编辑和转换图片以便SwiftyTesseract以产生可预测的结果是开发人员的责任。最初,SwiftyTesseract旨在作为现成解决方案,然而,项目中被添加的逻辑做了过多的假设,强加任何特定实现给潜在的采用者似乎也不太合适。《SwiftyTesseractRTE》(链接:SwiftyTesseractRTE)提供了一个现成的解决方案,可以通过几行代码实现,应该满足大多数需求,如果您的项目目标是轻松地将OCR集成到应用程序中,这是一个更好的起点。
欢迎贡献
SwiftyTesseract
目前未实现全部Tesseract API,所以如果您希望实现某些功能,请创建问题并提交拉取请求!请参阅向SwiftyTesseract做出贡献以获取创建问题和提交拉取请求的完整指南。
文档
SwiftyTesseract的官方文档可以在此处找到
授权
如果没有 Tesseract 团队所做的工作,SwiftyTesseract 将无法实现。还要特别感谢 Tesseract-OCR-iOS,它修改了 Makefiles 以在 iOS 架构上构建 Tesseract 及其依赖项。
SwiftyTesseract 包含 Tesseract 和其依赖项的二进制文件。依赖项的完整列表如下
- Tesseract - 许可证为 Apache v2 许可证
- Leptonica - 许可证为 BSD 2-Clause 许可证
- libpng - 许可证为 Libpng 许可证
- libjpeg - 许可证为 Libjpeg 许可证
- libtiff - 许可证为 Libtiff 许可证