こんにちは、iOSエンジニアの大江です。
最近は梅雨入りしたと言っているのに全く雨が降らず、 安心しきっています。 安心したところにいきなりくるときがあるので、みなさん油断せずいきましょう!
ということで、雨に負けないよう楽しくOCRのお話をしていきたいと思います。
前提
今回はいかにお金をかけずに手軽にやるかに重点を置いてみます!
iOSでのOCR
iOSでOCRを行うには以下のような方法があります。
ライブラリ | |
---|---|
クラウド | Google Cloud Vision API |
端末 | Tesseract OCR iOS SwiftOCR SwiftyTesseract |
Firebase MLKit(β) |
クラウド
Google Cloud Vision API
言わずと知れた Google さんの出しているAPIです。
一度画像をアップロードする必要があるものの、
様々なファイルタイプに対応しており、言語も自動で判別してくれます。
1ヶ月に1000ユニットまでは無料ですが、それを越えると1000ユニットごとにお金がかかります。
端末
Tesseract OCR iOS, SwiftOCR, SwiftyTesseract
それぞれオープンソースのライブラリであり、
オフラインで利用することができます!
Tesseract OCR iOS はOCRエンジンにGoogle開発のTesseractを採用しており、情報量も多くあります。
しかし、学習データのバージョンが少し古いので精度に不安が残ります。
SwiftOCR はTesseractよりパフォーマンスが良いことをアピールしています。
ただし、短い英数字を読み取るのが得意らしいので、文章などを読み込むためにはTesseractの方が良いと説明しています。
また、日本語を読み取るためには学習データを作成する必要があります。
SwiftyTesseract は Tesseract OCR iOSと同じTesseract をOCRエンジンとして採用しています。
Tesseract OCR iOS との違いとしては、最新の安定バージョンのTesseractを使用しているので、
パフォーマンスが向上しています。
ただし、Tesseract本体のAPIに完全対応しているわけではないので、利用できない機能があります。
両方
Firebase MLKit(β)
Firebase MLKit(β) はβ版ながらクラウド版と端末版両方が用意されています。
しかし、端末版ではいくつかの言語しか対応していません。
日本語はというと・・・・・・・対応していません!!
なんてこった!!
今回は日本語が試したいので、お休みしておいてもらいます。
準備
今回はSwiftyTesseractを試してみたいと思います。
- macOS 10.14.5
- Xcode 10.2.1 (Swift 4.2)
- CocoaPods 1.6.2
実装
何はともあれ初めはこれです。
Xcodeプロジェクト作成しCocoaPodsをinitしてください。
やり方については、先達の方々の記事が検索すれば出てくると思うので、
そちらを参考にしていただければと思います。
SwiftyTesseractの導入
プロジェクトのPodfile を開いて以下の一行を追加します。
>pod 'SwiftyTesseract', '~> 2.0'
次にPodfileを保存して、下記のコマンドでインストールします。
$ pod install
これでSwiftyTesseractの導入は完了です! 簡単ですね!
学習データの追加
SwiftyTesseract ではTesseract用に用意されているデータを利用することができます。
Tesseract用の学習データには、次の3つのタイプが用意されています。
- tessdata_best (LSTM、正確性重視)
- tessdata_fast (LSTM、速度重視)
- tessdata (パターン認識とLSTMの組み合わせ)
SwiftyTesseractによると多くの場合tessdata_fast が最良になるとのことだったので、
今回はtessdata_fast を利用します。
- tessdata_fastのリポジトリにアクセスし、jpn.traineddataダウンロードします。
- Xcodeプロジェクトにtessdataフォルダを作成ます。
- 作成したフォルダに、ダウンロードしてきたファイルを追加します。
これで日本語の学習データを利用する準備はできました。
画像をプロジェクトへ追加しておく
文字を読み取りたい画像ファイルを用意し、Xcodeプロジェクトへ取り込んでおきます。 今回は次の画像(sample.png)で試してみます。
この記事の一番初めの部分ですね!
OCR機能の実装
あとは実際にコードを書くだけです!
ViewController.swift で以下のように書いてあげてください。
import UIKit // SwiftyTesseract のインポート import SwiftyTesseract class ViewController: UIViewController { // swiftyTesseract インスタンスを生成 // この際引数で、言語の指定を行う。 let swiftyTesseract = SwiftyTesseract(language: RecognitionLanguage.japanese) override func viewDidLoad() { super.viewDidLoad() let filename = "sample.png" guard let image = UIImage(named: filename) else { return } swiftyTesseract.performOCR(on: image, completionHandler: { recognizedString in guard let text = recognizedString else { return } print(text) }) } }
結果
気になる結果です!!
100%完璧とまでは行きませんでしたが、
まずまずの結果となっているのではないでしょうか。
っss 10Sで光学的文字認識(OcR)を試してみる 28 ロiOS ロロSwift こんにちは、iOSエンジニアの大江です。 最近は梅坪入りしたと言っているのに全く雨が降らず、 安心しきっています。 安心し たところにいきなりくるときがあるので、みなさん油断せずいきましょう! ということで、雨に負けないよう楽しくOCRのお話をしていきたいと思います。 前提 今回はいかにお金をかけし たところにいきなりくるときがあるので、みなさん油断せずいきましょう! ということで、雨に負けないよう楽しくOCRのお話をしていきたいと思います。 前提 今回はいかにお金をかけ\343\201ずに手軽にやるかに重点を置いてみます ! i0SでのOCR i0SでOCRを行うには以下のような方法があります。 ライブラリ クラウド Google Cloud Vision API 端末 Tesseract OCRiOS SwiftOCR SwiftyTesseract Firebase MLKitB) クラウド
まとめ
今回はタイピングされた文字を読み込みましたが、
手書きの場合はどうなるのかなど、まだ気になる箇所は残っています。
また、記事には載せていませんが、背景色によって読み取り精度ががグッと下がったので、
そこも課題かなと思いました。
しかし、個人で試して楽しむだけなら手軽にできるので、
ぜひ試してみてください!
梅雨に負けずに頑張りましょう!!