概要
エッジ検出のための深層学習モデルDexiNedを提案している論文を読んだので紹介してみます。
エッジ検出のような低レベルタスクを深層学習で行うのは、一見簡単そうに見えますが、意外にもなかなか複雑な難しさがあるようです。というのも、エッジ検出のための教師データは整備に非常に大きな労力がかかります。セグメンテーション用のデータセットから輪郭を抽出して教師データにすることもできますが、それはあくまで物体の輪郭や境界線であって、より低レベルなエッジの検出の教師データとして使用すると、輪郭や境界以外のより細かなエッジが検出しにくいモデルになってしまう、という問題が生じてます。
本論文では、エッジ検出のための新しいデータセットBIPEDを整備し、エッジ検出のための新しい深層学習モデルDexiNedを提案しています。エッジ検出は低レベルのタスクであるということもあり、本手法によって訓練されたエッジ検出器は、ファインチューニングなしで、様々な画像に対して適用することができるそうです。
書誌情報
- Poma, Xavier Soria, Edgar Riba, and Angel Sappa. "Dense extreme inception network: Towards a robust cnn model for edge detection." The IEEE Winter Conference on Applications of Computer Vision. 2020.
- https://arxiv.org/abs/1909.01955
- 公式実装(TensorFlow2/PyTorch)
BIPED
最初にデータセットについて確認しておきます。本論文で紹介されているデータセットBIPED (Barcelona Images for Perceptual Edge Detection)は、1280×720ピクセルの屋外写真250枚に対して、コンピュータビジョンの専門家の手によってアノテーションされています。何度かのクロスチェックを通じて、アノテーションミスを減らした高品質なデータセットになっています。
データセットは以下のページで公開されており、専用のgithubリポジトリには、データ拡張用のスクリプトが用意されています。
DexiNed
次に、DexiNedのアーキテクチャを確認します。
DexiNedは大きくいえば2つのモジュールからなっています。
1つ目は、灰色で囲まれた6つのブロックからなるDexi(Dense extreme inception network)です。Dexiは、Xeption Network1に着想を得た構造になっており、一番上の緑の1x1Conv層によってブロック間のスキップ接続が行われています。これは、下図に示すXeptionの構成に似ていますが、それ以外にも、6つのブロックの内外には、何やら様々なスキップコネクションが張り巡らされていることが確認できます。
2つ目は、Dexiの各ブロックが出力する特徴マップを元に、入力画像のサイズにまで拡大しつつエッジ画像を出力するUpsampling Blockです。また、これら6枚のエッジ画像は、結合され1x1Conv層を通すことで、Fused edge-mapと記載された最終的なエッジ画像を得るためにも使われます。
以下の図に示されているのは、入力画像、真のエッジ画像、Upsampling Blockの出力する6枚のエッジ画像、6枚を結合して得られるFusedエッジ画像、6枚の平均画像、となっています。細かいエッジまで抽出されているOutput1が、大域的な情報を考慮することで、不要なエッジが削除されてOutput6になる、という流れが確認できます。
Dexiブロック内のスキップ接続
Dexiを構成する6つの大きなブロックの中には、様々なスキップ接続が存在しています。なぜこのような複雑なスキップ接続が必要になるのかが、本手法の理解のキモと言えるでしょう。
エッジ検出タスクの目的は、入力されたRGB画像と同程度に高解像度のエッジ画像を出力することです。しかし、Conv層はいくつか重ねるたびに、エッジのような低レベルの特徴に関する情報を失ってしまいがちです。スキップ接続は、Conv層によって失われるエッジ情報をできるだけ保存するために必要、というわけです。
以下は、3つ目と4つ目のDexiブロックを拡大したものです。2つ目のDexiブロックの出力である特徴マップは、上からやってきているスキップ接続も加えられ、1x1Conv層によって位置を保ったまま加工され、3つ目のDexiブロック内のConvブロックの後にオレンジ色のブロックで示される平均化操作へと入力されます。4つ目のDexiブロックでも同様に、前のブロックの特徴マップはいくつかの加工を受けつつも、Convブロックの後段に注入されています。
そのほかに、各Dexiブロックの最後に適用されるMaxPoolの出力は、前のブロックの出力である特徴マップに対してstrideが2の1x1Conv層を適用したものと足し合わされます。
このように、特徴マップの位置を可能な限り保存するようなスキップ接続を執拗にいれることで、エッジに関する特徴をできるだけ失わないまま、特徴マップの解像度を下げつつも、エッジに関する本質的な特徴を捉えることに成功しています。
損失関数
最後に、損失関数について簡単に確認しておきましょう。エッジ検出は、ピクセルごとの2値分類タスクですが、エッジ領域と非エッジ領域では、圧倒的に後者の方が多いため、Imbalanceな分類タスクになっています。
そのため、損失関数は重み付きのクロスエントロピー損失が使われています。$Y^-, Y^+$はエッジ領域と非エッジ領域を表し、$\beta=\frac{|Y^-|}{|Y^+| + |Y^-|}$は損失に対する重み、とします。
損失は6つのエッジ画像と、Fusedエッジ画像の7枚ごとに計算され、最終的にはそれらが足し合わされます。$\delta^n$は、各エッジ画像ごとの重みですが、PyTorch版の公式実装を見る限り、すべて1で統一されているようです。
\begin{aligned}
l^{n}\left(W, w^{n}\right) &=-\beta \sum_{j \in Y^{+}} \log \sigma\left(y_{j}=1 \mid X ; W, w^{n}\right) \\
&-(1-\beta) \sum_{j \in Y^{-}} \log \sigma\left(y_{j}=0 \mid X ; W, w^{n}\right)
\end{aligned}
\mathcal{L}(W, w)=\sum_{n=1}^{N} \delta^{n} \times l^{n}\left(W, w^{n}\right)
まとめ
エッジ検出モデルであるDexiNedを提案している論文について簡単に紹介しました。Cannyエッジ検出器などよりも遥かに高精度なエッジ検出が実現できるため、様々な画像処理のパイプラインにおけるエッジ検出方法の一手段として、非常に役に立つのではないかと思います。
自分の環境では、RTX2060を4日ほど稼働させて、無事にエッジ検出モデルをつくることができました。やり方は、公式リポジトリに記載されているので興味のある方は参照してみてください。
-
Chollet, F.. “Xception: Deep Learning with Depthwise Separable Convolutions.” 2017 IEEE Conference on Computer Vision and Pattern Recognition (CVPR) (2017): 1800-1807. ↩