ユニファ開発者ブログ

ユニファ株式会社プロダクトデベロップメント本部メンバーによるブログです。

iOSで光学的文字認識(OCR)を試してみる

こんにちは、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 を利用します。

  1. tessdata_fastのリポジトリにアクセスし、jpn.traineddataダウンロードします。
  2. Xcodeプロジェクトにtessdataフォルダを作成ます。
  3. 作成したフォルダに、ダウンロードしてきたファイルを追加します。

これで日本語の学習データを利用する準備はできました。

画像をプロジェクトへ追加しておく

文字を読み取りたい画像ファイルを用意し、Xcodeプロジェクトへ取り込んでおきます。 今回は次の画像(sample.png)で試してみます。

f:id:unifa_tech:20190628164412p:plain
sample

この記事の一番初めの部分ですね!

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)
クラウド

まとめ

今回はタイピングされた文字を読み込みましたが、
手書きの場合はどうなるのかなど、まだ気になる箇所は残っています。
また、記事には載せていませんが、背景色によって読み取り精度ががグッと下がったので、
そこも課題かなと思いました。

しかし、個人で試して楽しむだけなら手軽にできるので、
ぜひ試してみてください!

梅雨に負けずに頑張りましょう!!