DBNetの簡易再現

       DBNet は、微分可能な二値化を使用したリアルタイム シーン テキスト検出であり、OCR テキスト検出に使用されます。この論文を解釈した記事はインターネット上にたくさんありますが、pytorch の使い方に慣れ、DBNet をより深く理解するために、暇な時間を使って偉い人のコードを参照して、簡単なバージョンを再現しました。 DBNetの。

        DBNet ネットワークの簡単なレビュー。

        ネットワーク構造:

図1 ネットワーク構成図

        バックボーンは resnet を使用し、その後 FPN を使用して、異なるサイズの特徴マップを連結し、最終的に 2 つの異なる出力ヘッドによって結果を提供します。

        革新:

        適応型二値化を追加すると、二値化のしきい値がネットワークによって学習されます。

        ラベルの生成:

        本稿では、ラベルの生成についてより簡潔に説明しています. ラベルはバイナリラベルと閾値ラベルに分けられます. ここでは例として使用したシミュレーションデータを取り上げます.

図2 シミュレーションデータの元画像

        バイナリ ラベルの生成は比較的簡単です。

        式 D=A(1-r2)/L のオフセットに従ってテキスト ボックスの輪郭を縮小します。ここで、L はラベル ボックスの周囲長、A はラベル ボックスの面積、r はラベル ボックスの面積です。プリセットのズーム率。論文では 0.4 です。

図3 シミュレーションデータ二値化ラベル(表示用、青塗り)

        閾値ラベルの生成

        1). 上記のオフセット D に従ってテキスト ボックスの輪郭を拡張します。

        2). 拡大した輪郭の外接四角形を取得します(高速な計算にはnumpyブロードキャストを使用すると便利です)

        3). 外接する四角形の各点からテキスト ボックスの元の輪郭の各線分までの距離を計算し、最小距離を取得します。

        4). 正規化のために求める最小距離をオフセット D で割ります。

        5). 1 で正規化した結果、0 未満の値は 0 になり、1 より大きい値は 1 になります。

        6). しきい値ラベルであるため、スケーリングする必要があります。論文では、1 は 0.7 にスケーリングされ、0 は 0.3 にスケーリングされています。

図 3 シミュレーション データのしきい値ラベル (表示のために、この図のしきい値はスケーリングされていません)

図4 シミュレーションデータの閾値ラベルと二値化ラベルの重ね合わせ

        損失関数:

        L = Ls + α×Lb + β×Lt、ここで、Ls は確率マップの損失、Lb はバイナリ マップの損失、Lt は閾値マップの損失です。本稿ではαとβの値をそれぞれ1.0と10とする。Ls と Lb はバイナリ クロス エントロピー (BCE) を使用して解決され、ハード ネガティブ マイニングが使用され、Lt は L1 損失を使用します。

        私の演出:

        Resnet50、FPN、DB_Head を最初から完全に構築したもので、構築されたコードは簡潔ではありませんが、ロジックは明確で、理解と変更が簡単です。偉い人のコードの損失関数は BalanceCrossEntropyLoss、DiceLoss、MaskL1Loss に変更されましたが、私のコードでは pytorch に付属の BCE と L1loss のみを使用しました。データの読み取り、ラベルの生成、ネットワーク構造、モデルのトレーニングと推測はすべて DBnet_pytorch.py​​ ファイルに配置されます。

https://github.com/yts2020/DBnet_pytorch

シミュレーション データセットでトレーニングした後、モデルの推論結果は次のようになります。

図5 モデルの予測結果

 

 

 

 

 

 

 

 

 

 

おすすめ

転載: blog.csdn.net/ytsaiztt/article/details/118090611