【論文読解】ContourNet: Taking a Further Step toward Accurate Arbitrary-shaped Scene Text Detection

# 概要

テキスト領域の検出手法ContourNetの論文を読んでみたので紹介します。本論文はCVPR2020採択論文です。

いわゆるシーンテキストと呼ばれるタイプのテキスト検出タスクに対する手法で、写真に映っている様々な形状のテキスト領域を検出できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4010/08388ea0-a0b5-860f-17b5-26141196a6f3.png)

論文中ではシーンテキストの検出タスクの難しさについて2つの点が述べられています。

1. テキスト領域は様々なスケール（大きさや縦横比）があり、既存の物体検出手法で対応できないことがある。
2. 背景領域に現れるテクスチャが文字の輪郭と紛らわしく、誤検出（False Positive）が多くなりがち。

これら2つの問題を解決するために、本論文では以下の2点を提案しています。

1. Region Proposal Network(RPN)を拡張したAdaptive-RPNを提案し、IoUベースの損失関数で直接IoUを最大化できるように訓練する。IoUはスケールに対して不変であるため、通常のRPNが採用しているスケール変化に敏感な$l_n \text{norm}$ベースの損失関数よりも効果的な訓練が可能になる。
2. 背景領域の文字に近いテクスチャを拾わないように、テキスト領域の輪郭線検出に使用するConv層を直行するカーネル（垂直方向と水平方向）を持つ2つのConv層に分離して検出したのち統合することで、誤検出を抑える。

以下、これらの要素を中心に詳しく見ていきます。

# 書誌情報
- https://arxiv.org/abs/2004.04940
- [公式実装（PyTorch）](https://github.com/wangyuxin87/ContourNet)

# 全体像
まずは全体像を確認しておきます。ContourNetはMask R-CNNをベースしており以下のような構成になっています。

- 特徴マップ抽出器（本手法ではFPN風の構造を採用）
- テキスト領域候補を推測するAdaprive-RPN
- テキスト領域候補ごとに適用される3つのヘッド
    - 領域候補の補正のためのBox回帰
    - 分類器（テキスト領域/非テキスト領域）
    - テキスト領域の輪郭線検出（Local Orthogonal Texture-aware Module）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4010/5497c594-cb5b-2a27-6777-9af12de9773b.png)

# Adaptive-RPN

Adaptive-RPNの話に入る前に、まずはRPNそのものについて整理しておきます。その後、提案手法であるAdaptive-RPNについてみていきます。

## RPNの問題点
通常のRPNでは、事前に設定されたアンカーごとに、領域候補か否かを分類する2次元ベクトルと、アンカーに対する領域補正のためのBox回帰4次元のベクトル$(\Delta x, \Delta y, \Delta w, \Delta h)$を推定します。

領域候補であるか否かは、アンカー領域と真の領域とのIoUが十分に大きい（例えば、0.5以上）の時に1、そうでないときに0というターゲットが定められます。また、Box回帰のための4次元ベクトルは、アンカー自体の位置と大きさ$\\{x_c, y_c, h_c, w_c\\}$を用いて、真の領域$B_{t}$と一致するように定められます。

$$
B_{t}= \left( x_c + w_c \Delta x, y_c+h_c \Delta y, w_c e^{\Delta w}, h_c e^{\Delta h} \right)
$$

損失関数については、分類はクラス間の不均衡を避けるために、例えば重み付きクロスエントロピー損失が用いられます。Box回帰のための4次元ベクトルは、多くの場合Soft-$l_1$損失が用いられます。

本論文では、通常のRPNではテキスト領域のスケールの多様性に対応できない、という問題提起をしています。この問題意識は、先行研究[^1]において示されているように、$l_1$を含む$l_n \text{norm}$損失の低下が、IoUの改善とあまり相関しないという観察から来ています。

[^1]: Rezatofighi, Hamid, et al. "Generalized intersection over union: A metric and a loss for bounding box regression." Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2019.

## Adaptive-RPNによるIoU損失

このような問題意識から、Box回帰の損失が最終的な目的であるIoUの改善に直接結びつくような改善を施すことを考えます。

Adaptive-RPNでは、Box回帰のために4次元のベクトルではなく、$2n$次元のベクトルを推定します。$n$はアンカーに事前に定義された$n$個の点を表し、$2n$次元のベクトルはこれら$n$個の点の補正のためのベクトルです。例えば、$n=9$の時は、Boxの中央、四隅、各辺の中央が事前に定義された9個の点となります。

このような$2n$次元のベクトルをもとに推定された$n$個の点を囲む最小の矩形領域が候補領域となります。最小の矩形領域は数式的にはminとmaxを用いて以下のように求められます。

```math
\begin{aligned} \operatorname{Proposal}=&\left\{x_{t l}, y_{t l}, x_{r b}, y_{r b}\right\} \\ =&\left\{\min \left\{x_{r}\right\}_{r=1}^{n}, \min \left\{y_{r}\right\}_{r=1}^{n}, \left\{x_{r}\right\}_{r=1}^{n}, \max \left\{y_{r}\right\}_{r=1}^{n}\right\} \end{aligned}
```

このようにして求められた候補領域と真の領域に関するIoUベースの損失関数を以下のように定めることができます。この損失関数によって直接的に候補領域と真の領域のIoUが大きくなるようにRPNを訓練できるようになります。

```math
L_{A r p n_{r e g}}=-\log \frac{\text {Intersection}+1}{\text {Union}+1}
```

# Local Orthogonal Texture-aware Module

Local Orthogonal Texture-aware Module(LOTM)は、RPNによって得られた領域候補を用いてRoiAlignによって抽出した特徴マップに対して適用されます。LOTMの目的は、テキスト領域の詳細な輪郭線を検出することです。実際に輪郭線全体を検出することは困難なので、輪郭線上の点を検出し、それらを囲む輪郭線を後処理（[Alpha Shapeアルゴリズム](https://en.wikipedia.org/wiki/Alpha_shape)）によって求めます。

しかし、特徴マップに対して単なる2次元Conv層を適用してテキスト領域の輪郭線を検出しようとすると、背景の紛らわしいテクスチャによって引き起こされる誤検出が多くなってしまいます。このような誤検出によって、大幅にテキスト領域の推定結果が外れてしまいます（下図上段）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4010/140c8a25-8e5c-5bfc-c757-4c123d4d6a81.png)

本手法では、特徴マップに適用する2次元Conv層を以下のように水平方向と垂直方向のConv層に分解し、それぞれで輪郭線を推定します。その後、NMSと閾値処理を施してANDを採る（下図のRe-scoreing）ことで、誤検出の影響を極力抑えた検出結果を得ることに成功しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4010/ab805019-5605-5fba-a9e2-0cf267ea7a80.png)

このような輪郭線検出の訓練には真の輪郭領域が必要になります。本論文で使用しているデータセットでは、テキスト領域に対するポリゴンが与えられているので、この輪郭線をターゲットとして訓練を行います。この訓練は非常に不均衡な2値分類問題なので、重み付きのbinary-coross enthoropyが損失関数となります。

```math
L_{c p}=-\frac{N_{n e g}}{N} y_{i} \log p_{i}-\frac{N_{p o s}}{N}\left(1-y_{i}\right) \log \left(1-p_{i}\right)
```

この損失関数は、水平方向のConv層によって得られる$Hmap$と垂直方向のConv層によって得られる$Vmap$の両方に適用されます。

# 損失関数
最終的な損失関数は、以下のようになります。

```math
\begin{aligned} L=& L_{A r p n_{c l s}}+\lambda_{A_{r e g}} L_{A r p n_{r e g}} \\ &+\lambda_{H c p} L_{H c p} +\lambda_{V c p} L_{V c p} \\ &+\lambda_{b o x_{c l s}} L_{b o x_{c l s}} +\lambda_{b o x_{r e g}} L_{b o x_{r e g}} \end{aligned}
```

- 1行目はAdaptive-RPNの損失（分類損失とIoUベースの損失）
- 2行目はContourの分類損失（HとVで個別に算出される輪郭線検出の損失）
- 3行目は通常のBox回帰損失と分類損失

3行目のBox回帰と分類損失はFaster R-CNNなどで採用されているような、よくある方法が適用されています。

# まとめ

以上、簡単にですがテキスト領域検出手法であるContourNetについて紹介しました。テキスト領域の検出手法については以前にも[CRAFTという手法の論文も読んでみました](https://qiita.com/takoroy/items/806378e142c0e05d00cc)が、それとはまた異なる方向性の手法で、シーンテキストタスクの奥深さを実感できました。