熊本県内で開催されているTech系イベントカレンダーサイト「KUMA-TECH」をオープンしました。

タイトルどおりです(笑)
ちなみに、「テック系」の意味がアバウトでよく理解できてません。。。

KUMA-TECHというタイトルの、熊本県内で開催されるテック系イベントカレンダーを制作、公開しました。このようなサイトが無い旨のPostを、ちょっと前に、どこかのSNSで見た覚えがあります。一応、開発を生業としている者としては、無いなら作るという発想は大事だと思い、それがきっかけで制作に着手しました。

熊本で比較的利用されていると思われるDoorkeeper、Connpass、Eventon、ATNDから、API経由でイベント情報を取得し、掲載する仕組みです。なお、APIで取得できないものは、カレンダーへの掲載申請をフォームからエントリーできるよう改善する予定です。更には、スマホでの操作性がイマイチなので、アプリ化してリマインダー通知も送れるようにしていきたいです。

熊本のテックシーンが盛り上がって、このカレンダーが埋まってくれると良いですね。

【開発中】OpenCVを使ったコミック調エフェクトの動画撮影アプリ

とあるiOSアプリ案件の一部機能で、OpenCVを使ったりなんかしています。
そんな中、ちょっと息抜きにOpenCVを使って遊んでいたところ、仕事を忘れて没頭してしまい、あと一息でApp Storeへ出せそうなところまで作り込んでしまいました。
せっかくなので、このまま完成させようと思います。

Continue reading 【開発中】OpenCVを使ったコミック調エフェクトの動画撮影アプリ

【iOS】オープンソースのOCRライブラリ「SwiftyTesseract」を試してみる

背景

【iOS】オープンソースのOCRライブラリ調査の続きです。

前回の調査の過程で、Tesseract OCR iOSSwiftOCRの2つがGitHubのスター数から見ても人気だということが分かりました。しかしながら、日本語認識に関しては課題が多く、実用向きではない印象を受けました。そこで個人的に注目しているのがSwiftyTesseractです。

というわけで、SwiftyTesseractを実際に試してみることにしました。

SwiftyTesseractについて

SwiftyTesseractの最大の特徴は、LSTMニューラルネットベースのOCRエンジンが追加された最新安定バージョンのTesseract 4をラップしている点です。ディープラーニングは詳しくないので深掘りしませんが、これで何が嬉しいかというと、Tesseract OCR iOSやSwiftOCRと比べて、ある程度スピードと正確性を両立させた日本語OCRが手軽に実現できるということです。

前提

本記事で使用した環境は次のとおりです。

  • macOS 10.14.4
  • Xcode 10.2.1
  • CocoaPods 1.4.0
  • Swift 4.2

Xcodeプロジェクトを作成する

まずはXcodeプロジェクトを新規作成し、Build SettingsでSwift Language Versionを変更します。
SwiftyTesseractのSwiftバージョンに合わせて、Swift 4.2を選択します。
スクリーンショット_2019-05-04_0_37_53.png

SwiftyTesseractをXcodeプロジェクトへ導入する

CocoaPods、または、CarthageでSwiftyTesseractを導入します。
SwiftyTesseractの解説には、CocoaPodsとCarthage双方の導入方法が紹介されていますので、好きな方法で導入してください。

ちなみに今回は、CocoaPodsを使ってSwiftyTesseractを導入してみます。
まずはPodfileを開いて次の一行を追加します。

Podfile
pod 'SwiftyTesseract', '~> 2.0'

次にPodfileを保存して、下記のコマンドでインストールします。

$ pod install

以上でSwiftyTesseractの導入は完了です。
以降は「プロジェクト名.xcworkspace」というファイルを開いて開発を進めていきます。

学習データをXcodeプロジェクトへ追加する

SwiftyTesseractでは、Tesseract 1用にあらかじめ用意されている学習データをそのまま利用することができます。
Tesseract用の学習データには、次の3つのタイプが用意されています。

SwiftyTesseractの解説によると、たいていのケースで最良の選択肢はtessdata_fastになるだろうと書いてあるので、今回はtessdata_fastの日本語学習データを利用します。

  1. パソコン上にtessdataという名称でフォルダを作成しておきます。 スクリーンショット_2019-05-03_21_30_16.png
  2. tessdata_fastのリポジトリにアクセスし、jpn.traineddataをクリックします。 スクリーンショット_2019-05-04_8_01_07.png
  3. Downloadボタンをクリックします。 スクリーンショット_2019-05-04_8_01_14.png
  4. あらかじめ作成しておいたtessdataフォルダへjpn.traineddataをダウンロードします。 スクリーンショット_2019-05-03_21_32_53.png
  5. tessdataフォルダをXcodeプロジェクトへドラッグします。 スクリーンショット_2019-05-03_21_54_12.png
  6. オプションは次のように選択します。 スクリーンショット_2019-05-03_22_18_34.png
  7. 水色のアイコンで表示されたtessdataフォルダの配下にjpn.traineddataがあればOKです。スクリーンショット_2019-05-03_22_19_16.png

以上で日本語学習データを利用する準備が整いました。

画像をXcodeプロジェクトへ追加する

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

sample.png

ロゴや下線があったり、「」<>:・〜※などの記号があったり、よく見ると紙が波打って文字のラインが若干ずれていたりといったトラップが仕込まれていますね。
果たして結果や如何に!?

OCR機能を実装する

ここまで来たら、あとはOCR機能を実装するだけです。
ViewController.swiftを次のとおり書き換えます。

ViewController.swift
import UIKit
import SwiftyTesseract

class ViewController: UIViewController {

    let swiftyTesseract = SwiftyTesseract(language: RecognitionLanguage.japanese)

    override func viewDidLoad() {
        super.viewDidLoad()

        let start = Date()

        let fileName = "sample.png"
        guard let image = UIImage(named: fileName) else { return }

        swiftyTesseract.performOCR(on: image) { recognizedString in
            guard let text = recognizedString else { return }
            print("\(text)")

            print("\(-start.timeIntervalSinceNow)")
        }
    }
}

ポイント解説

SwiftyTesseractのインポート

何はともあれ、SwiftyTesseractをインポートします。
これによってSwiftyTesseractが提供するメソッド等が利用できるようになります。

import SwiftyTesseract

SwiftyTesseractのインスタンスを生成

SwiftyTesseractのインスタンスを生成すると同時に、OCRで認識する言語の指定をここで行います。
下記は日本語を認識する場合の記述ですが、tessdataフォルダに含まれる学習データの言語を指定してあげる必要があります。 2

    let swiftyTesseract = SwiftyTesseract(language: RecognitionLanguage.japanese)

OCRの実行

OCRの実行は、単純にsample.pngから生成したUIImageをperformOCR(on:completionHandler:)メソッドへ渡すだけです。
完了ハンドラでは認識された文字列を受け取って処理します。

        let fileName = "sample.png"
        guard let image = UIImage(named: fileName) else { return }

        swiftyTesseract.performOCR(on: image) { recognizedString in
            guard let text = recognizedString else { return }
            print("\(text)")

            // ... 省略
        }

認識結果を確認する

気になる認識結果です。

1600x900の画像を使ってシミュレータで実行した場合は、1.6秒程度を要しました。

1600x900、シミュレータ実行時の認識結果(tessdata_fast)
「ねんきん定期便」「ねんきんネット」に関する
                           下             ら
お問い合わせは、 下記専用番号へ
マク               昭          2
sm 0570-058-555
※O5Oから始まる電話でおかけになる場合は(東京)03-6700-1144
<受付時間> 月 曜日 午前8:30征後7:00
火金曜日 。 午前8:30っ生後5:15
※祝日、 1 2 月 2 9日1月3日はご利用いただけません。
※月曜日が祝日の場合は、翌日以降の開所日初日に午後 7 : 00まで
相談をお受けします。
お問い合わせの際は、「ねんきん定期便」 (ヘー 1 ページ) の照会番号、 基礎年金番号または個人番号をお知らせください。
ご利用にあたっての留意事項
ら 0エルは、 一般の固定電話からおかけになる場合は、 全国どこからでも市内通話料金でご利用できます。
7当レ、
・「O57O」の最初の「O」 を省略したり、 市外局番を付けて間違い電話になるケースが完生しています.。
おかけ間違いのないよう、 ご注意ください。
・ 月曜日などの休日明けやお手元に通知書が届いた直後 (5日間程度) は、電話がつながりにくくなりのます。
週の後半月の後半はつながりやすくなっています。
・オンライ ン端末の移働時間によっては、  ご照会の回答が翌日以降になる場合があります。

800x450の画像を使ってシミュレータで実行した場合は、1.3秒程度を要しました。

800x450、シミュレータ実行時の認識結果(tessdata_fast)
「ねんきん定期便」「ねんきんネット」に関する
お問い合わせは、下記専用番号へ
トン                            回
記 0570-058-555
※O5Oから始まる電話でおかけになる場合は(東京) 03-6700-1144 g叶)
<受付時間> 月 果 日 。 生前Bi30一年径7:00
※祝日、1 2月29日1月3日はご利用いただけません。
※月曜日が祝日の場合は、避日以降の開所日補日午後7 : 0 0まで
相談をお受けします。
お問い合わせの隊は、「ねんきん定期便」 (ムー 1 ページ) の照会番号、 基礎年金番号または個人番号をお知らせください。
ご利用にあたっての留意事項
 本ルは  のたから33 国どこびらでも中衝料金でご利用できます。
ただし、
・_「O570」の最初の 「O」を省略したり、 市外局番を付けて間違い電話になるケースが発生しています。
おかけ商違いのないよう、 ご注意ください。
・ 月明日などの休日明けやお手元に運知書が届いた直後 (5日間程度) は、重話がつながりにくくなります。
 週の後半月の後半はつながりやすくなっています。
・オインライン端末の知午時聞によっては、 ご暑会の回答が翌日以降になる場合があります。

まとめ

認識精度はお世辞にも実用レベルとは言い難いながらも、ハードル高めな画像を使ったわりには頑張ってくれてる気がします。(個人の感想です)

無料のOCRライブラリで、画像や学習データに手を加えずとも、ここまで認識できるのは凄いことではないでしょうか。

認識範囲を限定したり、前処理で画像を適切に加工したり、学習データをチューニングしたりなど、認識精度をさらに向上させる方法を試す余地も大いにありそうです。 3

今後もSwiftyTesseractの動向を追っていきたいと思います。

おまけ

参考までに、tessdata_bestとtessdataの学習データを使った認識結果も掲載しておきます。

tessdata_bestでの認識結果

1600x900の画像を使ってシミュレータで実行した場合は、認識に5.3秒程度を要しました。

1600x900、シミュレータ実行時の認識結果(tessdata_best)
「 ね ん きん 定期 便 」「 ね ん きん ネッ ト 」 に 関す る
三 |
お 問い 合わ せ は 、 下 記 専 用 番号 へ
や -。
記 2 0570-058-555
※O050 か ら 始 まる 電話 で お か け に な る 場合 は (東京 ) 09-6 700-1144 mm
< 受付 時 間 > 月 曜 日
年 前 9 30 午後 4:00
※ 祝 日 、1 2 月 2.9 日 1 月 3 日 は ご 利用 いた だ け ま せん 。
※ 月 曜日 が 祝日 の 場合 は 、 翌 日 以降 の 開所 日 初日 に 午後 7 : 00 ま で
相談 を お 受け し ます 。
お 問い 合わ せ の 際 は 、「 ね ん きん 定期 便 」 (Aー 1 ペー ジ ) の 照会 番号 、 基礎 年 金 番号 また は 個人 番号 を お 知ら せく だ さい 。
ご 利用 に あたっ て の 留意 事項
* ヤル は 、 一 般 の 固定 電話 か ら お か け に な る 場合 は 、 全国 どこ か ら で も 市 内 通話 料金 で ご 利用 で きま す 。
に だ し 、
・「O570」 の 最初 の 「O」 を 省略 し た り 、 市 外 局 災 を 付け て 問 違 い 電 話 に な る ケ ー ス が 発生 し て いま す 。
お か け 間 違い の な いよ う 、 ご 注意 くだ さい 。
* 月 曜日 な どの 休日 明け や お 手元 に 通知 書 が 届い た 直後 (5 日 間 程度 ) は 、 電 話 が つなが り に くく な の ます 。
週 の 後半 や 月 の 後半 は つなが りや すぐ な っ て いま す 。
* オン ライ ン 端 末 の 稼働 時 間 に よ っ て は 、 ご 照会 の 回 答 が 翌日 以降 に な る 場合 が あり ます 。

tessdataでの認識結果

1600x900の画像を使ってシミュレータで実行した場合は、認識に3.0秒程度を要しました。

1600x900、シミュレータ実行時の認識結果(tessdata)
` ね ん き ん 定 期 便 」` ね ん き ん ネ ッ ト 」 に 関 す る
ミ ロ
お 問 い 合 わ せ は 、 下 記 専 用 番 号 ヘ
ン シ 許
啓 0⑤⑦0-0⑤⑧-⑤⑤⑤
※O⑤O か ら 始 ま る 電 話 で お か け に な る 場 合 は ( 東 京 ) 0③-⑥⑦00- ⑪④④ c_-awms
< 受 付 時 間 > 月 _ 曜 _ 日
平 前 ⑨ : ③ 0 へ 平 後 ④ : 0 0
※ 祝 日 、① ② 月 ② ⑨ 日 ー① 月 ③ 日 は ご 利 用 い た だ け ま せ ん 。 *
※ 月 曜 日 が 祝 日 の 場 合 は 、 翌 日 以 降 の 開 所 日 初 日 に 午 後 ⑦ : 0 0 ま で
相 談 を お 受 け し ま す 。
お 問 い 合 わ せ の 際 は 、 ` ね ん き ん 定 期 便 」 (Aー ① ペ ー ジ ) の 照 会 番 号 、 基 礎 年 金 番 号 ま た は 個 人 番 号 を お 知 ら せ く だ さ い 。
ご 利 用 に あ た っ て の 留 意 事 項
* 戸昇乞イ ヤ ル は 、 一 般 の 固 定 電 話 か ら お か け に な る 場 合 は 、 全 国 ど こ か ら で も 市 内 通 話 料 金 で ご 利 用 で き ま す 。
に だ し 、
・ `0⑤⑦0」 の 最 初 の `O」 を 省 略 し た り 、 外局を付けて間這い電話になるケ ー ス が 発 生 し て い ま す 。
お か け 閾 違 い の な い よ う 、 ご 注 意 く だ さ い 。
・月鱧貝萱との休日明けやお手元仁通知害か届いた直後 (⑤ 日 間 程 度 ) は 、 電 話 が つ な が り に く く な り ま す 。
週の欝キゆ貝の後半はつなかりやすくなっています。
・ オ ン ラ イ ン 端 末 の 稼 働 時 間 に よ っ て は 、 ご 照 会 の 回 答 が 翌 日 以 降 に な る 場 合 が あ り ま す 。


  1. TesseractはGoogleによって開発が進められているOCRエンジンです。 

  2. 今回は日本語のみ指定していますが、複数の言語を指定することもできます。 

  3. SwiftyTesseractの解説を見ても、予測可能な結果を返すために画像加工などの最適化をほどこすのは、ライブラリ側ではなくアプリ側であるとも受け取れる記述が確認できます。 

【iOS】オープンソースのOCRライブラリ調査

はじめに

iOSで利用可能なオープンソースのOCRライブラリを調査してみました。

前提条件

下記条件で調査しました。

  • 無料であること
  • オフラインで利用できること
  • サーバサイドやクラウドサービスを介さず利用できること
  • 手書き文字は考慮しないこと
  • 日本語の認識が可能であること
  • 日本語学習データの作成 or チューニングが可能なこと

調査結果

以下の3つのライブラリをピックアップしてみました。

Tesseract OCR iOS SwiftOCR SwiftyTesseract
OCRエンジン パターン認識 ニューラルネットワーク LSTMニューラルネットワーク
日本語学習データの提供
ライセンス MIT license Apache License,
Version 2.0
MIT License
依存ライブラリ Tesseract 3
Leptonica
libpng
libjpeg
libtiff
Swift-AI
GPUImage
Union-Find
Tesseract 4
Leptonica
libpng
libjpeg
libtiff

Tesseract OCR iOS

OCRエンジンにGoogleが開発を進めているTesseractを採用しているだけあって、情報量が多く人気もあるライブラリです。ただし、Tesseract本体、及び、対応する学習データのバージョンが若干古いため、日本語の認識精度に関しては疑問符が付きます。現在進行系でTesseract最新バージョンの実装を進めている(?)模様。

SwiftOCR

Tesseractよりパフォーマンスに優れる点をアピールしているライブラリです。ただし、短い英数字コードの認識が得意らしく、誌や文を認識したい場合はTesseractが良いと説明しています。日本語を認識するためには学習データを作成する必要があり、トレーニングツールが提供されているとは言え、十分な精度を望むのであれば導入に相応の時間を要しそうです。

SwiftyTesseract

Tesseract OCR iOSに同じく、TesseractをOCRエンジンとして採用しているライブラリです。Tesseract OCR iOSとの違いは最新安定バージョンのTesseractを採用している点で、パフォーマンスと認識精度が大きく向上しています。ただし、Tesseract本体のAPIを完全にはサポートしておらず、利用できない機能があるので注意が必要です。

まとめ

ここ数年で見聞きする機会が多くなった「ディープラーニング」によって、OCRライブラリの文字認識精度が飛躍的に向上している印象を受けました。
調査したライブラリの中では、SwiftyTesseractが最も手軽かつ実用向きではないかと考えます。
他にも有用なライブラリをご存知の方がいらっしゃいましたら、ぜひご教示ください。

おまけ

クラウド可かつ課金可まで条件を緩めると、Firebase向けML Kitのテキスト認識(OCR)一択な気がします。

簡易IoTシステムを構築して家の室温を計測→iPhoneアプリで可視化してみました。

手前の赤い基盤がWio LTE。奥の青い基盤は室温度センサ。

とある事情で、家の者から「外にいても家の室温が見えるようにしてほしい」と頼まれました。せっかくなので、この機会にIoTの勉強も兼ねようと思いたち、簡易的なIoTシステムをつくってみました。

Continue reading 簡易IoTシステムを構築して家の室温を計測→iPhoneアプリで可視化してみました。

参議院議員 松村よしふみ事務所公認アプリ『よしふみ君NEWS』をリニューアルしました。

『よしふみ君NEWS』は、参議院議員 松村よしふみ事務所公式サイトの活動報告やムービー、後援会のSNSなど、複数チャネルで発信されている情報を一つに集約して閲覧できるようにしたアプリです。

また、新着情報をプッシュ通知でユーザへお届けしており、App Storeではあまり見られない、国会議員の日々の活動や取り組みが身近に感じられるアプリになっています。『よしふみ君』というキャラクターも、なんだか和みますよね。

iOS 10以降のiPhone、iPod touchに対応。無料です。

 

 

以下は、ちょっとした技術のお話です。

Continue reading 参議院議員 松村よしふみ事務所公認アプリ『よしふみ君NEWS』をリニューアルしました。

Panasonic Laboratory Fukuokaのラボ体験会に出展しました。

2018.12.1(土)にPanasonic Laboratory Fukuoka(織りなすラボ)で、「つくると! in 織りなすラボ」と同時開催された「ラボ体験会」に、#AR_Fukuokaの一メンバーとして参加させていただきました。

当日福岡へ向かうバスを待つあいだに動作確認

Continue reading Panasonic Laboratory Fukuokaのラボ体験会に出展しました。

スマホAR+VRアプリ作成ハンズオンの講師を努めました。

2018.10.13(土)にARコンテンツ作成勉強会で講師を努めました。
テーマはUnityとVuforiaを使ったスマホAR+VRアプリの作成。ハンズオン形式の勉強会でした。

Continue reading スマホAR+VRアプリ作成ハンズオンの講師を努めました。

iOSアプリ “Success Timer” をリリースしました。

Success Timerはシンプルなカウントダウン方式のタイマーアプリです。プレゼンや発表、イベントなどの場で、人前で話したり、タイムキーパーをしたりする人なんかに使ってもらいたいなあと思って作ったアプリで、あらかじめ設定しておいた残り時間の経過をスクリーンカラーの変化でお知らせします。

もちろん通知音やバイブによるお知らせもあります。大きな文字で見やすい「ワイドタイマー」と、進行状況をサークル状に表示する「サークルタイマー」があり、用途に合わせて選べるのも特徴です。

iOS 11以降のiPhoneとiPadに対応。有料です。

Continue reading iOSアプリ “Success Timer” をリリースしました。

Vuforia AR+VR Sampleでつくる脱出ゲームもどき

Unity向けに公開されているVuforia AR+VR Sampleを使い、簡単なクイズに答えて脱出するiPhoneアプリを試作してみました。

サンプルで使っている3Dモデルやその表示位置を変更したり、インタラクションに少しアレンジを加えたりするだけで次のようなものができました。

Continue reading Vuforia AR+VR Sampleでつくる脱出ゲームもどき