画像セグメンテーションのレビューのセマンティック セグメンテーション

ブロガーの研究方向は画像セグメンテーションなので、パノラマ セグメンテーションに関する論文を投稿しようと思います。パノラマ セグメンテーションの唯一の方法はセマンティック セグメンテーションとインスタンス セグメンテーションです。そこで、レビューと統合を容易にし、セマンティック セグメンテーションの方向性をマクロに把握するために、私が最近読んだトップ カンファレンスのセマンティック セグメンテーションに関連する優れた論文をまずリストします。

目次

1. 論文の概要

1.1 古典的なセグメンテーションアルゴリズム

1.1.1 FCN

1.1.2 Uネット

 1.1.3 セグネット

1.1.4 Deeplabシリーズ

 1.1.5 GCN (グローバル畳み込みネットワーク)

1.1.6 DAネット

1.1.7 スイングトランス

1.2 リアルタイムセグメンテーションアルゴリズム

1.2.1 Eネット

1.2.2 ビセネット

1.2.3 DFANet

1.3 RGB-D セグメンテーション

1.3.1 レッドネット

 1.3.2 RDFネット

 1.4 拡張読書

2. 共通データセット

2.1 PASCAL ビジュアルオブジェクトクラス(VOC)

2.2 PASCAL コンテキスト

2.3 Microsoft Common Objects in Context (MS COCO)

2.4 都市景観

2.5 ADE20K/MIT シーン解析(SceneParse150)

2.6 シフトフロー

2.7 スタンフォード大学の背景

2.8 バークレーセグメンテーションデータセット(BSD)

2.9 YouTube オブジェクト

2.10 キティ

3. 評価指標

3.1 混同行列

3.2 ピクセル精度 (PA)

3.3 カテゴリ平均ピクセル精度 (MPA)

 3.4 ユニオン上の交差 (IoU)

3.5 和集合上の平均積分 (MIoU)

3.6 周波数加重交差オーバーユニオン (FWIoU)

4. 損失関数

4.1 ログの損失

4.2 ダイスの損失

4.3 IOUの損失 

4.4 ロヴァシュ・ソフトマックス損失

4.5 焦点損失 

 5つの活性化関数

 5.1 シグモイド活性化関数

5.2 Tanh活性化関数

5.3 ReLU活性化関数

5.4 Leaky ReLU 活性化関数

5.5 パラメトリック ReLU 活性化関数


1. 論文の概要

 画像セグメンテーションは、各サブ領域内のピクセルが同様の特性を持つように、画像を複数のサブ領域に分割するプロセスです。画像セグメンテーションは、医療画像分析、目標追跡、自動運転などの分野で広く使用されているコンピュータビジョンの分野における基本的な問題です。セマンティック セグメンテーションは、画像内の各ピクセルを、オブジェクト インスタンスに関係なく、事前定義されたセマンティック カテゴリのセットに分割する特別な形式の画像セグメンテーションです。したがって、セマンティック セグメンテーションは、ピクセル レベルのオブジェクト検出やインスタンス セグメンテーションの問題ではなく、画像分類問題の一般化として見ることができます。セマンティック セグメンテーションは、自動運転、インテリジェント ビデオ監視、その他の分野など、多くのコンピューター ビジョン タスクの基礎となっています。セマンティック セグメンテーションは、コンピューターが画像内のさまざまな領域の意味を理解し、より正確な判断や意思決定を行うのに役立つからです。現在、深層学習で使用される畳み込みニューラル ネットワーク (CNN)、およびセマンティック セグメンテーションの特定の構造とアルゴリズムにより、セマンティック セグメンテーションの多くの分野で大きな進歩が可能になっています。

1.1 古典的なセグメンテーションアルゴリズム

1.1.1 FCN

论文:セマンティックセグメンテーションのための完全畳み込みネットワーク

FCN はセマンティック セグメンテーションの分野における先駆的な研究であり、2015 年に Jonathan Long、Evan Shelhamer、Trevor Darrell によって提案されました。エンドツーエンドのトレーニングにより、その後のセマンティック セグメンテーション アルゴリズムの開発への道が開かれました。FCN は、PASCAL VOC (2012 年のデータ。以前の方法より 20% 高く、平均 IoU 62.2% に達しました)、NYUDv2、および SIFT フローで最高のセグメンテーション結果を達成しました。一般的な画像の場合、推論に必要な時間は 1/3 だけです秒。

アルゴリズムの主な貢献:

  • 従来の全結合層を畳み込み層に置き換えることにより、FCN は任意のサイズの入力画像を受信し、空間情報とピクセルレベルの予測結果の両方を出力に保存できるようになります。FCN アルゴリズムのもう 1 つの重要な貢献は、出力サイズを入力画像サイズに戻すためのアップサンプリング レイヤーの導入です。FCNでは、ダウンサンプリング層は画像サイズをダウンサンプリングすることで高次の特徴を取得し、アップサンプリング層はデコンボリューションによって画像サイズを元のサイズに戻し、サイズを復元しながら低解像度の特徴と高レベルの特徴を結合します。特徴が融合されてピクセルレベルの予測結果が得られます。
  • FCN アルゴリズムのもう 1 つの重要な機能は、畳み込み層の出力をアップサンプリング層の入力に接続するスキップ接続の導入であり、これにより、より豊富なセマンティック情報が保持され、予測の精度が向上します。スキップ接続により、FCN アルゴリズムはさまざまなレベルの特徴を通じて予測を生成できるため、詳細レベルとセマンティック レベルの両方でより適切なセグメンテーションが可能になります。

ネットワークモデル図

  • FCN-32s: pool5 の出力を予測用の元の画像のサイズに直接アップサンプリングします。図 4 からわかるように、予測結果は非常に粗いです (mIoU 59.4)。
  • FCN-16s: プール 5 を 2 倍にアップサンプリングし、プール 4 の特徴を追加して、元のイメージ サイズにアップサンプリングすると、結果は 32 秒よりも細かくなります (mIoU 62.4)
  • FCN-8s: プール 5 (2 回アップサンプリング) とプール 4 を追加した後の機能。最初に 2 回アップサンプリングし、次にプール 3 に追加して FCN-8 機能 (mIoU 62.7) を取得します。

 従来の分類 CNN では、プーリング操作を使用して、特徴マップの解像度を下げながら視野を広げます。分類タスクに非常に効果的な分類モデルは、画像の全体的なカテゴリに焦点を当て、その空間的位置を考慮しません。そのため、より抽象的で顕著な特徴を確実に抽出できるように、頻繁に畳み込み層の後にプーリング層が続く構造になっています。一方、プーリングとストライドによる畳み込みはセマンティック セグメンテーションには適しておらず、これらの操作は空間情報の損失を引き起こします。異なるセマンティック セグメンテーション モデルはコーデックで異なるメカニズムを使用しますが、いずれもエンコーダーで解像度を下げるときに失われた情報を回復することを目的としています。

セマンティック セグメンテーション アーキテクチャのもう 1 つの重要な点は、特徴マップでデコンボリューションを使用して低解像度セグメンテーション マップを入力画像解像度にアップサンプリングするか、アトロス コンボリューションを使用してエンコーダ低下時の解像度を部分的に回避することです。Atrous 畳み込みは、最新の GPU であっても計算コストが高くなります。

1.1.2 Uネット

论文:  U-Net: 生物医学画像セグメンテーションのための畳み込みネットワーク 

U-Net アーキテクチャには、コンテキスト情報をキャプチャする縮小パスと、正確な位置特定をサポートする対称拡張パスが含まれており、非常に少ない画像を使用してネットワークをエンドツーエンドでトレーニングできます。U-Net は主に医療画像のセグメンテーションに使用されており、ISBI ニューロン構造セグメンテーション チャレンジで以前の方法よりも優れた結果を達成しました。

深層学習ネットワークの学習には大量のデータが必要ですが、セマンティック セグメンテーションの難しさは、高解像度の特徴と低解像度の特徴の組み合わせが、低レベルの位置情報と高レベルのセマンティックの組み合わせとみなされることです。共同利用は非常に価値のある研究課題です

  • 高解像度機能により位置情報を保証可能
  • 低解像度機能によりセマンティック情報を保証できる

FCN に基づいて、このペーパーではいくつかの変更と最適化を行っており、少量のデータの使用に基づいてより正確なセグメンテーション結果を保証できます。

FCN の主要なコア:

  • 従来の畳み込み層の後に、特徴マップを拡張するためにアップサンプリング層が追加され、拡張時に前の層の高解像度特徴が使用され、より優れた位置情報が導入されます。

U-Net の主な改善点は次のとおりです。

  • アップサンプリング部分では、より多くのコンテキスト情報を高解像度レイヤーに渡すために多くのチャネルも使用されます。
  • ネットワークがより堅牢な機能を学習できるようにするために、いくつかのデータ拡張方法が使用されています
  • 加重損失が使用されます

U-Net フレーム構造:

図 1 に示すように、U-Net と FCN は構造が似ており、エンコーダ モジュールとデコーダ モジュールにも分割されており、ネットワーク構造には畳み込み層とプーリング層のみがあり、次の 2 つのパスが含まれます。

  • コンテキスト情報をキャプチャする短縮パス (エンコーダー)
  • 正確な位置決めのための対称延長パス (デコーダ)

 

特徴:

  • U-Net のアップサンプリングとダウンサンプリングでは、同じデータの畳み込み演算を使用し、スキップ リンクを使用するため、ダウンサンプリング層の特徴がアップサンプリング層に直接送信され、より正確なピクセル位置決めが保証されます。ユーネット。
  • U-Net のトレーニング効率も FCN よりも高く、U-Net では 1 回のトレーニングのみが必要ですが、FCN-8s では 3 回のトレーニングが必要です。

 1.1.3 セグネット

论文:  SegNet: 画像セグメンテーションのためのディープ畳み込みエンコーダ/デコーダ アーキテクチャ 

SegNet の新規性は、デコーダが低解像度の入力特徴マップをアップサンプリングする方法にあります。

  • SegNet は、デコーダで「アンプーリング」を使用して特徴マップをアップサンプリングし、セグメンテーションで高周波の詳細をそのままの状態に保ちます。
  • エンコーダは完全に接続された層 (FCN のような畳み込み) を破棄するため、パラメータが少ない軽量のネットワークになります。

ネットワーク構造:

  • エンコーダ: VGG-16 ネットワーク (最後の分類層を削除)、合計 13 の畳み込み層、畳み込み構造は Conv+BN+ReLU、ダウンサンプリングは最大プーリング (2x2、s=2) によって実現されますが、一般的に位置情報は失われ、増分損失 (境界の詳細) はセマンティック セグメンテーションの結果にとって非常に不利です。セマンティック セグメンテーションにおける境界は非常に重要であるため、エンコーダーにできるだけ多くの境界情報を保持することが非常に重要です。メモリや効率の問題を考慮して、位置情報を保持するために最大値に相当する位置を保持する方法が提案されているため、この記事でもこの方法を使用します。
  • デコーダー: 各エンコーダーはデコーダーに対応するため、デコーダーにも合計 13 のレイヤーがあり、記憶された最大プーリングを使用してアップサンプリングされます。デコード構造を図 3 に示します。
  • 分類層: デコーダの最後の層の出力はマルチクラス ソフトマックス分類器に入力され、各ピクセルに対応するカテゴリ予測が生成されます。

このアプローチにより、学習されたアップサンプリングの必要がなくなります。アップサンプリングされた特徴マップは疎であるため、トレーニング可能な畳み込みカーネルを畳み込みに使用して、密な特徴マップを生成します。SegNet を FCN などのセマンティック セグメンテーション ネットワークと比較した結果、良好なセグメンテーション パフォーマンスを達成するために必要なメモリと精度の間のトレードオフが明らかになりました。

1.1.4 Deeplabシリーズ

ディープラボ v1

论文:深い畳み込みネットと完全に接続された CRF を使用したセマンティック画像セグメンテーション

DeepLab v1 は、2014 年に最初に提案された最も初期の DeepLab モデルです。DeepLab v1 は主にホロー コンボリューション (拡張コンボリューションとも呼ばれる) を使用して受容野のサイズを拡大し、より大きな画像を処理できるようにします。さらに、DeepLab v1 では、完全接続層を拡張畳み込みに置き換えることで、ネットワーク パラメーターの量が削減され、過剰適合の問題が回避されます。後処理では、完全接続 CRF が導入され、より正確なセグメンテーション境界が特定されます。 

ディープラボ v2

论文:Deeplab: 深い畳み込みネット、アトラス畳み込み、および完全に接続された CRF を使用したセマンティック画像セグメンテーション

DeepLab v2 は、2015 年に最初に提案された DeepLab v1 の改良版です。DeepLab v2 は、主にマルチスケール情報融合および空間ピラミッド プーリング (ASPP) を使用して、セグメンテーションの精度をさらに向上させます。

 

ASPP フレームワーク: 異なる拡張率を持つ 4 つの並列畳み込み 

ディープラボ v3

论文:セマンティック画像セグメンテーションのための atrous 畳み込みの再考

DeepLab v3 は、もともと 2017 年に提案された DeepLab シリーズの中で最も重要なバージョンです。DeepLab v3 は、変形可能な畳み込みを使用して、さまざまなスケールのオブジェクトのセグメンテーション タスクにさらに適応し、さらに ASPP モジュールを改良して特徴表現能力を向上させています。

ネットワーク構造:

DeepLab V3 には、カスケード モデル カスケード タイプと ASPP モデル ピラミッド プーリング タイプの 2 つの実装構造が含まれています。

2 つのモデルを以下の 2 つの図に示します。

  • カスケード モデルの Block1、2、3、4 は ResNet ネットワークの層構造 (V3 バックボーン ネットワークは ResNet50 または 101 を使用) ですが、Block4 では 3*3 畳み込みとショートカット ブランチ 1*1 畳み込みステップ Strideダウンサンプリングは行われず、3*3 畳み込みは拡張畳み込みに置き換えられます。次の Block5、6、7 は Blockd のコピーです。(図中のレートは実際の膨張係数ではありません、実際の膨張係数 = レート*マルチ - グリッド パラメーター)

  • ターゲットのサイズは大きく異なり、一般的な解決策は次のとおりです。マルチスケール フュージョン、エンコーダ デコーダ構造、長距離依存関係をキャプチャするための追加構造の使用、空間ピラミッド プーリング (複数の異なるプーリング レート、異なるスケール特性のキャプチャ)
  • トレーニングを高速化して効果を向上させるために、ASPP にバッチ正規化を追加しました。
  • グローバル情報を取得するために並列グローバル平均プーリングを追加しました

 ASPP は、異なるスケールの情報を取得するために異なる拡張率を使用しますが、拡張率が大きくなると、有効な要素が少なくなります。つまり、間隔が大きくなるほど、多くの重みが特徴マップから外れるようになり、特徴マップから外れる重みが多くなります。極端な場合、この 3x3 畳み込みの効果は 1x1 畳み込みと同様になります。したがって、作成者はグローバル平均プーリングを使用して、特徴マップの最後の層でグローバル情報をキャプチャし、「画像レベル」の特徴を 1x1 畳み込み + BN に入力して、必要なサイズにアップサンプリングします。

Deeplabv3+

论文:セマンティック画像セグメンテーションのための atrous 分離可能畳み込みを備えたエンコーダ/デコーダ

Deeplab v3+ では、「デコーダ付き ASPP」と呼ばれる新しいエンコーダ/デコーダ構造が導入されています。このうち、ASPP 部分は Deeplab v3 の ASPP モジュールに似ていますが、異なるホールレートを持つ複数の畳み込み演算が追加され、次元削減のために最後の層の後に 1x1 畳み込み層が追加されています。デコーダ部分は、デコンボリューション操作を使用して低解像度の特徴マップを元の画像と同じ解像度にアップサンプリングし、ASPP 部分が出力する高解像度の特徴マップと組み合わせて、最終的に予測結果を生成します。

Deeplab v3 と比較した場合、Deeplab v3+ の改善点は主に次の点です。

  •  デコーダ構造を備えた ASPP: Deeplab v3+ では、デコーダ構造を備えた ASPP が導入されています。これにより、ネットワークのさまざまなスケールのターゲットを識別する能力が向上し、同時に最終予測結果の量子化誤差が低減されます。

  • Xception ベースのバックボーン: Deeplab v3+ は Xception ベースのバックボーンを使用しており、ResNet と比較して、Xception はパラメータが少なく、計算効率が高くなります。

  • マルチスケールのトレーニングとテスト: Deeplab v3+ は、トレーニングとテストの両方の段階でマルチスケール手法を使用し、ネットワークの堅牢性と予測精度を向上させることができます。 

 ネットワークモデル:

 1.1.5 GCN (グローバル畳み込みネットワーク)

論文: Large Kernel Matters - Global Convolutional Network によるセマンティック セグメンテーションの改善 GCN (Global Convolutional Network) は、画像セマンティック セグメンテーション用の深層畳み込みニューラル ネットワークです。従来の畳み込みニューラル ネットワークと比較して、GCN は畳み込み演算をローカルの受容野からグローバルな画像情報まで拡張するため、グローバルな特徴をよりよく保存でき、一部の小さなオブジェクトのセグメンテーション効果が優れています。

セマンティック セグメンテーションには、画像のセグメンテーションだけでなく、セグメンテーション オブジェクトの分類も必要です。完全に接続された層が使用できないセグメンテーション アーキテクチャでは、この研究では代わりに大次元のカーネルを使用できることがわかりました。大規模なカーネル構造を採用するもう 1 つの理由は、ResNet などの多くの深層ネットワークは広い受容野を持っていますが、関連研究では、ネットワークがはるかに狭い領域で情報を取得する傾向があることが判明しており、有効受容野の概念が確立されていないことです。提案されました。大規模なカーネル構造は計算コストが高く、多くの構造パラメーターがあります。したがって、k×k畳み込みは、1×k+k×1とk×1+1×kの2つの分布の組み合わせとして近似できます。このモジュールは、グローバル畳み込みネットワーク (GCN) と呼ばれます。

次に構造ですが、ResNet (ホールコンボリューションなし) が全体のエンコーダ部分を形成し、GCN ネットワークとデコンボリューション層がデコーダ部分を形成します。この構造では、Boundary Refinement (BR) と呼ばれる単純な残差モジュールも使用します。
  

1.1.6 DAネット

论文:シーンセグメンテーションのためのデュアルアテンションネットワーク

新しいシーン セグメンテーション モデルであるデュアル アテンション ネットワーク (DAN) が提案されています。これは、グローバル コンテキスト情報とオブジェクト間の相互関係を効果的にキャプチャして、シーン セグメンテーションのパフォーマンスを向上させることを目的としています。主な貢献は次のとおりです。

  •  デュアル アテンション メカニズム: DAN モデルでは、グローバル情報とローカル情報を取得するために、オブジェクト レベルとピクセル レベルのアテンションを含むデュアル アテンション メカニズムを導入しています。オブジェクト レベルのアテンションは重要なオブジェクトをフィルタリングするために使用され、ピクセル レベルのアテンションは注目度の高いピクセルに焦点を当てるために使用されます。

  • アテンションベースの特徴強化: DAN モデルは、アテンション メカニズムを通じて特徴表現を強化し、モデルが重要な情報により多くの注意を払うようにします。アテンション メカニズムを通じて、DAN は特徴の重みを適応的に調整して、シーンのセグメンテーションの精度を向上させることができます。

  • 空間情報の送信の強化: DAN モデルは、畳み込みプロセスにアテンション メカニズムを導入し、モデルが主要な領域に焦点を当て、グローバルおよびローカルのコンテキスト情報をより適切に取得できるようにします。これにより、空間情報の転送がさらに強化され、シーンのセグメンテーションのパフォーマンスが向上します。 

空間相関とチャネル相関の両方を取得するために、DANet はチャネルと空間の両方で非ローカル モジュールを使用する並列アプローチを使用します。

  • 位置注意:空間的注意でもあり、各ピクセルと他のピクセルとの関係が得られ、関係が近いほど重みが大きくなります
  • チャンネルの注目度: カテゴリの注目度でもあり、各チャンネルの重みを取得できます。チャンネルが重要であるほど、重みが大きくなります。

  

 1.1.7 スイングトランス

论文:Swin Transformer: シフト ウィンドウを使用した階層型ビジョン トランスフォーマー

「Swin Transformer: Shifted Windows を使用した階層型ビジョン トランスフォーマー」は、香港中文大学、清華大学、Horizo​​n Robotics Inc. が CVPR 2021 で共同発表した論文です。この論文では、新しい Vision Transformer アーキテクチャ、つまり Swin Transformer を提案しますが、これは、シフト ウィンドウと呼ばれるメカニズムを採用することで、既存の Vision Transformer アーキテクチャの 2 つの主な問題を解決します: 1. 高解像度画像の大量の計算コスト、2. 長いシーケンスの計算コスト。

Swin Transformer は、入力画像を複数の小さなブロックに分割し、これらの小さなブロックに対して計算を実行することにより、計算コストを削減します。ただし、従来の分割方法とは異なり、Swin Transformer はシフト ウィンドウ メカニズムを使用します。つまり、2 つの隣接する小ブロック間に一定の重複領域が存在します。このメカニズムにより、モデルは空間内のローカル情報をより適切に利用できるようになり、モデルの精度が向上します。

Swin Transformer は、COCO2017 オブジェクト検出、インスタンス セグメンテーション、セマンティック セグメンテーション データセットに基づいて評価され、既存の Transformer アーキテクチャと比較されます。実験結果は、Swin Transformer が同じ計算コストを維持しながらより優れたパフォーマンスを達成できること、および同じ計算コストでより高いパフォーマンスを達成できることを示しています。さらに、Swin Transformer は、水平および垂直のスケーラビリティによってさらに拡張して、さまざまなサイズの画像に適応できます。

  

1.2 リアルタイムセグメンテーションアルゴリズム

1.2.1 Eネット

论文:ENet: リアルタイム セマンティック セグメンテーションのためのディープ ニューラル ネットワーク アーキテクチャ

モバイル アプリケーションでは、ピクセル レベルのセマンティック セグメンテーションをリアルタイムで実行できる機能が重要です。最近の DCNN ネットワークの欠点は、
多くの浮動小数点演算が必要で実行時間が長く、セマンティック セグメンテーションの使いやすさを妨げていることです。ENet は、リアルタイム セマンティック セグメンテーションに関する最も初期の記事の 1 つであり、精度と計算時間の間のトレードオフを実現しています。

いくつかの軽量セマンティック セグメンテーション モデルの設計アイデア

  • ダウンサンプリングを頻繁に行うと情報の損失につながるため、アップサンプリングとダウンサンプリングの数を減らします (FCN ではダウンサンプリングが 1/32、ENet では 1/4 のみ)。
  • UNet の対称構造の代わりに、軽量のデコーダ (この記事では segnet デコーダを使用します) を使用します。
  • 実験の結果、最初の数回のコンバージョンを削除した方が Relu 効果が向上することがわかりましたが、テストの結果、その理由はネットワークの深さが十分でないことがわかりました。したがって、relu の代わりに prelu を使用してください。
  • 分解コンボリューションを使用 (5*5 -> 1*5+5*1、分解後の計算量は約 3*3 に相当)
  • 拡張畳み込みを使用して受容野を増加させると、その効果は非常に優れています。
  • 正則化、つまりドロップアウト。
  • ダウンサンプリングは必要ですが、情報が失われます。情報損失を減らすために、ダウンサンプリングでは conv プーリングと max プーリングをそれぞれ実行し、2 つの結果を連結してより多くの情報を保持します。
  • ネットワーク構造は下図のとおりです

  • conv の後に bn と prelu を追加します (通常の畳み込み、拡張畳み込み、転置畳み込みなど)。
  • 次の表は全体構造ですが、ダウンサンプリングが 2 回だけ行われていることがわかります。

 1.2.2 ビセネット

论文:BiSeNet: リアルタイム セマンティック セグメンテーションのための双方向セグメンテーション ネットワーク

このペーパーでは、以前のリアルタイム セマンティック セグメンテーション アルゴリズムを要約し、現在 3 つの高速化方法があることがわかります。

  • クリッピングまたはサイズ変更して入力サイズを制限し、計算の複雑さを軽減します。この方法はシンプルで効果的ですが、空間的な詳細が失われると、特に境界部分の予測が損なわれ、その結果、測定と視覚化の精度が低下します。
  • 特にバックボーンモデルの初期段階では、ネットワークチャネルの数を減らすことで処理を高速化しますが、これにより空間情報が弱まってしまいます。
  • モデルの最終段(ENetなど)を破棄し、極めてコンパクトなフレームワークを追求。この方法の欠点も明らかです。ENet は最終段階でダウンサンプリングを破棄するため、モデルの受容野が大きなオブジェクトをカバーするのに十分ではなく、その結果、識別能力が低下します。

これらの高速化方法では、多くの空間詳細が失われるか、空間容量が犠牲になり、結果として精度が大幅に低下します。空間情報の損失を補うために、一部のアルゴリズムは U 字型を使用して空間情報を復元します。ただし、U 字型では速度が低下し、浅い特徴を融合するだけでは失われた情報の多くは回復できません。

要約すると、リアルタイム セマンティック セグメンテーション アルゴリズムでは、加速中に空間情報に注意を払う必要がありますこの論文では、新しい双方向セグメンテーション ネットワークBiSeNetが提案されています。まず、ステップ サイズが小さい空間パスは、空間位置情報を保存して高解像度の特徴マップを生成するように設計され、一方、ダウンサンプリング レートが速い意味論的パスは、目的の受容野を取得するように設計されます。これら 2 つのモジュールの上に新しい機能融合モジュールが導入され、2 つの機能マップを融合して速度と精度のバランスを実現します。

具体的には、空間パス Spatial Path は、より多くのチャネルと浅いネットワークを使用して豊富な空間情報を保持し、高解像度の特徴を生成します。コンテキスト パス Context Path は、より少ないチャネルとより深いネットワークを使用して、十分なコンテキストを迅速にダウンサンプリングします。これら 2 つのネットワークの出力に基づいて、機能融合モジュール (FFM)も 2 つの機能を融合するように設計されています

1.2.3 DFANet

论文:DFANet: リアルタイム セマンティック セグメンテーションのための深層機能集約

DFANet は、Megvii が 2019 年 4 月にリリースした道路シーン理解のためのセマンティック セグメンテーション ネットワークです。ネットワークのバックボーンは軽量の Xception ネットワークを使用し、サブネットワークとサブステージをそれぞれカスケードしてフィーチャ情報を集約します。

ネットワーク モデルの設計の出発点は、ダウンサンプリング プロセスで各特徴マップの情報をより適切かつ完全に利用することです。この論文では、異なる特徴マップの情報集約を実現するために 2 つの戦略が使用されます。異なるサイズのバックボーンを収集 フィーチャ情報は、セマンティック層と空間層(対応するサブネットワーク)の情報融合に再利用されます。2 つ目は、ネットワーク構造のプロセス パス内のさまざまなステージでの機能の組み合わせを通じて、ネットワーク機能 (サブステージに相当) のパフォーマンスを向上させることです。

ネットワーク構造

 また、図 1 から、サブネットワークの焦点は、前のバックボーンの高レベルの特徴マップを次のバックボーンの入力にアップサンプリングして、予測結果を改良することにあることがわかります。サブネットワークは、粗いものから細かいものまでのピクセル予測のプロセスとみなすこともできます。サブステージは、対応するステージの「粗い」部分から「細かい」部分までのさまざまな機能の組み合わせです。これにより、同じ次元の異なる特徴マップを組み合わせることで、受容野と高次元構造の詳細を転送できます。ネットワーク構造の fc アテンション モジュールは SENet の設計概念を参照し、チャネルごとに特徴マップの割合を選択することでネットワークのパフォーマンスを向上させます。したがって、セマンティック情報とカテゴリ情報をより適切に抽出するために、FC 注目の完全接続層は ImageNet で事前にトレーニングされています。(分類タスクでは、通常、ネットワークの終端は、カテゴリ確率ベクトルを取得するためにグローバル プーリング + FC です。)FC の後には、各バックボーン出力特徴マップのチャネル次元と一致させるための 1 x 1 畳み込みが続きます。

この論文は、軽量モデルにおけるマルチブランチ入力ネットワークの欠点を指摘しています: 1. マルチブランチ入力ネットワークには、異なるブランチ間の高レベルの機能の組み合わせが欠けています; 2. 異なるブランチ間の情報相互作用も欠如しています。分岐 ; 3. 高解像度の入力画像の場合、ネットワークの推論速度は制限されます。

1.3 RGB-D セグメンテーション

1.3.1 レッドネット

论文:RedNet: 屋内 RGB-D セマンティック セグメンテーション用の残留エンコーダ デコーダ ネットワーク

これは2018年の記事ですが、なぜこの記事を読んだかというと、全体のアーキテクチャが比較的汎用性の高いRGB-Dの基本フレームワークとして利用できるという理由と、一方で、前述の復元境界の比較があったからです。前の記事、良かったです。2018 年の文脈で、resnet は、RedNet がエンコーダーとデコーダーのビルディング ブロックとして残差ブロックを使用することを提案しました。著者はまた、現在多くの論文で使用されているマルチスケールの深い監視も提案しました。最終的に、SUN RGB-D では 47.8% のスコアが達成されました。
FCNはエンコーダ・デコーダ構造と拡張畳み込み構造の2種類に分かれており、符号化・復号構造は連続畳み込みにより受容野を拡大しますが、画像サイズは徐々に小さくなり、画像の情報が失われます。復元が困難な場合、拡大コンボリューションでは拡大率を上げて受容野を拡大しますが、画像の大きさは変わらないため、非常に多くの計算量が発生します。
RedNetはrgbと深度のバックボーンとしてresnet34を使用し、各レイヤーが融合され、ジャンプ接続構造を使用してエンコーダーの空間情報がデコーダーに転送されます。
モデル構造

注意すべき点は、trans はモデル デコーダのアップサンプリング操作であるということです。

 フレームワークのジャンプ接続には 4 つのエージェント ブロックもあり、実際には 4 つの通常の 1x1 畳み込みです。目的は、エンコーダ チャネルのサイズを削減して、エンコーダ チャネルをデコーダと融合できるようにすることです。また、これは resnet50 でのみ使用され、resnet34 は使用されません。これは、resnet のエンコーダーには次元拡張がないためです。
エンコーダでは、各残差ブロックが最初のモジュールでダウンサンプリングされ、その後、いくつかの畳み込みが続きます。ダウンサンプリング操作の隣に残差接続が存在します。これは、元の resnet では非常に明確であり、アップサンプリングを行うとは、次のことを意味します。最初の畳み込みはサイズに影響しませんが、最後の畳み込みでアップサンプリングすると、画像のサイズは 2 倍になり、チャネルは 2 倍に縮小され、その隣のジャンプ接続も同じように動作します。道。
具体的な構成:

 1.3.2 RDFネット

论文:RDFNet: 屋内セマンティック セグメンテーションのための RGB-D マルチレベル残差特徴融合

RGB-D データを使用したマルチレベルの屋内セマンティック セグメンテーションでは、RGB 特徴に深度特徴を組み込むとセグメンテーション精度の向上に役立つことが示されていますただし、これまでの研究では、単に RGB と深度特徴を連結したり、RGB と深度スコア マップを平均したりするだけでは、マルチモーダル特徴融合の可能性を十分に活用していませんでした。この論文では、残差学習の中核となるアイデアを RGB-D セマンティック セグメンテーションに拡張する新しいネットワークを提案します。このネットワークは、マルチモーダル特徴融合モジュールとマルチレベル特徴改善モジュールを組み込むことで、マルチレベル RGB-D CNN 特徴を効果的にキャプチャできます。NYUDv2 と SUN RGB-D の 2 つの RGB-D データセットが主に使用されます。

RefineNet ネットワークの出現は、RGB-D 画像のセマンティック セグメンテーションにおける画期的な出来事です。RefineNet は、スキップ接続による残差学習を利用し、トレーニング中に勾配を簡単に逆伝播できます。RefineNet のマルチレベル特徴量は短距離および長距離残差値接続によって接続されているため、効率的にトレーニングして高解像度の特徴マップに組み込むことができます。この研究に触発されて、この論文は、残差学習の中核となるアイデアを RGB-D セマンティック セグメンテーションに拡張する、新しい RGB-D 融合ネットワーク (RDFNet) を提案しますネットワーク構造は次のように構成されています (図 1)。

 この文書で説明する MMFNet の詳細なコンポーネントを図 5 に示します。このペーパーの機能融合ブロックには、RefineNet と同じコンポーネントが含まれていますが、入力が異なり、必要な操作もわずかに異なります。RGB およびディープ ResNet 機能を考慮すると、著者の MMFNet はまず畳み込みによって各機能のサイズを縮小し、パラメータの急増を抑えながら効率的なトレーニングを促進します。その後、RefineNet と同様に、各特徴が 2 つの RCU と畳み込みを通過します。MMFNet の RCU と RefineNet の RCU の目的には特定の違いがあります。著者の MMFNet の RCU は、特にモダリティ融合のためにいくつかの非線形変換を実行する必要があります。異なるモダリティの 2 つの機能は、操作によって相互に改善するために補完的に結合されます。RefineNet の機能は、主に、高解像度の下位レベルの特徴を採用することで、粗い高レベルの特徴を改善します。MMFNet での後続の追加の畳み込みは、特徴をさまざまなモダリティと適応的に融合し、合計のために特徴値を適切に再スケーリングするために重要です。通常、セマンティック セグメンテーションではカラー特徴の方が深い特徴よりも優れた識別力を持っているため、ブロック内の加算融合は主に相補的または残余の深い特徴を学習するために使用され、これにより RGB 特徴を改善して混同パターンを区別できます。各モダリティ特徴の重要性は、RCU 後の畳み込みの学習可能なパラメーターによって制御できます。 

 1.4 拡張読書

上記の論文は、トップカンファレンスに含まれるセマンティックセグメンテーションに関する古典的論文であり、画像セグメンテーションに関する初心者向けの論文であり、これらの論文を読んでソースコードを再現することで、強固な基礎を築くことができます。ある程度の知識と経験の蓄積があれば、過去 2 年間でより人気のある、斬新な、または挑戦的な方向を引き続き掘り下げることができます。この時期には多くの文献を読む必要がありますが、文献を入手するには次のような方法があります。

  • Google Scholar: https://scholar.google.com/Google Scholar はキーワード検索をサポートし、さまざまなフィルターもサポートし、PDF のダウンロードと引用の生成を提供します。壁を乗り越えることはできないのですか?関係ありませんが、中国にはhttps://scholar.glgoo.org/など、Google Scholar のミラーが多数あります。
  • 百度アカデミック: http://xueshu.baidu.com/Baidu Scholar の機能は Google Scholar に似ており、中国人に優しく、さまざまな引用の丁寧な分析や文書ヘルプ機能などがありますが、文書の収集力はやや劣ります。
  • dblp: コンピューター サイエンスの参考文献
  • CVFオープンアクセス
  • 機械学習の最新情報 | コード付き論文
  • SCI ハブ。  https://sci-hub.tw/ドキュメント ダウンロード アーティファクト、キーワード検索、DOI 検索などをサポートします。最も重要なことは、2 つの主要な学者ではダウンロードできない多くの文書が、ここでは無料で入手できることです。
  • arXiv. 一部の論文は著作権の問題によりダウンロードできませんが、プレプリントをダウンロードできます。もちろん、arXiv は論文のプレプリントを投稿するためのプラットフォームにすぎず、含まれる論文は査読 (査読) を通過したものはなく、論文の質にはばらつきがありますので、含まれるすべての論文が権威あるものであるとは考えないでください。 。
  • ACM、IEEE、Springer、Elsevier などの公式 Web サイト

2. 共通データセット

2.1 PASCAL ビジュアルオブジェクトクラス(VOC)

VOC データ セットは、コンピュータ ビジョンの主流のデータ セットの 1 つです。分類、セグメンテーション、ターゲット検出、アクション検出、キャラクターの位置決めに使用できます。これには、21 のカテゴリとそのラベルが含まれています: 車両、住宅、動物、飛行機、自転車、ボート、バス、車、バイク、電車、瓶、椅子、ダイニングテーブル、鉢植え、ソファ、テレビ、鳥、猫、牛、犬、馬、羊、そして人。データセット全体は、トレーニング セットと検証セットの 2 つの部分に分割されます。

https://pan.baidu.com/s/1TdoXJP99RPspJrmJnSjlYg#list/path=%2F抽出コード:jz27

2.2 PASCAL コンテキスト

PASCAL Context は、すべてのトレーニング画像にピクセルレベルのラベルを備えた VOC 2010 の拡張機能です。400 以上のカテゴリが含まれています。データ セットの一部のカテゴリは比較的まれであるため、59 のカテゴリのデータ セットがネットワークのトレーニングに一般的に使用されます。

特定の操作については、https: //blog.csdn.net/qq_28869927/article/details/93379892を参照してください。

2.3 Microsoft Common Objects in Context (MS COCO)

MS COCO は、もう 1 つの大規模なオブジェクト検出、セグメンテーション、およびテキスト ローカリゼーション データセットです。データセットには、多数のカテゴリと多数のラベルが含まれています。

リンク: https://blog.csdn.net/qq_41185868/article/details/82939959

2.4 都市景観

Cityscapes は、都市の街路シーンの意味論的な理解に焦点を当てたもう 1 つの大規模なデータセットです。これには、50 都市のストリート ビューのさまざまな立体ビデオ シーケンスのセットが含まれており、高品質のピクセル レベルの注釈の 5,000 フレームと、弱い注釈が付けられた 20,000 のフレームのセットが含まれています。これには、平面、人物、車両、建物、物体、自然、空、空間の 8 つのカテゴリにグループ化された 30 のカテゴリに対するセマンティックで高密度のピクセル アノテーションが含まれています。

リンク: https://blog.csdn.net/zz2230633069/article/details/84591532

2.5 ADE20K/MIT シーン解析(SceneParse150)

ADE20K/MIT シーン解析 (SceneParse150) は、シーン セグメンテーション アルゴリズムの標準トレーニングおよび評価プラットフォームを提供します。データは ADE20K から取得されており、25,000 を超える画像が含まれています。

リンク: http://groups.csail.mit.edu/vision/datasets/ADE20K/

2.6 シフトフロー

SiftFlow には、LabelMe でラベル付けされた 2688 個のデータセットが含まれています。セマンティック セグメンテーションには合計 33 のカテゴリがあり、解像度 256*256 の写真には 8 つの異なる屋外シーンが含まれています。

リンク: http://people.csail.mit.edu/celiu/SIFTflow/

2.7 スタンフォード大学の背景

このデータセットには、空、木、道路、草、水、建物、山、前景オブジェクトのラベル カテゴリを含む、既存の公開データセットから選択された 715 枚の画像が含まれています。

リンク: http://dags.stanford.edu/projects/scenedataset.html

2.8 バークレーセグメンテーションデータセット(BSD)

BSD データセットはカラー イメージとグレースケール イメージで構成され、合計 300 枚の画像があります (現在は 500 枚に増加しています)。これは 2 つの部分に分かれており、そのうち 200 がトレーニング セット、100 がテスト セットです。

リンク: https://www2.eecs.berkeley.edu/Research/Projects/CS/vision/grouping/segbench/

2.9 YouTube オブジェクト

このデータセットは、YouTube Web サイトのビデオ データから取得されます。データセットの画像ピクセルは 480*360 で、合計 10167 枚の画像があります。

リンク: https://data.vision.ee.ethz.ch/cvl/youtube-objects/

2.10 キティ

KITTIは主にロボット工学や自動運転に利用されており、多くのビデオが含まれています。車両センサーによって収集された画像は、当初はセマンティック セグメンテーションに使用されませんでしたが、その後、多くの人々の努力により、セマンティック セグメンテーションに使用できるマーク付きの画像が多数存在します。

リンク: https://blog.csdn.net/Solomon1558/article/details/70173223

3. 評価指標

3.1 混同行列

混同行列(コンフュージョンマトリックス)は誤差行列(エラーマトリックス)とも呼ばれ、混同行列とは、モデルが予測したカテゴリ数の統計と実ラベル数の統計を横軸にして描かれた行列です。縦軸として。

 上図に示すように、統計的分類モデルの分類結果を表します。対角線は一貫したモデル予測とデータ ラベルの数を表すため、混同行列の対角線の合計をテスト セット イメージの数で割ることによって精度を計算することもできます。対角線の数値が大きいほど良好であり、このクラスのモデルの予測結果が良好であることを表します。他の場所は予測が間違っている箇所であり、値が小さいほど、モデルの予測が適切であることを示します。

画像セグメンテーションにおける評価指標の基準は、通常、ピクセル精度と IoU のバリエーションです。説明の便宜上、次のように仮定します。k+1 クラス (空のクラスまたは背景を含む L0 から Lk まで) があり、Pij はクラス i に属するが、クラス i に属すると予測されるピクセルの数を表します。クラスj。つまり、Pii は真の量を表しますが、Pij と Pji はそれぞれ偽陽性と偽陰性として解釈されます。以下では、グラフィカルな方法を使用して、セグメンテーション図に TP/TN/FP/FN などの概念を示します。

上の図では、GroundTruth が左側、Prediction が右側にあり、予測されたマスク イメージです。予測グラフは 4 つの部分に分かれており、大きな白い斜線は真陰性 (TN、予測における実際の背景部分) であり、赤い線の部分は偽陰性 (FN、予測の背景として予測される) としてマークされています。予測ではあるが、実際は背景の部分ではない)、青い斜線は偽陽性(FP、予測では特定のラベルに分割されているが、実際にはラベルの部分ではない部分)、および中央の蛍光黄色のブロックは真陽性です (TP、予測の特定のラベル部分、真の値と一致します)。

上図では、左側が GT、右側が予測マスク画像である Prediction です。左側は予測マスクとグランド トゥルース マスクの交差部分で、右側は予測マスクとグランド トゥルース マスクの結合です。

3.2 ピクセル精度 (PA)

ピクセル精度の意味は、総ピクセル数に対する正しい予測カテゴリを持つピクセル数の比率です。上記の精度(Accuracy)に相当し、計算式は次のようになります。

前述の正解率の計算式に対応して、次のように簡略化して理解することもできます:対角要素の合計/行列の全要素の合計。

3.3 カテゴリ平均ピクセル精度 (MPA)

カテゴリ平均ピクセル精度 (平均ピクセル精度) は MPA と呼ばれます。これは、クラスごとに正しく分類されたピクセルの割合を計算し、累積して平均することを意味します。

 3.4 ユニオン上の交差 (IoU)

交差比率の意味は、特定のカテゴリに対するモデルの予測結果と実際の値の交差および和集合の比率です。ただ、ターゲット検出の場合は検出フレームと実際のフレームの交差率、画像分割の場合は予測マスクと実際のマスクの交差率を計算することになります。

 

計算式: 2 カテゴリーの正例 (カテゴリー 1) の IoU の計算を例に挙げます。

交点をTP、和集合をTP、FP、FNの和とすると、IoUの計算式は次のようになります。

IoU = TP / (TP + FP + FN)

3.5 和集合上の平均積分 (MIoU)

平均交差率 (平均 IOU) は mIOU と呼ばれます。つまり、予測領域と実際の領域の交差を、予測領域と実際の領域の和で割ることにより、単一カテゴリの IoU は次のようになります。その後、このアルゴリズムを繰り返して他のカテゴリの IoU を計算し、それらの平均を計算します。

表現する意味は、モデルのカテゴリごとの予測結果と真の値の積と和の比率を合計し、平均を計算することです。

 

3.6 周波数加重交差オーバーユニオン (FWIoU)

周波数加重交差対和集合比 FWIoU は MIoU を改良したもので、発生頻度に応じて各クラスの重みを設定します。

上記のすべての指標の中で、MIoU はそのシンプルさと代表性により最も一般的に使用される指標であり、ほとんどの研究者が結果を報告するためにこれを使用します。

4. 損失関数

4.1 ログの損失

クロス エントロピー、二項分類クロス エントロピーの式は次のとおりです。

pytorchコードの実装:

#二值交叉熵,这里输入要经过sigmoid处理
import torch
import torch.nn as nn
import torch.nn.functional as F
nn.BCELoss(F.sigmoid(input), target)
#多分类交叉熵, 用这个 loss 前面不需要加 Softmax 层
nn.CrossEntropyLoss(input, target)

4.2 ダイスの損失

前景の割合が小さすぎる問題に対しては、ダイス損失が提案されており、ダイス係数は 2 つのサンプルの重なりを測定する二値分類から導出されます。式は次のとおりです。

 サイコロの損失 = 1 - DSC、pytorch コードの実装:

import torch
import torch.nn as nn
 
class DiceLoss(nn.Module):
	def __init__(self):
		super(DiceLoss, self).__init__()
 
	def	forward(self, input, target):
		N = target.size(0)
		smooth = 1
 
		input_flat = input.view(N, -1)
		target_flat = target.view(N, -1)
 
		intersection = input_flat * target_flat
 
		loss = 2 * (intersection.sum(1) + smooth) / (input_flat.sum(1) + target_flat.sum(1) + smooth)
		loss = 1 - loss.sum() / N
 
		return loss
 
class MulticlassDiceLoss(nn.Module):
	"""
	requires one hot encoded target. Applies DiceLoss on each class iteratively.
	requires input.shape[0:1] and target.shape[0:1] to be (N, C) where N is
	  batch size and C is number of classes
	"""
	def __init__(self):
		super(MulticlassDiceLoss, self).__init__()
 
	def forward(self, input, target, weights=None):
 
		C = target.shape[1]
 
		# if weights is None:
		# 	weights = torch.ones(C) #uniform weights for all classes
 
		dice = DiceLoss()
		totalLoss = 0
 
		for i in range(C):
			diceLoss = dice(input[:,i], target[:,i])
			if weights is not None:
				diceLoss *= weights[i]
			totalLoss += diceLoss
 
		return totalLoss

4.3 IOUの損失 

IOU 損失は Dice 損失と似ており、IOU は次のように表されます。

Soft_IOU_loss pytorch コードの実装:

#针对多分类问题,二分类问题更简单一点。
import torch
import torch.nn as nn
import torch.nn.functional as F

class SoftIoULoss(nn.Module):
    def __init__(self, n_classes):
        super(SoftIoULoss, self).__init__()
        self.n_classes = n_classes

    @staticmethod
    def to_one_hot(tensor, n_classes):
        n, h, w = tensor.size()
        one_hot = torch.zeros(n, n_classes, h, w).scatter_(1, tensor.view(n, 1, h, w), 1)
        return one_hot

    def forward(self, input, target):
        # logit => N x Classes x H x W
        # target => N x H x W

        N = len(input)

        pred = F.softmax(input, dim=1)
        target_onehot = self.to_one_hot(target, self.n_classes)

        # Numerator Product
        inter = pred * target_onehot
        # Sum over all pixels N x C x H x W => N x C
        inter = inter.view(N, self.n_classes, -1).sum(2)

        # Denominator
        union = pred + target_onehot - (pred * target_onehot)
        # Sum over all pixels N x C x H x W => N x C
        union = union.view(N, self.n_classes, -1).sum(2)

        loss = inter / (union + 1e-16)

        # Return average loss over classes and batch
        return -loss.mean()

4.4 ロヴァシュ・ソフトマックス損失

Lovasz-Softmax 損失は CVPR2018 で提案された IOU 最適化のために設計された損失です. 競争において奇跡的な効果をもたらします. 数学的な導出は著者の範囲を超えています. 興味のある方は論文を見てください. わかりにくいですが、使い方は比較的簡単です。一般に、これは Jaccard 損失に対する Lovasz の拡張であり、損失の方がパフォーマンスが優れています。
さらに、著者は github の回答で、Lovasz のソフトマックス最適化は画像レベルの mIoU を目的としているため、より小さいバッチ サイズのトレーニングは一般的に使用されるデータセット レベルの mIoU のパフォーマンスにダメージを与えると述べています。そして、損失は微調整プロセスに適用されます。他の減量ウェイトと一緒に使用すると、より良い結果が得られます。
著者は 2 分類と複数分類の損失計算を示していますが、個人的には次の 3 つのステップがあると感じています。

  • 各ピクセルの誤差、二値分類で使用されるヒンジによって計算される誤差を計算し、多分類では予測値と実際の値の差を直接計算します。
  • エラーの並べ替えに従って、ラベルを並べ替えてから、Jaccard grad (コード内の lovasz_grad 関数) を計算します。
  • エラーと Jaccard grad を組み合わせて、目的の損失を取得します。

pytorch コード実装 (著者の GitHub からの抜粋):

import torch
from torch.autograd import Variable
import torch.nn.functional as F
import numpy as np

def lovasz_grad(gt_sorted):
    """
    Computes gradient of the Lovasz extension w.r.t sorted errors
    See Alg. 1 in paper
    """
    p = len(gt_sorted)
    gts = gt_sorted.sum()
    intersection = gts - gt_sorted.float().cumsum(0)
    union = gts + (1 - gt_sorted).float().cumsum(0)
    jaccard = 1. - intersection / union
    if p > 1: # cover 1-pixel case
        jaccard[1:p] = jaccard[1:p] - jaccard[0:-1]
    return jaccard
# --------------------------- BINARY LOSSES ---------------------------
def lovasz_hinge(logits, labels, per_image=True, ignore=None):
    """
    Binary Lovasz hinge loss
      logits: [B, H, W] Variable, logits at each pixel (between -\infty and +\infty)
      labels: [B, H, W] Tensor, binary ground truth masks (0 or 1)
      per_image: compute the loss per image instead of per batch
      ignore: void class id
    """
    if per_image:
        loss = mean(lovasz_hinge_flat(*flatten_binary_scores(log.unsqueeze(0), lab.unsqueeze(0), ignore))
                          for log, lab in zip(logits, labels))
    else:
        loss = lovasz_hinge_flat(*flatten_binary_scores(logits, labels, ignore))
    return loss
    
def lovasz_hinge_flat(logits, labels):
    """
    Binary Lovasz hinge loss
      logits: [P] Variable, logits at each prediction (between -\infty and +\infty)
      labels: [P] Tensor, binary ground truth labels (0 or 1)
      ignore: label to ignore
    """
    if len(labels) == 0:
        # only void pixels, the gradients should be 0
        return logits.sum() * 0.
    signs = 2. * labels.float() - 1.
    errors = (1. - logits * Variable(signs))
    errors_sorted, perm = torch.sort(errors, dim=0, descending=True)
    perm = perm.data
    gt_sorted = labels[perm]
    grad = lovasz_grad(gt_sorted)
    loss = torch.dot(F.relu(errors_sorted), Variable(grad))
    return loss
    
def flatten_binary_scores(scores, labels, ignore=None):
    """
    Flattens predictions in the batch (binary case)
    Remove labels equal to 'ignore'
    """
    scores = scores.view(-1)
    labels = labels.view(-1)
    if ignore is None:
        return scores, labels
    valid = (labels != ignore)
    vscores = scores[valid]
    vlabels = labels[valid]
    return vscores, vlabels

# --------------------------- MULTICLASS LOSSES ---------------------------
def lovasz_softmax(probas, labels, classes='present', per_image=False, ignore=None):
    """
    Multi-class Lovasz-Softmax loss
      probas: [B, C, H, W] Variable, class probabilities at each prediction (between 0 and 1).
              Interpreted as binary (sigmoid) output with outputs of size [B, H, W].
      labels: [B, H, W] Tensor, ground truth labels (between 0 and C - 1)
      classes: 'all' for all, 'present' for classes present in labels, or a list of classes to average.
      per_image: compute the loss per image instead of per batch
      ignore: void class labels
    """
    if per_image:
        loss = mean(lovasz_softmax_flat(*flatten_probas(prob.unsqueeze(0), lab.unsqueeze(0), ignore), classes=classes)
                          for prob, lab in zip(probas, labels))
    else:
        loss = lovasz_softmax_flat(*flatten_probas(probas, labels, ignore), classes=classes)
    return loss


def lovasz_softmax_flat(probas, labels, classes='present'):
    """
    Multi-class Lovasz-Softmax loss
      probas: [P, C] Variable, class probabilities at each prediction (between 0 and 1)
      labels: [P] Tensor, ground truth labels (between 0 and C - 1)
      classes: 'all' for all, 'present' for classes present in labels, or a list of classes to average.
    """
    if probas.numel() == 0:
        # only void pixels, the gradients should be 0
        return probas * 0.
    C = probas.size(1)
    losses = []
    class_to_sum = list(range(C)) if classes in ['all', 'present'] else classes
    for c in class_to_sum:
        fg = (labels == c).float() # foreground for class c
        if (classes is 'present' and fg.sum() == 0):
            continue
        if C == 1:
            if len(classes) > 1:
                raise ValueError('Sigmoid output possible only with 1 class')
            class_pred = probas[:, 0]
        else:
            class_pred = probas[:, c]
        errors = (Variable(fg) - class_pred).abs()
        errors_sorted, perm = torch.sort(errors, 0, descending=True)
        perm = perm.data
        fg_sorted = fg[perm]
        losses.append(torch.dot(errors_sorted, Variable(lovasz_grad(fg_sorted))))
    return mean(losses)

def flatten_probas(probas, labels, ignore=None):
    """
    Flattens predictions in the batch
    """
    if probas.dim() == 3:
        # assumes output of a sigmoid layer
        B, H, W = probas.size()
        probas = probas.view(B, 1, H, W)
    B, C, H, W = probas.size()
    probas = probas.permute(0, 2, 3, 1).contiguous().view(-1, C)  # B * H * W, C = P, C
    labels = labels.view(-1)
    if ignore is None:
        return probas, labels
    valid = (labels != ignore)
    vprobas = probas[valid.nonzero().squeeze()]
    vlabels = labels[valid]
    return vprobas, vlabels

4.5 焦点損失 

焦点損失は、トレーニング サンプルの不均衡のために He Yuming によって提案された損失関数です。方式:

 

焦点損失はクロス エントロピーの変形であると考えることができ、2 つのパラメーター α \alphaα、β \betaβ は次の 2 つの問題のために設計されています。

  • 負のサンプルが多すぎるなど、正のサンプルと負のサンプルのバランスが崩れています。
  • シンプルで分類しやすいサンプルが多数あります。

最初の質問については、損失関数では、さまざまなカテゴリのサンプル損失に重みを追加することができ、陽性サンプルが少ない場合、陽性サンプル損失の重みが増加すると考えるのが簡単ですが、これが役割です。焦点損失におけるパラメータ α \alphaα の 2 番目の質問 , パラメータ β \betaβ は設計されています. この式からわかるように、サンプル pt の予測値が比較的大きい場合、つまり、サンプルは容易に(1-pt)^beta が小さいため、分割しやすいサンプルの損失が大きくなりますが、これを減らすと、モデルは分割が難しいサンプルの損失の最適化にさらに注意を払うようになります。
pytorch コードの実装:

import torch
import torch.nn as nn
# --------------------------- BINARY LOSSES ---------------------------
class FocalLoss(nn.Module):
    def __init__(self, alpha=0.25, gamma=2, weight=None, ignore_index=255):
        super(FocalLoss, self).__init__()
        self.alpha = alpha
        self.gamma = gamma
        self.weight = weight
        self.ignore_index = ignore_index
        self.bce_fn = nn.BCEWithLogitsLoss(weight=self.weight)

    def forward(self, preds, labels):
        if self.ignore_index is not None:
            mask = labels != self.ignore
            labels = labels[mask]
            preds = preds[mask]

        logpt = -self.bce_fn(preds, labels)
        pt = torch.exp(logpt)
        loss = -((1 - pt) ** self.gamma) * self.alpha * logpt
        return loss
# --------------------------- MULTICLASS LOSSES ---------------------------
class FocalLoss(nn.Module):
    def __init__(self, alpha=0.5, gamma=2, weight=None, ignore_index=255):
        super().__init__()
        self.alpha = alpha
        self.gamma = gamma
        self.weight = weight
        self.ignore_index = ignore_index
        self.ce_fn = nn.CrossEntropyLoss(weight=self.weight, ignore_index=self.ignore_index)

    def forward(self, preds, labels):
        logpt = -self.ce_fn(preds, labels)
        pt = torch.exp(logpt)
        loss = -((1 - pt) ** self.gamma) * self.alpha * logpt
        return loss

 5つの活性化関数

線形モデルの表現力では不十分なため、非線形要素を追加するために活性化関数が使用されます。非線形活性化関数の導入により、ディープニューラル ネットワークの表現力がより強力になります。

 5.1 シグモイド活性化関数

 シグモイドはロジスティック活性化関数とも呼ばれ、実数値を0から1の範囲に圧縮し、予測確率の出力層でも使用できます。この関数は、大きな負の数を 0 に変換し、大きな正の数を 1 に変換します。数式は次のとおりです。

 以下の図は、シグモイド関数とその導関数のグラフを示しています。

ここに画像の説明を挿入

一般に、ニューラル ネットワークのトレーニングのプロセスでは、導出、連続導出、およびバイナリ分類問題の処理のために、シグモイド関数が実数領域を [0,1] にスムーズにマッピングできるため、シグモイド アクティベーション関数が一般的に使用されます。空。関数値は、ポジティブ クラスに属する確率として解釈できます (確率の値の範囲は 0 ~ 1)。
さらに、シグモイド関数は単調増加であり、連続的に導出可能であり、導関数形式は非常に単純です。しかし、複数カテゴリの問題の場合、シグモイド関数には十分なエネルギーがあるようです。
さらに、シグモイド関数の出力は 0 より大きいため、出力は 0 平均ではなくなります。これはオフセット現象と呼ばれ、後者の層のニューロンが 0 以外の平均出力信号を受け取る原因になります。前のレイヤーを入力として使用します。

利点:
(1) シグモイド関数の出力マッピングは (0,1) の間で、単調連続で、出力範囲は制限されており、最適化は安定しており、出力層として使用できます。
(2)導出が容易である。
短所:
(1) 彩度が柔らかいため、勾配消失が発生しやすく、トレーニングに問題が生じます。
(2) 出力の中心が 0 ではありません。

5.2 Tanh活性化関数

Tanh も非常に一般的な活性化関数です。これは実際にはシグモイド関数の変形です。Tanh 関数は次の式で定義されます。

ここに画像の説明を挿入

派生語:

ここに画像の説明を挿入

 

ここに画像の説明を挿入 

 

Tanh 活性化関数は、双曲線正接活性化関数とも呼ばれます。これは、シグモイド関数の非ゼロ中心出力問題を解決します。シグモイド関数と同様に、Tanh 関数も真の値を使用しますが、Tanh 関数は真の値を -1 から 1 までの範囲に圧縮します。シグモイドとは異なり、間隔が -1 から 1 の間であるため、Tanh 関数の出力はゼロを中心とします。Tanh 関数は 2 つのシグモイド関数を組み合わせたものと考えることができます。実際には、Sigmoid 関数よりも Tanh 関数が優先して使用されます。負の入力は負の値として扱われ、ゼロ入力値はゼロに近い値にマップされ、正の入力は正の値として扱われます。唯一の欠点: Tanh 関数には勾配が消えるという問題もあるため、飽和すると勾配も「無効」になります。

勾配消失の問題を解決するために、別の非線形活性化関数である整流線形単位 (ReLU) について説明します。これは、前の 2 つの関数よりも大幅に優れており、現在最も広く使用されている関数です。

5.3 ReLU活性化関数

数式:

ここに画像の説明を挿入

関数グラフとその導関数グラフ:

ここに画像の説明を挿入 

ここに画像の説明を挿入 

入力 x<0 の場合、出力は 0 になり、x>0 の場合、出力は x になります。この活性化機能により、ネットワークがより迅速に収束します。飽和しない、つまり、少なくとも正の領域 (x > 0) では勾配消失問題に抵抗するため、ニューロンは領域の少なくとも半分ですべてのゼロを逆伝播しません。ReLU は、単純なしきい値処理が使用されるため、計算効率が高くなります。ただし、ReLU ニューロンにはいくつかの欠点もあります。

  • ゼロを中心としていない: シグモイド活性化関数と同様に、ReLU 関数の出力はゼロを中心としていません。
  • 順方向パス中に x < 0 の場合、ニューロンは非アクティブなままとなり、逆方向パス中に勾配を「消去」します。この方法では重みを更新できず、ネットワークは学習できません。x = 0 の場合、その点の勾配は未定義ですが、実装では左または右の勾配を取得することでこれが解決されます。

x < 0 の場合、ReLU 活性化関数の勾配消失問題を解決するには、Leaky ReLU を使用します。この関数は、デッド ReLU 問題を解決しようとします。Leaky ReLU を詳しく見てみましょう。

5.4 Leaky ReLU 活性化関数

数式:

ここに画像の説明を挿入

 機能イメージ:

ここに画像の説明を挿入

Leaky ReLU の概念は、x < 0 の場合、0.1 の正の勾配になります。この関数はデッド ReLU 問題をある程度軽減しますが、この関数を使用した結果は一貫していません。これは、計算効率、高速収束、正の領域での飽和がないなど、ReLU 活性化関数のすべての特性を備えています。

Leaky ReLU はさらに拡張できます。x に定数項を乗算する代わりに、x にハイパーパラメータを乗算します。これは Leaky ReLU よりもうまく機能するようです。この拡張機能は Parametric ReLU です。

5.5 パラメトリック ReLU 活性化関数

ここに画像の説明を挿入 

ここで、αはハイパーパラメータです。ここではランダムなハイパーパラメータが導入されています。これは逆伝播できるため学習できます。これにより、ニューロンは負の領域に最適な勾配を選択できるようになり、この機能により、ニューロンは ReLU または Leaky ReLU になることができます。

結論として、ReLU を使用する方が良いですが、Leaky ReLU または Parametric ReLU を試して、問題に適しているかどうかを確認することもできます。
 

 

 

おすすめ

転載: blog.csdn.net/m0_70140421/article/details/129131684