論文まとめ：Gated Recurrent Convolutional Neural Network for OCR

#はじめに
NIPS2017から、J. Wang らの Gated Recurrent Convolutional Neural Network for OCR をまとめてみた。

NIPS2017の論文ページはこちら。
http://papers.nips.cc/paper/6637-gated-recurrent-convolution-neural-network-for-ocr

著者らのコードはこちら。
https://github.com/Jianfeng1991/GRCNN-for-OCR

#概要
-  OCRタスクのモデル
-  RCNN(recurrent convolutional neural network)に gate を加えた GRCNN(Gated RCNN)を用いた
-  この gate はRCL(recurrent convolution layer)における context modulation を制御し、feed-forwardな情報とrecurrentな情報とを調整する。
-  シーケンス・モデルとしてはBLSTM(Bidirectional LSTM)を用いる
-  このGRCNN＋BLSTMなモデルで既存の性能を上回った

# GRCNNの中身
### RCNN
RCNNはこちらの論文
M. Liang, et. al 'Recurrent Convolutional Neural Network for Object Recognition'
https://www.cv-foundation.org/openaccess/content_cvpr_2015/papers/Liang_Recurrent_Convolutional_Neural_2015_CVPR_paper.pdf
などで発表された仕組みで、RecurrentにConvolutionを組み合わせたもの。

前の層からの出力を $u(t)$、前の時刻の隠れ層からの出力を $x(t-1)$ とすると一般的なRNNは

```math
x(t) = \mathcal{F} (u(t), x(t-1), \theta )
```

ここで $\mathcal{F}$ はReLUなどの非線形な活性化関数、$\theta $ はパラメータ。RCNNの場合は

```math
x(t) = \mathcal{F} ((w^f \ast u(t), w^r \ast x(t-1))
``` 

となる。ここで $\ast$ は convolution。重みがフィルタになって convolution するだけ。

### GRCNN
T=2の時の gated recurrent convolution layer の模式図は以下。

<img width="434" alt="スクリーンショット 2018-02-12 23.47.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/e20fb99a-740b-b6b8-8de4-f355aa70cf9c.png">

右側の gate な部分がなければ通常の RCNN。

この gate の部分は

```math
G(t) = \begin{cases}
    0 & t=0 \\
    sigmoid(BN(w^f_g \ast u(t)) + BN(w^r_g \ast x(t-1))) & t>0
  \end{cases}
```

となっていて、LSTMの gate に似ている。BN は batch normalizationで、これが特徴的。

```math
G(t) = \begin{cases}
    ReLU(BN(w^f \ast u(t)) & t=0 \\
    ReLU(BN(w^f \ast u(t)) + BN(BN(w^r \ast x(t-1))\odot G(t))) & t>0
  \end{cases}
```

$\odot$ はHadamard積。イメージとしてはLSTMのhidden unitに対するgateだけがある形に似ている。ただ、決定的に違うのは、conv-LSTMは動画などのシーケンシャルなフレームを１つずつ１時刻に入力するが、このこの仕組みは１つの画像をそれぞれのタイムステップそれぞれに入力する。

また注意点としては、Batch normalizationのパラメータを別の時刻と共有しないこと。

#アーキテクチャ全体
アーキテクチャの全体図。

<img width="844" alt="スクリーンショット 2018-02-13 0.21.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/83253529-4ca1-8d69-5b28-f110890a31fc.png">

まとめると以下の３ステップ。
1. Feature Sequence Extraction
2. Sequence Modeling
3. Transcription

### Feature Sequence Extraction
ここではGRCNNを使う。入力と同じ画像を出力させ、これを左から右にスライスする。GRCNNは以下のようにGRCLユニットとpooling、convの組み合わせ。

<img width="833" alt="スクリーンショット 2018-02-13 0.28.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/84efc5e8-ab26-d3e4-4d9e-56e5a07a1dcd.png">

### Sequence Modeling
ここではbidirectionalなLSTMを用いる。

<img width="460" alt="スクリーンショット 2018-02-13 0.36.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/f8d4fd0a-74cc-df1c-422b-97fdb725105c.png">

peepholeに対してかける $\gamma_i$ は indication factor になっていて０、１をとる。これは peephole の効果を検証するため。

###Transcription
ここでは言語モデルにありがちなCTC（connectionist Temporal Classification）を使う。

#実験と結果
### GRCNNの効果

<img width="393" alt="スクリーンショット 2018-02-13 1.01.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/f94af8dc-c98e-d034-4f4c-2d88cdb5634a.png">

RCNNよりもGRCNNの方が性能いいし、GRCNNの中でもよりiterationが多い方が性能がいい。

### LSTM の中のpeephole効果

<img width="468" alt="スクリーンショット 2018-02-13 1.01.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/63d8f22c-f66f-ae0f-f83f-b6d9b4d5a4b9.png">

peepholeが無い方が性能がいい。

### 他のモデルとの比較

<img width="893" alt="スクリーンショット 2018-02-13 1.01.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/fc3caf12-7276-257f-21dd-a6f837121314.png">

おおよそ、本モデルが最も性能がいい。

下から２番目の ResNet-BLSTM は、本モデルの GRCNN を ResNetの２０層に置き換えたもの。これよりも GRCNN を用いた方が性能がいい。

ちなみにいい勝負をしている Baoguang et al はこちら。
http://ieeexplore.ieee.org/document/7801919/
arXivには2015ヴァージョンの論文が載ってる。
https://arxiv.org/abs/1507.05717

### 読み取れた例と失敗した例
以下の左が読み取りに成功した例、右が失敗した例。

<img width="800" alt="スクリーンショット 2018-02-13 1.16.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/116706/cb636af7-8226-3292-35a6-c8c632a1a8e6.png">

ARMADA の例みたいに AとRがくっついていると、うまく読み取れない。

Bloom の前の記号を O と読み取ったところは面白い。