羊をめぐるブログ

趣味の色々について書きます

ネイティブアプリでのOCRの性能を検証してみる(Tesseract, Cloud Vision API)

はじめに

小説などを読んでいると時々見たことのない単語に出会すことがあります.

最近だと

「傴僂」 「聯関」 「偏頗」

などに遭遇し,困りました.

全く知らない単語に出会した時,読み仮名がふってあれば良いのですが,ない場合も多く,そうなると検索が非常に困難です(紙だと単語コピーもできない).傴をにんべん口三つなどとググったのは黒歴史です,

手書きで漢字を判定するアプリはよくありますが,細かい漢字を指で書くのは面倒なので写真でできないかなと思い,ネイティブアプリでのOCRを検証してみました. 検証の対象としては,OCRエンジンとして有名そうなTesseractのswift版であるSwiftyTesseract,Cloud Vision APIの一部として提供されているOCR APIを利用しました.

github.com

cloud.google.com

検証内容

与えるデータ

まず,一般に認知されてる少し複雑な単語として以下を試します.単語の認識ソースとしては,ググって出てきたwebページを撮影し,単語箇所を切り抜いたものを利用します.

「溢れる」 「詳細」 「鬱病

f:id:sheep96:20201004012609j:plain f:id:sheep96:20201004012622j:plain f:id:sheep96:20201004012634j:plain

次に,あまり日常生活で見ない単語である

「傴僂」 「聯関」

f:id:sheep96:20201004012717j:plain f:id:sheep96:20201004012729j:plain

を試してみます.

最後に,OCRはそもそも単語でなく文章を読み取るためのものな気がするので,新潮文庫より出版されている小説「金閣寺」(三島由紀夫著)の裏表紙のあらすじを与えてみます.

f:id:sheep96:20200930185545j:plain:w300

使うモデル

モデルとしては以下を利用します

  • Tesseract (速度重視のtessdata_fast,精度重視のtessdata_best,公式ではfastがおすすめらしい)

  • Cloud Vision API

実装の参考は以下

shinjism.com

結果

単語の読み取り

Tesseract Best Tesseract Fast CVA
処理時間 一瞬 一瞬 1秒
溢れる OK OK OK
詳細 OK OK OK
鬱病 OK OK OK
傴僂 価 佑 偏優 區傻
聯関 職 関 隊関 OK
  • 一般的に認知されている単語についてはどれも正確に読み取ることができた

  • 認知度の低い単語については,Vision APIはTesseractより秀でているようです(傴僂についても近い漢字を出せている).モデルの質よりは学習データ上の語彙数とかの問題な気がする.

  • 処理時間に関しては,ほぼ一瞬.Vision APIはレイテンシも含んでいるので少し遅い.

文章の読み取り

Tesseract Fast

処理時間:1,2秒ほど

一九五〇年七月一日、「国宝・金剛
寺焼失。放火犯人は寺の青年信」 と
いう衝撃のニュースが世人の耳目を
驚かせた。この事件の陰に潜められ
た若い学僧の悩みーーハンディを背
負った宿命の子の、生への消しがた
い呪いと、それゆえに金開の美の魔
力に魂を要われん、ついには幻想と心
中するにいたった悲劇……。31歳の
鬼オ三島が全青春の決算として告白
体の名文に組った不朽の金字塔。

精度に関しては所々間違うところはあるが,長文においても処理が速いのは魅力的.

Tesseract Best

処理時間:10秒ほど

ー 九 五 〇 年 七 月 一 日 、「 国 宝 ・ 金 閣
寺 焼 失 。 放 火 犯 人 は 寺 の 青年 僧 」 と
いう 衝撃 の ニュ ー ス が 世 人 の 耳目 を
藻 か せ た 。 こ の 事件 の 陰 に 潜め られ
た 若い 学 僧 の 悩み ーー ハン ディ を 背
負っ た 宿命 の 子 の 、 生 へ の 消し が た
い 上 呪い と 、 そ れ ゆ え に 金閣 の 美 の 訂
力 に 魂 を 奪わ れ 、 つ い に は 幻想 と 心
中 する に いた っ た 悲劇 ……。31 歳 の
鬼 オ 三島 が 全 青春 の 決算 と し て 告白
体 の 名 文 に 綴っ た 不朽 の 金 字 護 。

単語間に空白が混ざるが,精度に関しては2,3箇所間違える程度.

Cloud Vision API

処理時間:7秒ほど

一九五○年七月一日、「国宝 金閣\n寺焼失。放火犯人は寺の青年僧」 と\nいう衝撃のニュースが世人の耳目を\n驚かせた。この事件の陰に潜められ\nた若い学僧の悩み ハンディを背\n負った宿命の子の、生への消しがた\nい呪いと、それゆえに金閣の美の魔\n力に魂を奪われ、ついには幻想と心\n中するにいたった悲劇 。31歳の\n鬼才三島が全青春の決算として告白\n体の名文に綴った不朽の金字塔。\n

精度に関しては完璧.

所感

  • 一般的な単語の認識ならTesseractでも十分だが,複雑な語彙にも対応するならCloud Vision APIを使う方が良さそう.

    • 当初の目的の単語判別をするならCVA使うしかない
    • Vision APIは1000リクエスト/month 以上は課金なので節約を考えつつ組み込むのが怠そう...
    • 複雑な鬱はどのモデルも認識できているので,モデルの性能よりは学習データの語彙の差な気がする.
  • 文章長が処理速度に結構影響している

  • Tesseractは公式の通り,fastを使うのが良さそう(精度の差は少しだが,長文の処理は10倍ぐらい速い)

flutterで内蔵辞書検索(iOS)

はじめに

flutterで内蔵辞書検索 on iOSを実装してみたので,その備忘録を書きます.

方法

以下の手順で行いました

  1. iOS側で辞書検索のためのmethodを実装

  2. flutter側からmethod channelで呼び出す

単純ッ

実装

iOS側の実装

iOSでは内蔵辞書検索のためのAPIとしてUIReferenceLibraryViewControllerが用意されています

Apple Developer Documentation

こちらのapiは,単語を引数として受け取り,内蔵辞書に対する検索結果のViewControllerを返すという動作をします.辞書内に複数見つかった場合はリスト表示され,見つからなかった場合はNot Foundが表示されます.

あくまで辞書の検索結果のページを返すだけであり,検索結果をデータとして取得して弄るなどのことはできないようです(著作権のせい?).

ただ,MacOS用なのででiOSでは使えないのですが,swift自体にはDCSCopyTextDefinitionという検索結果をデータとして得られそうなAPIが用意されているみたいです.

Apple Developer Documentation

とりあえず,今回はflutterからUIReferenceLibraryViewControllerを呼び出せるようにiOS側に実装します.method channelの実装は以下を参考にしました

FlutterでiOSのネイティブコードを呼び出す - Qiita

以下をmethod channelで呼び出します

    func searchDictionary(result: FlutterResult, controller: FlutterViewController, queryWord: String){
        let ref: UIReferenceLibraryViewController = UIReferenceLibraryViewController(term: queryWord)
        controller.present(ref, animated: true, completion: nil)
    }

}

flutter側

iOS側に書いたmethodを呼び出すだけなので省略.

実際の動作

実際に使ってみると,レスポンスは遅いですが,辞書検索の結果が表示されることがわかります. iOSが検索窓などで提供してる辞書検索は一瞬で結果が出るのに,なぜアプリからだとこんなに遅いんだ

streamable.com

その他

内蔵辞書検索機能は,それだけを提供するような単純なアプリだとrejectになるとドキュメントや以下のブログにて言及されています

Apple Developer Documentation [iOS] 内蔵辞書機能を使うとリジェクトされる? | Cocoamix.jp

どの程度シンプルだとrejectになってしまうのかはわかりませんが,サブ機能程度にしておいた方が落ち込む危険性が低そうです

email & socialログインを実装する際のRDBのスキーマについて

はじめに

email & twitterなどのsocialアカウントでのログインの実装をしようと思ったのですが,各サービス用の認証情報のためのRDBスキーマをどう設計するかで詰まりました. 現状のベストプラクティスなどを探してみたのですが,あまり情報が見つからなかったので,自分がやった方法を備忘録としてまとめます. 一旦,emailとtwitterでの認証を用意するという前提で設計しました.

結果

いきなりなのですが,以下が最終的に決定したスキーマになります

f:id:sheep96:20200715224911p:plain

userテーブルが基本的なユーザ情報を格納するテーブルです.

認証情報は,サービスごとにuser_auth_serviceというuserのidを外部キーとして持つテーブルを作り,そこに入れるという感じです.

userがどの方法で認証を行うかはuserテーブルの中に保存しておきます.

メリットとしては以下があるのではと考えています

  • 新たな認証方法を追加しやすい
    • 新たな認証用のテーブルを追加するだけでよく,既存のテーブルに変更を加える必要がない(と思う)
  • ユーザの退会がしやすい
    • ユーザの退会の際にユーザ情報を消そうとすると外部キー制約に引っかかりますが,この方法ならその影響を受けずに認証に関わる部分を一発で消せます

一方で以下のデメリットがあるような気がします

  • 複数の認証情報を持つようなケースに対応しづらい
    • emailと電話番号両方というようなケースに対応する場合はuser_auth_multiとかのテーブルを作るかauth_methodを増やすとかになるんでしょうか...
  • userと認証情報をjoinして列挙したりしづらい
  • デッドロックしないように配慮が必要そう MySQL 外部キー制約のデッドロック | 優技録

検討したけど無理そうだった方法

サービスごとの認証情報を同じテーブルで持つ方法

php - Database structure for social login implementation? - Stack Overflow

認証情報を同じテーブルで持ち,providerというカラムでどのプロバイダ用のものかを判定する方法です

以下のような方法で微妙そうだなとなりました

  • EAVはアンチパターン
    • providerごとにキーの性質が違うときつい
  • providerごとのキーがバッティングしない可能性がゼロではない
  • ユーザがどの方法で認証するかを判定するためにレコードを走査する必要がある

userテーブルにサービスごとのカラムを付け足す方法

空白箇所が増えるなど無駄が多そうなのでやめました

サービスごとにユーザのテーブルを作る方法

外部キー制約をかけるのが辛かったりユーザの列挙が辛かったりその他様々な理由でダメそうでした

最後に

今は良さそうと思っていても,実装するうちに致命的な欠点などが見つかりそうで怖いです

また,サービスのアーキテクチャはよく公開されているのを見かけるのですが,長く運用されているDBのスキーマの変遷の歴史や,ベストプラクティスはあまり見ないので,とても気になるなぁ〜と思いました

「白い春」を見た

阿部寛さん主演,尾崎将也さん脚本の「白い春」を見たので感想を書きます.

概要

2009年に放送された阿部寛さん主演のドラマです.脚本は「結婚できない男」でも知られる尾崎将也さんです.彼女の病気を治す金を得るために止むなく殺人を犯した元ヤクザの男が,刑期を終え出所します.しかし,元気にいきているはずであった彼女は亡くなっていることがわかりました.納得がいかない主人公が公園でうなだれていると,絵を描く女の子に話しかけられ...というのが始まりです.家族愛を描いた感動ドラマでした.

なぜ見たか

2chtrickスレとかを見ていた際に阿部寛主演のおすすめドラマとして挙げられていたからだったと思います.丁度amazon primeにも入っていました.普段はほとんどドラマなどは見ないのですが,ふと1話目を見たら,すごく引き込まれてしまい.そのまま2,3日で全部を見終えてしまいました.その辺の映画のようなあまりに壮大な家族愛でなく,身近で,血と汗の通った,輝かしいだけでない家族の愛が描かれていたような気がします.

最初の印象

阿部寛さん主演のドラマというと「trick」や「結婚できない男」などコメディ色の強いものが多いイメージだったので,コメディ色強めの家族ドラマなのかなと思っていました.しかし,登場した阿部寛演じる主人公の顔があまりにドス黒く,見た瞬間にこれはマジなやつだなと感じました.遠藤憲一演じるパン屋も,幸せ満点という感じでなく,キツイ仕事を続ける中で得られるお客さんの幸せや家族の生活に,(ヤクザの主人公に比べ)小市民ながらプライドを持っているという感じがすごくリアルでした.

内容の感想

人生で見たドラマや映画の中でも,1,2を争うくらい面白かったです.2話の最後にパンをかじるシーンや,最終回の主人公が女の子に父親のすごさを語るシーンでは,ボロボロ泣きました.単なる家族愛ドラマでなく,色々なものを失い,帰る場所もない主人公の寂しさ,子供を守る父親の強さとその裏の不安など,泥臭い感情を注ぎ込んでくるような作品でした.見ていると両親の仕事で疲れた姿や,町の店の店員さんのささやかな笑顔とか,そういった日常の裏側を思わされ,そこでも涙が出ました.あり触れた日常がどれだけの努力の上になりたっているのかを考えさせられます.何回も見直し,シーン一つ一つを噛み締めたくなる作品でした.

色んなソース上で大きいサイズのテストデータを作る

はじめに

性能試験を行いたいとき,100GBを超えるようなデータをS3のようなストレージだったり,MysqlのようなRDBなどの上に用意したいことがあると思います.しかし,単純にやろうとすると以下のような問題に直面します.

  • ローカルで100GBのデータなんか作れない!!
  • 作れても転送に時間かかりすぎ!!
  • 101, 102GBみたいに刻んで作る必要があったりすると,もう無理!!

ということで今回はGCS,MySQL,Bigquery上に色んな大きいサイズのデータを作成することを行なったので,備忘録として書いてみようと思います.

方法

基本的に小さいデータを作って転送してから,それをコピーしまくる方針で行う

GCS

主に以下の手順で行います.

  1. 1GBぐらいのサイズのデータをローカルで作る
  2. gsutilを使ってGCS上にアップロードする.
  3. gsutilコマンドを使って,必要なデ. ータサイズ分コピーを繰り返す.

aws S3などの場合でも,awsコマンドで同じようなことができると思われる.

MySql

  1. 1GBぐらいのサイズのCSVデータ(test_1GB.csv)をローカルで作る
  2. MySql上にtest_1GBという名前で,先ほどのCSVを入れるためのテーブルを作る
  3. mysqlimportを使って,先ほど作ったCSVをテーブルに入れる(mysqlimportコマンドで転送する対象のテーブル名はcsvのファイル名と同じでなくてはならないよう?)
  4. 以下のようなクエリを必要なデータサイズ分叩く
DROP TABLE IF EXISTS testdata_NGB;
CREATE TABLE testdata_NGB;
# 以下を繰り返し
INSERT INTO testdata_NGB SELECT * FROM test_1GB;

Bigquery

  1. 1GBぐらいのサイズのCSVデータ(test_1GB.csv)をローカルで作る
  2. 作ったCSVを入れるようのbigquery schemaをjsonで定義する
  3. bq loadコマンドでCSVをもとにテーブルを作成する(スキーマのauto detectも可能) bq --location=$LOCATION load \ --replace \ --source_format=CSV \ --skip_leading_rows=1 \ $PROJECT_ID:$DATASET."test_1GB" \ ../test_1GB.csv \ ./schema.json
  4. bq cpコマンドを必要なデータサイズ分繰り返す bq --location=$LOCATION cp \ --append_table \ $PROJECT_ID:$DATASET."test_1GB" \ $PROJECT_ID:$DATASET."test_${DATA_SIZE}GB"

重松清さんの「流星ワゴン」を読んだ

重松清さんの「流星ワゴン」を読んだので感想を書きます.

概要

ドラマ化もされた重松清さんの代表作だと思われます.家庭や仕事,全てが崩れかけになり自殺を考えていた主人公の前に過去へと向かうワゴンが現れるという内容です.ビタミンFに代表される,家族の現実,温かみなどを感じさせてくれる小説でした.いつもは心をどん底に落としてくるようなものを読んでいますが,たまにはこういうものもいいです.3週間ぐらいかけてちびちびと読みました.

なぜ読んだか

いつも読む小説の多くは突出した悲劇が書かれていました.そういうものは自分の心をどん底に突き落としてくれますが,やはり自分の生活とはかけ離れているので,日々の行動にポジティブな影響を与えるかというとなんとも言えません.最近,生きるうえで起こる悩みをどう捉えるか,どう捉えていくかについて考えていて,その中で,自分が社会を生きていく中で遭遇するような悩みをちゃんと受け止められるかというのが気になりました.流星ワゴンで書かれているのはまさに血の通った悩みの数々であり,そういうものを体験してみたかったのが大きな理由かもしれません.あと,流星の絆を読んでみようと思って探してたらこれを見つけたというのもあります.

最初の印象

私はファンタジーとかがあまり好きなタイプの人間ではないので,タイムスリップと書かれているあらすじを読んで,うーん,これはちゃんと生々しい部分を感じれるようなもんなのかなぁ〜,魔法でごまかしたりしないかなぁと思っていました.よくわからない超常現象に人間の心がグラグラ動かされるというのは,感情移入がしにくいです.この小説はそことは反対だったので,とてもよかったです.

内容の感想

人間関係における不器用で伝わりきらない部分,でもそこを生きてるからこそ感じられる希望みたいなのを自分も体験できたような気がします.人間どうしようもない部分がたくさんあって,それで人とすれ違ったりもするけど,ちゃんと繋がってる部分はあるよと教えてくれるようでした.タイムスリップというファンタジーな要素も,周りの人間の不器用さの裏側の思いを知るための舞台装置としてうってつけなように思えました.本人にしかわからない葛藤を考えず,表面に出てくる結果だけを見てしまうよくないコミュニケーションが発生することは多々ありそうです.そこを広く受け止められる心を持って,また,他人の裏の温かみを見落とさないように生きていこうと思います.ドラマは最後ファンタジーパワーで全部解決するらしいですが,やっぱどうにもならない日常に希望を見出して生きてくというほうが,私は好きです.

Multi-Modal Learningのサーベイ論文を読んだ

 

マルチモーダル学習についてのサーベイ論文を読んだので,見返しようにまとめてみたいと思います.

論文情報

Multimodal Machine Learning: A Survey and Taxonomy

Introduction

マルチモーダル学習の分野はそのタスクに寄って大まかに5つのカテゴリに分けられる.

Representation

マルチモーダルなデータをどう表現したり要約したりするかについて.テキスト情報や信号データなどを同一空間で扱えるかなど.

Translation

あるモダリティのデータを別のモダリティのデータに変換するタスク.画像からその説明文を生成するなど.正解が1つに絞られない,

Alignment

複数のモダリティ間の直接的な関係を明らかにするタスク.

料理を作るビデオを例とすると,その各シーンを正確に並び替えるには料理のレシピの情報と画像中の情報を結びつける必要がある.

Fusion

ある予測をするために複数のモダリティの情報を利用するもの.例として,スピーチの内容を正確に判定するために,音声に加えて動画中の話者の口の動きを使うなど.

Co-learning

あるモダリティ内で作られた予測モデル,ベクトル表現などを別のモダリティに転移させるようなもの.Zero-shot learningやco-training,conceptual groundingなどが例としてあげられる.あるモダリティ上で得られた知識が別のモダリティでどう活かされるかに興味が置かれる.

応用先

  • 唇の動きと音声を利用したスピーチ認識(Audio Visual Speech Recognition:AVSR).信号がノイジーな場合などに有効.
  • マルチメディアのインデクシングと検索.画像や音声をキーワードベースでなく直接画像などで検索する.
  • マルチモーダルデータを用いて人間の振る舞いを理解する.ビデオや発言からの感情認識など.
  • 言語と画像を対象としたもの.画像のキャプショニングなど.画像キャプショニングでは評価方法が一番の課題らしい.

Representation

Representationは大まかにJointとCoordinateの2つの種類に分けられる.

f:id:sheep96:20190329230313p:plain

Joint Representation

 {\bf x}_m = f({\bf x}_1,...,{\bf x}_n)

射影fとしてはDNNやボルツマンマシンなどが使われる.各モダリティの特徴表現(BoW,メル周波数ケプストラム係数など)への依存がある.

  • 一番シンプルな方法は,書くモダリティの特徴量をconcatinateするというもの.
  • 近年はニューラルネットやオートエンコーダを使うものが多い.事前学習が可能な点が有用だが,データが大量に必要だったり欠損データへの対応が難しい.
  • その問題に対応するためにDeep Boltz Machineが利用されたりする.DBMのような生成可能なモデルを使うことで一部モダリティの欠損に対応することができる.
  • シーケンス長が一定でないデータに対してはRNNなどの時系列モデルが用いられる.

Coordinate

 f({\bf x}_1) \sim g({\bf x}_2)

各モダリティに,共有空間へ射影するための関数を用意するタイプ.関数はモダリティ間で異なるが,射影後の空間は共有される.

  • Smilality models:モダリティ間の特徴ベクトルの距離を最小化するようなモデルを設計する.Web Scale Annotation by Image Embedding: WASABIEなどが有名なタスク.従来はモダリティ間の関係を表すラベルを元に射影行列を設計することなどがされていたが近年ではNNが用いられる.DeViSEなどはEnd-to-EndでWASABIEを行う.
  • Structured coordinate space: 距離以外の制約を加えてモデルを設計する.Cross-modal Hashingなどがある.

 

Translation

Translationは大まかにexample-basedとgenerativeの2つに分けられる.

Example-based

基本的に辞書データをベースにtranslationを行う.

Retrieval based modal

辞書データから最も近いデータを持ってくるというもの.モダリティの中で近いデータの検索を行うものと,共有空間内で近傍データを検索するものに別れる.テキストをスピーチに変換するタスクや画像のキャプション付などに用いられた.semantic空間を用いた検索は双方向の翻訳が容易などの利点があるが,その空間の設計のために辞書データ(学習データ)が大量に必要となるなどの問題がある.

Combination-based Model

検索ベースだが,その検索のクエリとして複数のモダリティのデータを結合したものを用いる.多くがhand-crafted特徴を用いている.

Generative-approaches

与えられたデータをもとに別モダリティのデータを生成するアプローチ.
ソースとターゲット両方のモダリティの性質を理解する必要があり難しい.

Grammar-based Model

事前にある程度Translationの規則(Grammar)を決めておくもの.

画像やビデオより物体や動作などの高レベルの概念を取得し,それをもとにTranslationを行うような感じ.

Encoder-decoder Model

ニューラルネットを用いたE2Eな手法.一度データを何らかのベクトルに落としてから別モダリティのデータへデコードする.機械翻訳のためのモデルがそのまま画像のキャプショニングに用いられたりしている.

Continuous generation Model

テキストから信号への変換のように,連続的なデータをオンラインに,タイムスタンプごとに変換していくタスク.graphicalモデル,continuous encoder-decoderモデルなどが用いられる.

Model evaluation and discussion

Translationの評価は難しい.現状人を集めて評価を行ってもらったり,別モダリティのデータのペアを互いにtranslateしあう,検索システムを使うなどの方法が取られている.

 

Alighment

異なるモダリティのデータの一部が与えられたとして,それらのなかで関連する部分を探すようなタスクと本論文では定義している.例えば画像とそれに対するキャプションが与えられ,画像中のキャプションに関連する箇所を特定するなど.

大まかにimplicitとexplicitに分割する.

Explicit alignment

あるインスタンスについてそのサブコンポーネントが2つ以上ある場合のalighnmentをここにカテゴライズする.

Explicit alighnmentにおいては類似度のはかり方が重要となる.学習ベースで類似度指標を設計する手法はUnsupervisedとsupervisedに分けられる.

Unsupervisedの多くは統計的機械翻訳の手法やgenome sequenceなどの手法からインスパイアされたもである.代表としてはDynamic time warping (DTW)などがある.

Supervisedの手法としては,CCAや混合ガウスモデルを用いるものなどが提案されてきたが,近年ではDeepLearning手法が台頭している.

Implicit alignment

explicitと違い,implicit alighnmentは他のタスクで利用するための潜在表現として利用される.これはVQAや機械翻訳などの厳密なalighnmentがないタスクに対する手法のパフォーマンスの向上に利用できる.手法は大まかにGraphical modelとNeural Networkに分けられる.

Graphical modelは機械翻訳やspeech phenemesのalignmentに利用されてきた.しかしそれらは人手での単語間のマッピングなどを必要とする.

Neural Networkは近年よく用いられており,encoder-decoderモデルはそれら従来の機械翻訳の問題に対応できる.しかし,implicit alignmentを利用しない場合,encoderへの要求が大きくなってしまう(うまく文書全体,画像全体を潜在表現に落とし込むことが求められる).この問題に解決する手法としてはattentionが有名である.

Discussion

Multimodal Aligmentの難しさとしては,1.厳密にaligmentがアノテーションされたデータセットが少ない,2.モダリティ間の類似度指標を定義するのが難しい,3.モダリティ間のデータに一対一の関係が成り立たない,などがある.

 

Fusion

fusionは,複数モダリティのデータを用いて予測を行うような分野である.マルチモーダル学習の中で最も歴史が長いものの一つ.

メリットとしては,複数モダリティのデータを用いることでよりロバストな予測を行うことができる,どこかのモダリティのデータが欠けていても予測ができる,などがある.

応用分野はAudio Visual Speech Recognition (AVSR),感情認識,医用画像解析,マルチメディアイベント検知など幅広い.

ここではFusionをmodel-agnostic,model-basedに分類する.

 

Model-agnostic approaches

model-agnosticは機械学習の手法と直接関係しないようなアプローチである(特徴量の組み合わせ方など).

歴史的にはこちらの方がより多く取り組まれてきた.大まかにearly, late, hybridに分けられる.

earlyは各モダリティの特徴量をそのままconcatしたりするというものが多い.各モダリティのlow levelでの関係を学習できる,基本的にモデルが一つしか必要ないなどの利点がある.

lateでは各モダリティの特徴を元にそれの平均をとる,結果のvotingを行う,分散やchannel noiseを元に重み付けをする,モデルを学習するなどの手法がとられた.これらの手法には各モダリティで別のモデルを利用し異なるアウトプットを得ることで,それらを柔軟に組み合わせられるという利点がある.また,どれかのモダリティのデータが欠けていても訓練や予測ができる.しかし,モダリティ間のlow levelでの関係を捉えられているとは言えない.

hybridではその両方を組み合わせており,話者特定やmultimediaイベント検出で成果をあげている.

 

Model-based approaches

単一モダリティに対して利用される機械学習手法を複数モダリティ用に拡張する.

Multiple kernel learning (MKL) はカーネルSVMを拡張したものである.モダリティごとに別々のカーネルを利用する.MKLベースの手法は様々な応用ができ,また,損失関数がconvexなのでスタンダードな最適化パッケージを利用できる.分類,回帰の両方に対応できるという利点もある.デメリットとしてはトレーニングデータへの依存の高さ,テスト時の推論の遅さ,メモリの使用料などがあげられる.

Graphical Modelsによる手法は大まかに,同時確率をモデリングするgenerativeと条件付き確率をモデリングするdiscriminativeに分けられる.初期ではcoupled and hidden Markov modelとdynamic Bayesian networkを組み合わせるgenerativeモデルが提案された.

Graphical Modelの利点として,データの局所的,一時的な構造を捉えるのが容易であるという部分がある.また,専門家の知見をモデルに組み込み,解釈可能なモデルを設計することができる. 

ニューラルネットは近年よく利用される.主な応用例としては,image captioning,audio-visual emotion classificationにCNN,RNNを用いるケースがあげられる.ニューラルネットの優位な点として,大規模なデータを有効に利用できるという点,RNN系列の手法がマルチモーダルでの表現学習とfusionの両方に利用できるという点がある.また,他に劣る点としては,結果の解釈性が低く,多くのデータセットが必要になるということがある.

全体として,現状,ニューラルネット系列の手法が多く利用されるが,以前graphical modelとmultiple kernelも利用される.現状の課題点として,1) 信号が稠密なのに対して,重要なイベントがスパースである,2) データの全体でなく,一部を利用するようなモデルを設計するのが難しい,3) モダリティごとに違うタイプのノイズが違うタイミングで現れてくる,などがある.

Co-learning

co-learningはあるモダリティにおいてモデルを設計する際,(データが豊富にあるような)別のモダリティのデータを利用するというものである.co-learningにおいては,訓練時のみに別モダリティのデータを利用し,テストの際には利用しない.co-learningはそれが訓練時に利用するデータのリソースに応じて,parallel,non-parallel,hybridに分けられる.

f:id:sheep96:20190921002825p:plain

Parallel data

parallel dataは,あるモダリティのデータと別モダリティのデータが完全にリンクしているようなケースである.例として,映像とその音声の組み合わせがあげられる.このケースにおいては,それぞれのモダリティにおいてモデルの性能の向上が期待できる.

Co-trainingはマルチモーダルなタスクに置いて少量しか訓練データが存在しない際に,ラベル付きのデータを生成するような処理である.例として,ラベルなしデータに対応するラベルありデータを別モダリティから取り出すために,弱学習機を各モダリティのために設置するなどが行われる.
このようにCo-trainingは学習データの増加に利用できるが,モデルのオーバーフィットなどが課題になる.

 
また,転移学習もparallelデータに大してco-learningを行う方法の一つである.
multi-modal Boltzmann machineやmulti-modal auto-encoderはあるモダリティの情報を別モダリティに転移させるのに利用される.これはマルチモーダルな表現の学習だけでなく,単一モダリティの表現力の向上も行うことができる.具体例として,スピーチ情報をリップリーディングに組み合わせ訓練を行いつつ,テストを行う際にはスピーチ情報を必要とせずリップリーディングの性能を向上させた研究が行われている.

Non-Parallel data

non-parallel dataは,モダリティ間でインスタンスが共有されていないが,カテゴリやコンセプトは共有されているようなケースである.このケースで利用される手法は,表現学習の際によりセマンティックな情報を取り込ませたり,未知オブジェクトへの対応などに利用できる.

転移学習はデータがnon-parallelな状況に対しても適用できる.転移学習によって,よりデータが多く綺麗なモダリティから良い表現を得るといったことが可能になる.代表として,タグの学習済みエンベディングを画像分類モデルの訓練に組み合わせるというものがある.このように訓練されたモデルは,たとえ分類が間違っていたとしても,元のカテゴリに近いクラスと判定したりと,エラーに関しても多くの情報量を含んでいる.

Conceptual groundingは言語上の意味情報だけでなく,視覚や音声など他のモダリティの追加情報を意味づけに利用するようなケースである.人間の知識は様々な知覚情報に大きく依存しているため,言語情報のみで意味づけを行うのは最適とは言えない.
初期の研究としては,各モダリティ間で共通の潜在表現を獲得するもの(Parallelなデータに対して),各モダリティそれぞれで表現学習を行なったのちそれを組み合わせる(Non-Parallelなデータに対して) などが行われていた.一度マルチモーダルな表現が得られれば,それはピュアなNLPタスクに利用できる.使用の一例として,それらの表現をメタファーやリテラル言語の分類に利用する研究が行われている.これらの表現はデータが意味的にどの程度似ているかを測る際などに有用である.
Conceptual groundingによって様々なタスクのパフォーマンス向上が期待できるが,groundingがタスクに関係ないようなケースでは,逆にモデルの性能を劣化させてしまうこともある(見た目が似ているような概念を結びつけるタスクなど).

Zero-shot Learning (ZSL)は見たことのないコンセプトを持つデータをモデルに知覚させるようなタスクである.例えば,猫という概念を猫とラベルがついたデータなしにモデルに認識させることを目標とする.これは画像認識など,ラベルを与えなければならないデータが際限なく存在するようなタスクで重要となる.

ZSLには大まかにunimodalとmultimodalの二つのタイプがある.unimodal ZSLでは,対象のパーツや特性を元に認識を行う.例として,音素を元に聞いたことのない単語認識したり,画像中の物体のパーツの一部から判定するといったものが存在する.multimodal ZSLでは,他のモダリティの情報を利用して本来のモダリティの認識を行う.multimodal ZSLは,Non-Parallelなデータに適用する際,適用するモダリティごとにオーバーラップしているクラスが多くの場合で異なってしまうという問題がある.
ZSLの例として,画像特徴を単語の意味空間に埋め込む研究が行われた.これによって,unseenなオブジェクトは視覚的に類似している単語に割り当てが行われる.他にも画像とコンセプトが協調しているような空間を設計する研究,いくつかの画像から人の想像している単語を予測する研究などが行われてきた.

Hybrid Data

Hybridのケースは,non-Parallelな2つのモダリティを,共有されている1つのモダリティによって橋渡しするようなものである.有名な手法として,Bridge Correlational Neural Networkというものがある.適用先として例えば多言語での画像キャプショニングがあり,その場合は画像が複数言語の間で共有される情報となる.この手法は別言語への翻訳を行う際,常に対応するコーパスが存在しないような場合に利用される.

 Co-Learningはfusion,translation,alignmentなど様々なタスクに適用でき,実際,画像認識,動作認識,ASVRなど様々な箇所に応用されている.

 

長くてめちゃめちゃ雑になってしまいました...