【論文読解】Convolutional Character Networks

# 概要

End-to-Endのシーンテキスト検出手法であるCharNetを提案している論文を読んだので紹介します。

特徴として、それまでのシーンテキスト検出手法が「テキスト領域検出→テキスト認識」という2段階の流れを行っていたのに対し、本手法は1段階でテキスト領域検出、文字検出、文字認識をパラレルに行います。これは、物体検出手法における2-stage手法と1-stage手法の違いと同様です。

また、文字レベルでの検出も行えるということも特徴の一つです。以下の画像は、本手法の出力例ですが、拡大するとわかるかと思いますが、一文字ずつバウンディングボックスが描かれており、文字レベルでの検出が行えていることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4010/994a0f24-6715-d28c-ef8c-74064b765d3f.png)

本論文はCVPR2019採択論文です。

# 書誌情報

- Xing, Linjie, et al. "Convolutional character networks." Proceedings of the IEEE International Conference on Computer Vision. 2019.
- https://arxiv.org/abs/1910.07954
- [公式実装（PyTorch）](https://github.com/MalongTech/research-charnet)
    - 残念ながら、ごく一部の訓練済みモデルのみが公開されているにとどまり、訓練スクリプトも未整備。本文中でも示しますが、論文で述べられているものとの解離も大きいので、参考程度にすることを推奨します。

# ネットワーク構造
以下にCharNetのネットワーク構造の一例を示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4010/ada21fd6-01e3-7a36-2b6d-565482255239.png)

入力された画像から、黄色で描かれたバックボーンネットワーク（上図ではResidual Blockと2つのHourglass Module）と通じて入力画像の4分の1の解像度の特徴マップを得ます。この特徴マップは以降に続く2つのブランチの入力になります。

一つはCharacterブランチで、主に文字レベルの検出や認識を行います。もう一つは、Detectionブランチで、複数の文字からなるテキストインスタンスを検出します。テキストインスタンスは、単語や１行の文字列など、タスクによって様々な粒度があり得ます。また、テキストインスタンスの形状は単純な矩形の時もあれば、湾曲した多角形の時もあります。このようなテキストインスタンスの粒度や形状の特性に合わせて、Detectionブランチの構造は自由に選択できます。

以降、それぞれの部分について少し詳しくみていきます。

## Backbone Network
論文中では、ResNet-50ベースのバックボーンとHourglass Networkベースのバックボーンが検討されています。

実験結果を確認すると、どちらかが確実に優れているというわけではないようですが、Hourglassの大きいバージョンであるHourglass-88で最も良い精度が得られています。

### ResNet-50
ResNet-50ベースのバックボーンは、既存手法であるEAST[^east]にならい、ResNetの各ステージで得られる特徴マップを、段階別に結合しながらデコードするというU-Net風の構造を採用しています。
参考までに、EASTにおけるネットワーク構造を示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4010/0bfaff3e-7368-2945-0b55-bb6b7e0b65c3.png)

### Hourglass-57,88
Hourglass Networkは、もともと人の姿勢推定のために関節のようなキーポイントを検出するのに使用されている構造です。以下に、最初に提案された論文[^pose]にある図を示します。四角い箱によって表現されるResidualブロックが基本的な構成要素になっています。全体としては、これらのブロックによってダウンサンプルされた後アップサンプルされて、入出力が同じサイズの特徴マップになるように構成されています。また、各解像度でResidualな構造が入れ子状になるように構成されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4010/1ed29026-3aff-873b-1ec6-afad5bb2ad4e.png)


[^pose]: Newell, Alejandro, Kaiyu Yang, and Jia Deng. "Stacked hourglass networks for human pose estimation." European conference on computer vision. Springer, Cham, 2016.

Hourglass構造は単体でも機能しますが、2段以上重ねることでより良い性能が得られることが多いようです。複数段重ねる場合も、それ全体もResidualな構造になるようなスキップコネクションが使用されます。

本手法では、CornerNet[^cornernet]で使用されているHourglass-104をベースに、ダウン・アップサンプルの回数を減らしたバージョンとして、Hourglass-57とHourglass-88を提案しています。

[^cornernet]: Law, Hei, and Jia Deng. "Cornernet: Detecting objects as paired keypoints." Proceedings of the European Conference on Computer Vision (ECCV). 2018.

なお、姿勢推定やCornerNetでは、キーポイントの明確な教師データがあるため、複数段重ねられたHourglass構造の各段階で教師信号を与えることができ、効率的に訓練することができます。しかし、本手法ではそのようなキーポイントは想定されていないため、Hourglassの各段階での教師信号は与えることはできないという点を注意しましょう。

## Character Branch
Characterブランチは、文字単位の検出や認識のためのブランチで、さらに3つのサブブランチを持っています。

- 文字検出ブランチ：文字レベルの回転矩形領域を検出します。この回転矩形は、5つのパラメータ（top, bottom, left, right , orientation）によって表現されます。これら5つのパラメータに対応するチャネルを持つ、入力特徴マップと同一のサイズの出力が得られます。
- 文字認識ブランチ：文字の認識を行います。文字数分のクラスがある多クラス分類になっています。こちらも、入力特徴マップと同一のサイズの出力が得られます。
- テキストインスタンスセグメンテーション：テキストインスタンスのセグメンテーションを担当する。出力は入力特徴マップと同じサイズで2チャネル（text/non-text）となります。

文字検出ブランチについて、損失関数をもう少し詳細にみていきましょう。文字検出ブランチは既存手法のEAST[^east]に大きく依存しているので、そちらの論文をみていきましょう。

まず、top,bottom,left,rightの4つのパラメータに対する訓練方法についてみていきます。真の文字領域（回転矩形）をx軸とy軸に合わせるよう回転させた矩形領域$\mathbf{R}^{*}$と、推定された4つのパラメータを元に算出された矩形領域$\hat{ \mathbf{R}}$とを比較して、IoU損失が計算されます。

```math
L_{\mathrm{AABB}}=-\log \operatorname{IoU}\left(\hat{\mathbf{R}}, \mathbf{R}^{*}\right)=-\log \frac{\left|\hat{\mathbf{R}} \cap \mathbf{R}^{*}\right|}{\left|\hat{\mathbf{R}} \cup \mathbf{R}^{*}\right|}
```

一方で、回転角度に関する損失は以下のように算出されます。

```math
L_{\theta}\left(\hat{\theta}, \theta^{*}\right)=1-\cos \left(\hat{\theta}-\theta^{*}\right)
```

これらの損失を組み合わせて、全体の損失は以下のように表されます。

```math
L_{\mathrm{g}}=L_{\mathrm{AABB}}+\lambda_{\theta} L_{\theta}
```
　
[^east]: Zhou, Xinyu, et al. "East: an efficient and accurate scene text detector." Proceedings of the IEEE conference on Computer Vision and Pattern Recognition. 2017.

最後に、公式実装として公開されているバージョンでは、ここで紹介した内容とは異なる実装になっていることを指摘しておきます。まず、テキストインスタンスセグメンテーションのためのブランチが、公式日曹には存在しません。その代わり、文字レベルのセグメンテーションらしきサブブランチが存在しています。Characterブランチに含まれていることを考慮すると、文字レベルのセグメンテーションの方が納得感があります。また、文字検出ブランチでは回転に関わるパラメータを推定しないことになっています。

## Detection Branch
Detectionブランチは、テキストインスタンス領域の検出のためのブランチです。テキストインスタンス領域は、回転矩形であることもあれば、多角形や湾曲した矩形である場合もあります。データセットによってこういった性質を持つテキストインスタンスが含まれていたり含まれていなかったりするので、データセットにあった手法を選択する必要があります。

本論文ではテキストインスタンス領域の検出のための手法として、2つの選択肢が示されています。

### Multi-Orientation Text
データセットに回転矩形しか含まれない場合は、このブランチには、テキストインスタンスのセグメンテーションと、IoU損失を用いたインスタンスレベルのボックス回帰のための2つのサブブランチが含まれます。

セグメンテーションはテキスト領域か否かを表す2チャンネルの出力になっており、ボックス回帰はCharacterブランチで説明したのと同様の5つのパラメータを推定するようになっています。いずれも入力された特徴マップと同じ解像度の出力です。

### Curved Text
テキストインスタンス領域が湾曲している場合は、既存手法であるTextfield[^Textfield]で提案された手法を採用しています。

湾曲したテキストインスタンスは、下図の(a),(b)に示すように、それらを囲む矩形領域（非回転・回転）で表現しようとすると、他のテキストインスタンスと大幅に重複する領域ができてしまい、その後の処理を考えると、大雑把すぎる表現形式となります。また、(c)のように任意の四角形による表現も、互いの四角形の重なりが大きく、十分な表現形式とは言えません。また、(d)のようなマスク画像を推定できるようにモデルを訓練したとしても、(e)のような推定結果となってしまい、2つのインスタンスが分離できません。

[^Textfield]: Xu, Yongchao, et al. "Textfield: Learning a deep direction field for irregular scene text detection." IEEE Transactions on Image Processing 28.11 (2019): 5566-5579.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4010/409c880e-2c13-88d9-6d77-0bed1d7bd793.png)

そこで、Textfieldでは、(f)のような表現を推定できるようにしています。これは、テキストインスタンス領域の境界から離れる方向を表す2次元ベクトルマップを可視化したものです。色は2次元ベクトルの角度を表現しています。テキストインスタンス同士の境界で色が真逆になっていたり、テキストインスタンスの中央のラインでも色が反転していたりすることから、ちょうどそのあたりでベクトルが逆になっているのだということがわかります。

以下の図では、上記のような推定を行えるモデルを訓練するためのターゲットの作り方が示されています。テキストインスタンス領域内の点$p$からみたときに最も近い境界の点$N_p$を探し、2つの点で表される単位２次元ベクトルを点$p$に格納する、という処理によって作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4010/00371689-fae4-55e3-ec49-7e553819fe43.png)

細かい説明は省略しますが、このような2次元ベクトルマップを推定できれば、後処理を施すことでテキストインスタンスを抽出することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4010/1bb03bda-7166-8880-fe64-aeeef7a0ae07.png)

# 後処理
以上のようなネットワークによって、文字レベルの検出・認識、テキストインスタンスレベルの検出が実現できます（論文では触れられいないようですが、もちろん回転矩形領域の検出後にはNMSを適用する必要があります）。

これらの結果を用いて、テキストインスタンスに何が書かれているのかを特定するために、各文字をテキストインスタンスに所属させるという後処理が必要です。とはいえ、本手法では極めて単純なルールを採用しており、単にテキストインスタンスの検出領域と少しでも重なっていれば、その文字領域をテキストインスタンスに含める、という処理を行っています。

# 訓練手順
CharNetの訓練のためには、文字レベルの検出のアノテーションつきデータセットが必要となります。しかし、多くの現実の写真を使ったシーンテキスト用データセットには、せいぜい単語レベルでのアノテーションしか施されていません。

そのため、本手法では、文字レベルのアノテーションが容易な合成データセットである程度訓練した後、それを用いて現実的なデータセットに対して擬似ラベルを生成し、それを使ってさらに訓練を行う、という方法を提案しています。擬似ラベルを付与して再訓練する、という流れは何度か繰り返されます。

とはいえ、なんでもかんでも擬似ラベルをつけるわけではなく、ある基準を満たすときに擬似ラベルとして採用することにしています。その基準とは、真のテキストインスタンス領域に含まれる文字数と、検出した文字数とが一致するときのみ採用する、というシンプルなものです。

このような擬似ラベルを使ってモデルを訓練していくと、徐々に適切な検出結果が得られるようになります。以下は、その過程を表しています。赤い矩形で囲まれている文字は、緑色で表されている真のテキストインスタンス領域に含まれる文字数が真の場合と一致している推定結果を表しており、青い矩形で囲まれている文字は、文字数が真の場合と一致していない推定結果を表しています。左から右になるにつれ、徐々に青い矩形が減り、赤い矩形が増えていくことがわかります。また、赤い矩形も正確に一つ一つの文字を囲めるようになっていくことがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4010/05ec074f-d2e0-d274-6dc8-1f5975ae3698.png)

ICDAR2015データセットを使った実験では、このような擬似ラベルを使いながら繰り返し訓練を行う手順の有無によって大幅に精度が変化することを示しています。合成データセットはどうしても非現実的な画像になってしまうことが多く、現実のシーンテキスト検出に生かすためには、なんらかのドメイン適応の工夫を行う必要がある、ということがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4010/8b088c30-44bb-8251-a963-a3892fed473b.png)


# まとめ
以上、簡単にですが、CharNetの論文を紹介しました。

既存の手法を上手に一つのネットワークに統合し、1ステージにまとめているのが良いと思います。また、Detectionブランチはいくつかの選択肢があり、もっと簡単なデータに対しては単純な手法で良さそうなので、本論文で触れられている以外の別の手法に変えてみるのも面白そうだなと思いました。