(最終章)セマンティックセグメンテーションとは?原則+手書きコード実装?

Unet セマンティック セグメンテーション

目次

Unet セマンティック セグメンテーション

1.「意味論」と「セグメンテーション」を理解する方法。

2. セマンティック セグメンテーションの原則(キー ポイント)

3. セマンティックセグメンテーションの意味

4. セマンティック セグメンテーションの適用シナリオ

5. Unetのメリット(医療分野)

6. 高度な知識の蓄え

7. セマンティックセグメンテーションプロセス

8. プロジェクトの構造と紹介

9. 安装环境(python=3.8,pytorch

10. 实现流程(重点)

11. 損失関数

12. 評価指標

13.UNet論文

14. 源码地址(永久、免费)

15. 独自のタスクに変更する方法

16. 個人的な成長体験

17. プロジェクトの実施

  1. 「セマンティクス」と「セグメンテーション」を理解する方法。

        セマンティックセグメンテーションは人工知能のディープラーニングのコンピュータビジョン分野に位置づけられており、ターゲット検出、画像分類、インスタンスセグメンテーション、姿勢推定などの関連タスクが含まれます。

        コンピューター ビジョンにおける画像認識タスクには、次の 4 つの主要なカテゴリがあります。

                (1) 分類 -分類:画像やビデオの判定にどのような目的が含まれているのか、という「何?」​​という問題を解決します。

                (2) 測位-位置: 「どこにあるのか?」という問題を解決します。つまり、ターゲットの位置を特定します。

                (3) 検出: 「それはどこですか? それは何ですか?」という問題を解決します。つまり、ターゲットの位置を特定し、ターゲット オブジェクトが何であるかを知ります。

                (4) セグメンテーション: 「各ピクセルがどのターゲットまたはシーンに属するか」という問題を解決するために、インスタンス セグメンテーション (Instance-level) とシーン セグメンテーション (Scene-level) に分けられます。

        セマンティクスは人々が言語で議論できる意味を持つことを指し、セグメンテーションは画像の分割を指します。セマンティック セグメンテーションでは、画像全体の各部分を分離して、各部分に特定のカテゴリの意味を持たせることができます。ターゲット検出とは異なり、ターゲット検出は画像内でターゲットを見つけて枠を付けて分類するだけです。セマンティック セグメンテーションでは、ストロークの形式を使用して、画像全体を隙間なく各領域に分割します。各領域はカテゴリです。カテゴリがない場合は、デフォルトで背景になります。

        要約すると、セマンティック セグメンテーションは、画像内の各ピクセルを事前定義されたセマンティック カテゴリの 1 つに割り当てることを目的としています。従来のオブジェクト検出タスクとは異なり、セマンティック セグメンテーションでは、画像内に存在するオブジェクトを識別するだけでなく、各ピクセルにセマンティック ラベルを割り当てる必要もあります。これは、コンピューターが画像内のオブジェクトをより洗練された正確に理解し、視覚情報をより有効に活用し、さまざまな分野でよりインテリジェントなアプリケーションを提供するのに役立ちます。

2. セマンティックセグメンテーションの原理

        画像全体の各部分を識別するということは、ピクセル ポイントまで正確であることを意味します。したがって、セマンティック セグメンテーションは、実際には画像内の各ピクセル ポイントを分類し、各ポイントのカテゴリ (背景、人物、車、馬に属するなど) を決定することです。 、など)領域を分割します。

        では、ピクセルに色を付けるにはどうすればよいでしょうか?

        セマンティック セグメンテーションの出力は画像分類ネットワークと同様で、画像分類カテゴリの数は 1 次元の 1 ホット マトリックスになります。たとえば、図: 5 つのカテゴリ [0,1,0,0,0]。セマンティック セグメンテーション タスクの最終出力特徴マップは、元の画像と同様のサイズの 3 次元構造であり、チャネル数はカテゴリの数になります。チャネルの数はカテゴリの数であり、各チャネルによってマークされたピクセルは画像内のカテゴリの位置です。最後に、argmax を使用して各チャネルの有用なピクセルを取得して画像を合成し、異なる色が使用されますさまざまなカテゴリを表すために。以下に示すように:

        入力: カラーの元の画像 [3,256,256]。出力: グレースケール画像 [256,256]

        注: このプロジェクトの出力結果 y_true は、カラー画像分類の代わりにグレースケール画像分類を使用しており、カテゴリ リストは [0,1,2,3....class] です。 0 は背景色の黒を表し、それに続く各整数はカテゴリを表します。プロジェクトの watch_result.py スクリプトで各カテゴリを強調表示できます。

3. セマンティックセグメンテーションの意味

       CNN の利点は、多層構造により特徴を自動的に学習でき、複数のレベルで特徴を学習できることです。たとえば、浅い畳み込み層はより小さな知覚フィールドを持ち、一部の局所領域の特徴を学習できますが、より深い畳み込み層はより大きな知覚フィールドを持ち、より抽象的な特徴を学習できます。これらの抽象的な特徴は分類に非常に役立ち、分類パフォーマンスの向上に役立ちます。画像に含まれるオブジェクトのカテゴリを非常によく判断できます。ただし、欠点は明らかです。これらの抽象的な特徴は、オブジェクトのサイズ、位置、方向の影響を受けにくいです。これには、画像内の各ピクセルのカテゴリを決定し、正確なセグメンテーションを実行するセマンティック セグメンテーションが必要です。セグメンテーションはピクセル レベルで行われます。 。

4. セマンティック セグメンテーションの適用シナリオ

自動運転:自動運転車は安全に走行できるよう「環境認識」機能を備えています。

医用画像診断: この機械は医用画像をインテリジェントに分析できるため、医師の負担が軽減され、細胞の分割と認識、肺の形状診断、腫瘍、病変、異常組織の特定などの診断検査の実行に必要な時間が大幅に短縮されます。

ドローンの着陸地点の判定:ドローンが着陸する前に、地上の空き地の画像を識別・分割し、その大きさや形状から安全に着陸できるかどうかを判定します。

5. Unetの利点

Unet は人気のあるセマンティック セグメンテーション モデルであり、他の多くのセマンティック セグメンテーション アルゴリズムに比べて次のような利点があります。

  1. 高精度: Unet は多くの公開データセットで優れた結果を達成し、多くの場合に高精度のセグメンテーションを実現します。

  2. 小規模サンプルの学習: Unet にはパラメーターとトレーニング可能な変数が少ないため、小規模サンプルの学習に対してより堅牢になり、データセットが小さい場合やサンプルが不均衡な状況に適しています。

  3. マルチタスク学習: Unet は、セグメンテーション、検出、分類などの複数のタスクを同時に処理できるため、複数のタスクを 1 つのモデルに統合します。

  4. データ拡張: Unet はセグメント化されたオブジェクトの形状とコンテキスト情報を考慮するため、回転やミラーリングなどのデータ拡張技術を通じて効果的なデータ拡張を実行し、モデルをより堅牢にすることができます。

  5. 高速推論: Unet はシンプルで直観的なアーキテクチャとパラメーター共有を備えているため、推論が高速になります。さらに、Unet は GPU アクセラレーションを使用して、推論速度をさらに向上させることができます。

     全体として、Unet は精度、小規模サンプル学習、マルチタスク学習、データ強化、および高速推論の点で利点があり、人気のあるセマンティック セグメンテーション アルゴリズムとなっています。

医療分野のセマンティック セグメンテーション タスクでは、Unet ネットワークの利点が特に重要です。

        トレーニング データが少ない: 医療画像データは多くの場合、入手が難しく、ラベル付けも困難です。 Unet ネットワークは、スキップ接続を使用してエンコーダーの低レベルの機能とデコーダーの高レベルの機能を組み合わせることで、少ないトレーニング データでより良いパフォーマンスを達成できます。

        優れた汎化パフォーマンス: 医療画像データは、多くの場合、ノイズ、アーティファクト、およびさまざまな画像条件の影響を受けます。 Unet ネットワークは、アップサンプリング操作にデコンボリューション層 (転置畳み込み) を使用することで、微細な空間情報の損失を回避し、それによってより優れた汎化パフォーマンスを実現します。

        大きなサイズの画像を処理できる: 医療画像は通常、より高解像度でサイズが大きいため、大きなサイズの画像を処理できるモデルが必要です。 Unet ネットワークは、ダウンサンプリングにプーリング操作を使用し、アップサンプリングにデコンボリューション層を使用することで、大きなサイズの画像を効果的に処理できます。

        マルチスケール セグメンテーション: 医療画像内の構造のサイズと位置は大きく異なるため、マルチスケールの特徴表現を考慮する必要があります。スキップ接続とアップサンプリング操作を使用することで、Unet ネットワークは複数のスケールの特徴マップから情報を抽出して融合し、マルチスケール セグメンテーションを実現できます。

6. 事前知識の備蓄

(1) エンコーダ-デコーダ: エンコーダは特徴を抽出するために使用される分類ネットワークであり、デコーダは以前に失われたエンコーダの空間情報を徐々に復元します。このタイプの方法には一定の効果があり、情報の一部を復元できますが、その後、すべての情報が失われており、完全に復元することはできません。典型的なアルゴリズム構造には、segnet/refineNet が含まれます。

(2) アップサンプリング: 畳み込みニューラル ネットワークでは、入力画像が畳み込みニューラル ネットワーク (CNN) を通じて抽出されるため、出力のサイズが小さくなることがよくあり、場合によっては、さらなる処理のために画像を元のサイズに復元する必要があります。この計算は、画像を小さい解像度から大きい解像度にマッピングする操作です。 Unet では、解像度を上げるためにダウンサンプリングされた特徴マップを元の画像のサイズに拡大し、元の画像の画素点に基づいて分類を行う必要があります。コンボリューションでは (1*128*40*40) => (1*64*40*40) のようにチャネル数が変更され、アップサンプリングでは (1*128*40*40) => ( 1*128*80*80)。方法: 双線形補間、転置畳み込み。

(3) 特徴融合: CNN は畳み込みとプーリングのプロセス中に画像の詳細を失う、つまり特徴マップのサイズが徐々に小さくなるため、オブジェクトの具体的な輪郭や各ピクセルがどのオブジェクトに属しているかをうまく指摘することができません。正確なセグメンテーションを実現します。目的は、画像から抽出された特徴を組み合わせて、入力特徴よりも識別力の高い特徴にすることです。機能を正しく融合する方法は難しい問題です。異なるスケールの特徴を融合することは、セグメンテーションのパフォーマンスを向上させる重要な手段です。低レベルの特徴は解像度が高く、より多くの位置情報と詳細な情報を含みますが、畳み込みが少ないため、セマンティクスが低くなり、ノイズが多くなります。高レベルの機能には強力なセマンティック情報がありますが、解像度が低く、細部の認識が不十分です。特徴融合では、複数の画像特徴を包括的に利用して、複数の特徴の相補的な利点を実現し、より堅牢で正確な認識結果を取得します。 Unet の同時アップサンプリングは、ダウンサンプリングの高レベルの機能を融合することです。 2 つの古典的な機能融合方法

     a.) concat: 一連の機能を融合し、連続する機能を直接接続します。 2 つの入力フィーチャ x および y の次元が p および q の場合、出力フィーチャ z の次元は p+q です。高さと幅の両方が一貫していることを確認してください。画像のすべての情報を完全に保持できますが、チャネル C の数が増加し (*2)、その後の畳み込みのパラメータが増加します。 (1*64*40*40)add(1*64*40*40)=>(1*128*40*40) など

     b.) 追加: 並列戦略、これら 2 つの特徴ベクトルを合成ベクトルに結合します入力特徴 x および y の場合、z=x+iy (i は虚数単位)。チャネル数 C+high+width が 2 つの間で一貫していることを確認してください。コンカントほど情報量はありませんが、C+high+widthは融合後も変化しません。例: (1*64*40*40)add(1*64*40*40)=>(1*64*40*40)

(4) FPNアイキャッチ画像ピラミッド

        まず、元の画像をスケーリングしてさまざまなサイズの画像を取得し、次に各サイズの画像に基づいてさまざまなサイズの特徴マップを生成し、最後にマルチサイズの特徴マップに基づいて予測を行います。この方法では、各サイズの画像の特徴マップを生成する必要があるため、より多くのコンピューティング リソースとメモリ リソースが消費されます。

(5) 8ビット画像とは何ですか?シングルチャネルグラフとは何ですか?グレースケール画像とは何ですか?彼らの間の関係は?

       8 ビット画像は、各ピクセルが 8 ビットの 2 進数 (つまり 1 バイト) を使用して色または輝度の値を表すデジタル画像です。各 2 進数には、0 ~ 255 の 256 個の値を指定でき、さまざまな色またはグレースケール レベルを表します。標準の RGB 色空間では、8 ビット イメージには赤、緑、青の 3 つのチャネルが含まれています。各チャネルは 8 ビットの 2 進数を使用して各ピクセルの色の強度を表すため、ピクセルは 256x256x256 の異なる色を持つことができます。約1,670万種。 8 ビット画像は、Web デザイン、写真、画像編集などで広く使用されている画像形式です。ファイルサイズが小さく、処理が簡単で互換性が高いという利点があり、ピクセルの色やコントラストを調整することにより、特定の画像処理や改善を行うこともできます。 8 ビット画像には豊富な色情報がありますが、各チャンネルの各ピクセルは 8 つの 2 進数のみを使用するため、表現できる色の範囲と詳細は、より高いビット深度の画像よりも小さくなり、より制限されることに注意してください。カラー画像と 8 ビット画像の間には一定の関係があります。通常、RGB 色空間では、カラー画像は 3 つのカラー チャネル (赤、緑、青) で構成され、各チャネルは 8 ビットの 2 進数を使用して各ピクセルの色の強度を表します。したがって、ピクセルは 256x256x256 の異なる色を持つことができ、これは約 1,670 万色になります。このカラー モードのカラー イメージは、24 ビット カラー イメージまたはトゥルー カラー イメージとも呼ばれます。ただし、カラー画像が 8 ビット画像に変換される場合、各ピクセルは 8 ビットの 2 進数を使用して色情報を表すため、画像はより小さいサイズに圧縮されます。この場合、画像内の各ピクセルで使用できる色は 256 色のみであるため、画像の色の精度は比較的低くなりますが、ファイル サイズも比較的小さくなります。 8 ビットマップでは、インデックス付きカラー テクノロジを使用して各ピクセル値をカラー テーブル内のカラーにマッピングすることで、ファイル サイズを小さく保ちながら、適切なカラー精度を提供することもできます。一般に、カラー画像と 8 ビット画像はデジタル画像であり、さまざまなアプリケーションのニーズを満たすために、それらの間には変換と圧縮の関係があります。カラー イメージは、より高い色の精度と豊かな視覚効果を提供できますが、8 ビット イメージは、小さいファイル サイズと低い色の要件を必要とするアプリケーション シナリオにより適しています。

       シングル チャネル イメージとは、カラー モードでカラー チャネルが 1 つだけ含まれるイメージを指します。たとえば、グレースケール イメージでは、各ピクセルは輝度値を表すチャネルを 1 つだけ持ちます。インデックス付きカラー イメージでは、各ピクセルはカラー インデックスを表すチャネルを 1 つだけ持ちます。RGB カラー空間では、カラー チャネルのうち 2 つが次のように設定されます。 0、赤、緑、青のチャネルのみを含む単一チャネル画像を取得できます。シングルチャンネル画像は 1 つのチャンネルからの情報のみを保存する必要があるため、ファイル サイズが小さくなり、処理速度が速くなります。同時に、次のような特殊なアプリケーション シナリオもあります。 1. グレースケール画像は、医療画像、テキスト認識、およびコンピューター ビジョンの分野でよく使用されます。 2. モノクロ画像は、プリントやニットアイテムのデザインに使用でき、場合によっては白黒のアートワークの作成に使用できます。 3. カラーインデックス付き画像は、低解像度の画面、古いコンピュータ ゲーム、組み込みシステムなど、リソースに制約のある環境で広く使用されています。全体として、シングルチャネル画像は、重要な情報を失うことなく、より効率的な画像処理を提供する便利な画像タイプです。

        グレースケール イメージは、グレースケール イメージまたはシングル チャネル イメージとも呼ばれ、色情報を持たないデジタル画像です。グレースケール イメージでは、各ピクセルの明るさの値は、対応する領域の強度または明るさのレベルを表し、白黒写真や色情報のないその他のイメージを表すためによく使用されます。グレースケール イメージは単一のチャネルで構成され、そのチャネル内の各ピクセルは 1 つのグレー レベルのみを持ちます。標準の 8 ビット グレースケール イメージでは、各ピクセルは 8 ビットを使用して表現されるため、最も暗い黒を表す 0 から最も明るい白を表す 255 まで、256 の異なるグレー レベルが存在します。ただし、グレースケール イメージは、精度を高めるために 16 ビット以上のビット深度を使用して表現することもできます。グレースケール画像は、医療画像、コンピュータ ビジョン、画像処理、コンピュータ グラフィックスなどの多くの分野で広く使用されています。グレースケール画像は、そのシンプルさと要件の低さにより、コンピューター ビジョン アルゴリズムのテストと検証にもよく使用されます。

        8 ビット画像とグレースケール画像には、どちらも 8 ビットの 2 進数 (つまり 1 バイト) を使用して各ピクセルの輝度値を表すため、一定の関係があります。ただし、それらの間にはいくつかの違いがあります。 8 ビット画像には 3 つのカラー チャネル (赤、緑、青) が含まれており、各チャネルは 8 ビットの 2 進数を使用して各ピクセルの色の強度を表します。これは、ピクセルが 256x256x256 の異なる色を持つことができることを意味し、これは約 1,670 万色になります。標準の 8 ビット グレースケール イメージでは、各ピクセルはその輝度値を 8 ビットの 2 進数で表し、可能な輝度レベルは 256 のみで、最も暗い黒の 0 から最も明るい白の 255 までの範囲です。したがって、グレースケール画像には白黒のみが含まれ、色の情報はありません。 8 ビット イメージとグレースケール イメージはどちらも同じビット深度 (8 ビット) を使用しますが、データの表現方法と色情報が異なります。 8 ビット画像はより豊富な色情報を持っており、ネットワーク設計、写真、画像編集など、カラー画像を表示する必要があるシナリオに適しています。グレースケール画像には 1 チャネルの輝度情報しか含まれていないため、通常は医療画像、コンピュータ ビジョン、および画像処理に適しています。

       シングルチャンネル画像とグレースケール画像は密接に関連した概念です。グレースケール イメージは、各ピクセルが輝度レベルを表すグレー値を 1 つだけ持つシングル チャネル イメージです。つまり、グレースケール イメージは、色空間で輝度チャネルのみを使用するシングル チャネル イメージです。標準の 8 ビット グレースケール イメージでは、各ピクセルは 8 ビットの 2 進数を使用してその輝度値を表し、最も暗い黒を表す 0 から最も明るい白を表す 255 までの 256 の異なるグレー レベルを持つことができます。これらのグレー レベルは、グレースケール イメージ内の各ピクセルの輝度値を表し、色関連の情報は含まれません。したがって、グレースケール イメージは、グレースケール情報の 1 つのチャネルのみを含む単一チャネルのイメージです。ただし、すべての単一チャネル画像がグレースケール画像であるわけではありません。たとえば、インデックス付きカラー モードでは、各ピクセルの値は、カラー テーブル内の特定の色に対応するカラー インデックスを表します。このインデックス付きカラー テクノロジーにより、比較的小さなファイル サイズを維持しながら、シングル チャネル画像で適切なカラー精度を提供できるようになります。したがって、シングル チャネル イメージとグレースケール イメージは、関連しているとはいえ、完全に同等というわけではありません。

このプロジェクトは、元の RGB カラー画像をグレースケール画像に変換することによって処理されます。

(6) 混同行列とは何ですか?イオウって何ですか?

 図に示すように、左側がラベルマップ (y_true)、右側が予測マップ (y_pred) です。

       予測結果については、モデルのセグメンテーションの品質を肉眼で観察することに加えて。モデルの品質を判断するために、より正確な数値を使用するにはどうすればよいでしょうか?そのためには評価指標が必要です。ディープラーニングにおけるコンピュータビジョンの分野では、セマンティックセグメンテーション、ターゲット検出、インスタンスセグメンテーション、歩行者の再識別など、さまざまな画像タスクが頻繁に行われます。予測画像内のターゲット領域の分類結果を比較する必要があります。セマンティック セグメンテーションの場合、2 つの画像 (y_true、y_pred) を統計的に比較して、正のピクセルの数が正しく予測されたか、正であるはずのピクセルの数が誤って予測されたかを調べる必要があります。ピクセルは正しく予測されましたが、負の例であるはずのピクセルの数が誤って予測されました。

TruePositive(A): 実際の値と予測値が同じであることを示します。タイプ A の TP は、実際の値と予測値が同じであるというだけです。これは、セル 1 の値が 15 であることを意味します。

FP

FalsePositive(A): 実際の値が負であることを示します。この場合はクラス B とクラス C ですが、モデルはそれが正、つまりクラス A であると予測します。 TP値を除いた、対応する列の値を加算したものです。

FalsePositive(A) = (セル 4 + セル 7): 7+2=9

テネシー州

TrueNegative(A): 実測値と予測値は同じ意味 A の場合: クラス B とクラス C は陰性分類です。 A 以外のすべての行と列の値の合計です。

TrueNegative(A) = (セル 5 + セル 6 + セル 8 + セル 9): 15 + 8 +3 + 45= 71

FN

FalseNegative(A): この場合、実際の値は正であり、クラス A ですが、モデルはそれが負であると予測します (つまり、クラス B とクラス C)。 TP値に加えて隣接する行からも計算できます。

FalseNegative(A) = (セル 2 + セル 3): 2 + 3= 5

         そして、これらのデータを上の表のように収束させ、予測が正しかった割合(正解+誤差)を計算し、その割合を数値化した判断に利用することができます。このテーブルは混同行列と呼ばれ、多くの統計指標は混同行列を通じて計算できます。

    精度 - モデル全体
    精度
    感度: 再現率
    特異度

 特異性評価指標—IOU:

IOU (Intersection Over Union) はターゲット検出またはセグメンテーション モデルのパフォーマンスを測定するために使用される指標であり、精度、再現率、精度は機械学習の分類タスクで広く使用されています。 2 つの画像の混同行列。それらの違いは次のとおりです。

  1. 計算方法: IOU は通常、モデル予測結果と実際のラベルの間の交差領域と結合領域の比率を計算するために、ターゲット検出またはセグメンテーション タスクで使用されます。精度、再現率、精度は、二値または多変量分類タスクにおけるモデル予測と実際のラベルの類似性を継続的に比較します。

  2. IOU = TP/(FP+TP+FN)=15/(7+2+15+2+3)= 0.5172

  3. 不均衡なデータに対する感度: IOU は交差比率を計算するため、モデルが大きなカテゴリの詳細をより適切に捕捉することでより高い IOU 値を達成できるため、データが不均衡な場合に問題が発生する可能性があります。適合率、再現率、適合率は、正しい分類と誤った分類の数のみに焦点を当てるため、不均衡なデータをより適切に処理できます。

  4. インジケーターの意味: IOU は、モデルの予測結果と、ターゲット検出またはセグメンテーション タスクにおける実際のラベルの間の類似性を反映します。これは、さまざまなカテゴリに対するモデルのセグメンテーション効果を評価するのに役立ちます。精度、再現率、適合率は、分類タスクの正しさと誤りに重点を置き、さまざまなカテゴリに対するモデルの分類効果を評価するのに役立ちます。

  5. miou は各カテゴリの平均 iou です。このプロジェクトは name_classes=1+1、カテゴリの場合は iou/name_classes です。 、name_classes=2 (デフォルトでは背景は 1 つのクラスとしてカウントされます)、2 つのクラスがある場合は、name_classes=3。 各カテゴリの個別の iou を計算する場合、他のカテゴリのピクセルは負の例とみなされます。

7. セマンティックセグメンテーションプロセス

8. プロジェクトの構造と紹介

 ./datasets: 元の画像、ラベル付きの json 画像、変換された y_true グレースケール画像を保存します

./evaluation: 評価インジケーター スクリプト handle_evaluation.py、入力: y_ture パス + y_pred パス + カテゴリ リスト [0,1,2....num_classes]。 [miou、再現率、精度] を出力します。内容: 各画像のカテゴリごとに iou を計算します。 iou を個別に計算する場合、他のさまざまなカテゴリは背景色とみなされ、すべて 0 に変換されます。これで整数になります

./GPU: プロジェクト環境で GPU 構成が必要な場合は、torch_gpu のオフライン ダウンロード パッケージを保存します。そうでない場合は、後続の環境構成手順に従って自分で構成できます。 CPUで実行する場合は使用する必要はありません

./params: モデルファイルの格納アドレス

./result: 予測結果画像(y_predグレースケール画像)の格納場所

./training_image: トレーニング プロセス中に、トレーニング効果を肉眼で確認できるように、各バッチの最初の画像が撮影されてここに保存されます。

./rename.py: 元のデータ セットの名前を 1.png、2.png、3.png、4.png... の順に変更し、データ セットのパスを入力して実行し、結果を取得します。

./make_mask.py (キーポイント): 元の画像とラベル付きの json ファイルを y_ture に変換し、SegmentationClass に格納します。前の y_ture によれば、それは次のようになります。グレースケール図、y_true の各カテゴリを区別するために、コードの 12 行目まで CLASS_NAMES=['tongue']、デフォルトの名前付け背景の黒は 0、カテゴリ 1 の舌には 1、カテゴリ 2 という名前が付けられますは 2 という名前が付けられ、カテゴリ 3 は 3 という名前が付けられます…。 このプロジェクトにはカテゴリ 舌が 1 つだけあります。名前が 0 から始まる理由については、6. 予備知識のグレースケール画像の理解を参照してください。画像には最大 255 カテゴリまで名前を付けることができます。 、一般に 255 カテゴリは使用されませんが、十分なはずです。 コード コンテンツ: json ファイルのコンテンツ ルールを解析して、ラベル ラベルとポイントを見つけ、空の画像を作成し、ポイントに従ってマークします。点の座標。コンテンツはラベルで埋められます。

./data.py: 画像を torch.tensor 形式に処理し、データセットの数も表示できます

./util.py: data.py と組み合わせて呼び出され、画像サイズを [256*256] に統一する機能です。 [256,256]の空白の長方形を作成し、その空白の長方形に画像を貼り付けて戻ります。

./net.py: Unet ネットワーク構造の構築

./train.py: data.py、util.py、および net.py スクリプトを呼び出して、元のデータ セット パス + y_true パスを介してデータ セットをインポートします。デフォルトでは、16 行目でバッチ サイズを一度に 1 画像に設定し、29 行目で 200 バッチを実行し、50 ラウンドごとに ./params で指定されたファイル パスにモデル結果を保存します。同時に、各バッチの最初のイメージを ./trainning_image ファイル パスに保存します。オプティマイザーは Adam を使用し、損失関数は CrossEntropyLoss マルチクラス クロス エントロピーを使用します。入力: トレーニング セット + テスト セット。出力: トレーニング中のレンダリング +unet.pth モデル

./test.py: 入力: 通常のカラー画像パス、出力: y_pred グレースケール画像の予測結果を ./result に保存します。元の画像を入力した後、画像をテンソル形式に変換し、モデルをロードしてネットワークに送信し、結果を取得します。

./watch_result.py: ./result 内の y_pred によって予測された強調表示されたグレースケール イメージを表示します。同時に、このスクリプトは任意のグレースケール イメージの強調表示された結果を表示することもできます。 、y_true など。 内容: p = np.where(p == 1, 1, 0).astype(float) 予測マップに複数のカテゴリがある場合は、下のラベルの色、その他のカテゴリの色は干渉色とみなされ、すべて背景色 0 として分類されます。

p = np.where(p == 1, 1, 0).astype(float)  

./number_classes.py: (y_true) ラベル マップと (y_pred) 予測マップ カテゴリを表示します。number_classes.py を実行し、ラベル マップと予測マップのパスを入力し、画像を配列に変換し、再整形(-1)して平坦化し、重複を削除すると、画像にどのようなカテゴリがあるかを確認できます

9.設置環境

a.) 指定するパスに仮想環境を作成します (私の環境パスはD:\project\tongue_specialです) < /span>

conda create --prefix D:\envs\handle_Unet python==3.8

b.) 仮想環境をアクティブ化する

conda activate D:/envs/handle_Unet

c.) プロジェクト パスを入力します (私のプロジェクト パスは D:\project\handle_UNet です)

cd D:\project\handle_UNet

d.) GPU オペレーティング環境をインストールします (GPU を使用したくない場合、または GPU がない場合、プログラムは自動的に CPU を識別して使用します)

CUDA 設定、cuDNN、torch-GPU バージョンの 3 つが必須です

インストールチュートリアルのリファレンス:

https://zhuanlan.zhihu.com/p/586913250

CUDA11.3とPyTorch-GPU版のインストール(メモ)_Johngo先輩

torch-GPU バージョン: torch-1.13.1+cu117-cp38-cp38-win_amd64.whl

e.) 仮想環境に入り、プロジェクト パスを入力し、パッケージ化したプロジェクトで使用されるすべての環境パッケージをインストールします。

pip install requirements.txt

エラーが発生した場合は、Baidu でインストール チュートリアルを検索してください。

f.) スクリプトの実行に問題はありません。完了しました。

10. 導入プロセス

a.)

入力入力: 一般的なカラー画像、サイズ制限なし

出力: 予測グレースケール画像、サイズ [256*256]

画像変更プロセス (高解像度画像についてはプロジェクト ドキュメントを参照): 入力 -> 出力

 b.) UNet の紹介: 主に医療分野におけるシンプルで実用的なもの

赤いボックスはダウンサンプリングと特徴抽出部分です. 他の畳み込みニューラル ネットワークと同様に, 画像特徴はスタック畳み込みによって抽出され, 特徴マップはプーリングによって圧縮されます. 特徴抽出部分には Resnet50 や VGG などの優れたネットワークが使用できます.青いボックスはアップサンプリングと画像復元部分です。

最初の部分はバックボーン フィーチャ抽出部分です。バックボーン 部分を使用してフィーチャ レイヤー、つまりバックボーン フィーチャを次々に取得できます。 Unet の抽出部分 VGG と同様に、畳み込みと最大プーリングのスタックです。バックボーン特徴抽出部分を使用して、5 つの予備的な有効特徴レイヤーを取得できます。2 番目のステップでは、これらの 5 つの有効特徴レイヤーを使用して特徴融合を実行します。

2 番目の部分は特徴抽出部分の強化です。バックボーン 部分から取得した 5 つの予備的な有効な特徴レイヤーをアップサンプリングに使用できます。そして、特徴融合 (アップサンプリング結果のチャネルスタッキング) を実行して、すべての特徴を融合した最終的な効果的な特徴レイヤーを取得します。

3 番目の部分は予測部分です。最終的に取得された最後に有効なフィーチャ レイヤーを使用して、各フィーチャ ポイントを分類します。これは同等です。から各ピクセルを分類します。

その他のアルゴリズム構造: 条件付きランダム フィールド: 無向確率グラフ モデル、ピクセル間の相関を増加; GAN 敵対的ネットワーク; DeepLabv1-v3; Dilation10; PSPNet (2016); FCN

 c.) 全体的なフローチャート (高解像度の画像はプロジェクト フォルダーの関連ドキュメントにあります。画像を個別に開き、拡大して確認してください):

  • 適切なアルゴリズムを選択する

        このプロジェクトは舌画像認識です。つまり、ユーザーが舌画像画像を入力し、舌画像領域を識別します。分析の結果、コンピュータ ビジョンの分野のセマンティック セグメンテーションがこのタスクに最適であることがわかり、情報を検索すると、セマンティック セグメンテーションの他のアルゴリズムと比較して、UNet アルゴリズムが医療分野に最も適​​していることがわかりました。したがって、UNet ネットワークがモデル アーキテクチャとして使用されます。次に、UNet 論文のアイデアを勉強し始め、論文に慣れた後、プロジェクト全体のプロセスを計画し、決定しました。

  • データセットの準備

         元の画像を ./datasets/JPEGImages に置き、rename.py を実行して 1.png、2.png、3.png... の順に名前を変更します。

  • データの前処理

         ラベリング: ラベリングの目的は、トレーニング プロセス中に生成される y_pred 予測画像が実際の損失値を持つように、元の画像 y_true を作成することです。これにより、損失がさらに削減され、パラメーターが調整されます。モデルが最適化された後に iou を計算するときに y_true と y_pred があると便利です。

pip install labelme==3.16.7 -i https://mirrors.aliyun.com/pypi/simple/
labelme

         9.b,9.c仮想環境に入り、プロジェクト パスを入力し、labelme をダウンロードして、labelme.exe を起動します。各画像のターゲット領域をマークし、D:\project\handle_UNet\datasets\before に保存します。ラベル付きファイルは .json 形式です。 .json に対応する元のイメージを D:\project\handle_UNet\datasets\before に配置する必要があります。

       次に、スクリプト make_mask.py を実行します。元の画像とラベル付きの json ファイルを y_ture に変換し、SegmentationClass に保存します。前述によると、y_ture はグレースケール画像です。y_true で各カテゴリを区別するため、コードの 12 行目 CLASS_NAMES=['tongue'] では、デフォルトの名前付け背景の黒は 0、カテゴリ 1 の舌の名前は 1、カテゴリ 2 の名前は 2、カテゴリ 3 の名前は 3 です。 ... 。 このプロジェクトにはカテゴリ 舌が 1 つだけあります。名前が 0 から始まる理由については、6. 予備知識のグレースケール画像の理解を参照してください。画像には最大 255 カテゴリまで名前を付けることができます。 、一般に 255 カテゴリは使用されませんが、十分なはずです。すべての処理が完了すると、y_true は指定された ./datasets/SegmentationClass.make_mask に自動的に保存されますが、このとき y_true はグレースケール画像であり、肉眼では真っ黒にしか見えません。

         data.py、utils.py スクリプトを記述します。その内容は、x、y_true を torch.Tensor 形式 [3, 256, 256] [256, 256] に変換することです。コンピューター ビジョンのタスクでは、画像を値に変換する必要があるためです。計算前にコンピュータで認識できるもの。

 

 

  • ネットワークアーキテクチャの構築

UNet ネットワーク構造に従って、アップサンプリング + コンボリューション + ダウンサンプリングが UNet クラスにカプセル化されます。

self.out=nn.Conv2d(64,num_classes,3,1,1) の内容:

  • nn.Conv2d: 2 次元畳み込み演算、つまり 2 次元空間での入力に対する畳み込み演算の使用を示します。
  • 64:畳み込み層の入力チャンネル数が64であることを示します。
  • num_classes:畳み込み層の出力チャネル数がnum_classesであることを示します。
  • 3: コンボリューション カーネルのサイズが 3x3 であることを示します。
  • 1: 畳み込み演算のステップサイズが 1 であることを示します。ここで、ステップ サイズとは、コンボリューション カーネルが毎回スライドする距離を指します。
  • 1: コンボリューション カーネルの周囲のパディング値が 1 であることを示します。ここで、パディングとは、コンボリューション カーネルがエッジ ピクセルを処理できるように、入力データの周囲のピクセルの円を値 0 で埋めることを指します。

したがって、このコード行は、64 個の入力チャネルと 5 個の出力チャネルを備え、畳み込みカーネル サイズが 3x3、ストライドが 1、パディング値が 1 の畳み込み層を作成します。この畳み込み層は、画像分類、オブジェクト検出、画像セグメンテーションなどのタスクの深層学習モデルで使用できます。

  • 電車

        入力: トレーニング セット + テスト セット。出力: トレーニング中の +unet.pth モデルのレンダリング       

        data.py、util.py、net.py スクリプトを呼び出して、元のデータ セット パス + y_true パスを介してデータ セットをインポートします。デフォルトでは、行 16 はバッチ サイズを一度に 1 画像に設定します。デフォルトでは、行 29 は 200 バッチを実行し、各ラウンドで 1 回損失を出力し、50 回ごとに ./params で指定されたファイル パスにモデル結果を保存します。ラウンドします。オプティマイザーは Adam を使用し、損失関数は CrossEntropyLoss マルチクラス クロス エントロピーを使用します。

        同時に、各バッチの最初の画像が ./training_image ファイル パスに保存されます。

  • テスト

Unet 予測中に、最終的なピクセルレベルのセグメンテーション結果を取得するには、次の手順を実行する必要があります。

入力画像を PyTorch テンソルに変換し、GPU に移動します (必要な場合)。
トレーニングされた Unet モデルを使用して入力テンソルに対して順伝播計算を実行し、出力を取得します。予測テンソル 出力;
出力予測テンソル 出力の場合、チャネル番号の方向に沿って各ピクセルの予測確率が最も高いカテゴリ番号を見つけます。つまり、torch.argmax() を使用します。関数は 2 番目の次元 (つまり、チャネルの数) に沿った最大値を取り、その結果、形状 (H, W) の 2 次元整数テンソルが得られます。
出力予測テンソル out の次元を削減して、不必要なバッチ サイズとチャネル番号の次元を削除します。ここで、トレーニング段階では、入力データは通常バッチ (バッチ サイズ) でロードされるため、トレーニング画像の形状は通常 (B、C、H、W) になることに注意してください。ここで、B はバッチ サイズを表し、 C はチャンネル番号 (つまり、カテゴリーの数) を表し、H と W はそれぞれ画像の高さと幅を表します。ただし、テスト段階では通常、単一の画像のみが処理されるため、入力テンソル形状が (1, C, H, W) になるように、torch.unsqueeze() メソッドを通じて新しいバッチ サイズの次元を追加する必要があります。 torch.squeeze() メソッドは、冗長なバッチ サイズの次元とチャネル番号の次元を削除することができ、その結果、形状 (H, W) の 2 次元の整数テンソルが得られます。ただし、後続の視覚化関数の要件を満たすために、バッチ サイズのディメンションを再度追加する必要があります (つまり、torch.unsqueeze() メソッドを使用します)。
最終的な出力予測結果 out は、(1, H, W) の形状を持つ 3 次元整数テンソルであり、入力画像上のモデルのピクセルレベルのセグメンテーション結果を表します。

        モデルをロードし、入力: 通常のカラー画像パス、出力: y_pred グレースケール画像予測結果を ./result に保存します。元の画像を入力した後、画像をテンソル形式に変換し、モデルを読み込み、[3,256,256]をネットワークに送信し、結果を取得します。

        モデルの視覚化。グレースケール イメージ *255 を変換してハイライト イメージを取得します。予測の精度と真の値を視覚的に判断します。 内容: p = np.where(p == 1, 1, 0).astype(float) 予測マップに複数のカテゴリがある場合は、下のラベルの色、その他のカテゴリの色は干渉色とみなされ、すべて背景色 0 として分類されます。

  • 評価モデル

入力: y_ture パス + y_pred パス + カテゴリ リスト [0,1,2....num_classes]。

出力 [miou、リコール、精度]

2 つの間の混同行列を計算し、MIOU を計算します

 

  • 展開する

 11.损失函数

       IOU との違いは、同じ評価指標ではありますが、マルチクラスクロスエントロピーと IOU は使用される場所が異なることです。マルチクラス クロス エントロピーは train.py の 25 行目で使用されており、トレーニング プロセス中に、生成された y_pred マップ内の各ピクセルには独自のカテゴリがあります。マルチクラスクロスエントロピーの機能は、y_predの各ピクセルの分類結果とy_trueの真値ピクセルカテゴリを修正し、モデルパラメータを継続的に調整および最適化することです。 IOU は、モデルのトレーニング後に生成される y_pred と y_true を評価し、モデルの品質を判断するために使用されます。

(1) クラス エントロピー ロス バイナリ分類またはマルチクラス クロス エントロピー ロス。各ピクセルを分類する際の損失。バイナリのクロスエントロピー損失は次のとおりです。 BCELOSS: binary_cross_entropy

(2) クラスピクセルの不均衡を考慮した焦点損失。たとえば、写真内の空と人の比率が違いすぎる。カテゴリに大きな重みを与えて、その重要性を高めることができます。

 12.評価指標

(1) 和集合に対する平均積分 (MIoU) は、ターゲット検出と同様に、2 つのセットの交差比率を計算します。2 つのセットは、グラウンド トゥルースと予測値です。セグメンテーション)、交差と和集合の比率です。 、平均交差および結合比率は、さまざまなタイプの交差および結合比率の平均です。このような評価指標は、対象の捕捉度合い(予測ラベルとアノテーションをできるだけ一致させる)を判断することができ、モデルの精度(和集合をできるだけ重畳させる)を判断することもできる。 このプロジェクトで使用

 

IOU (Intersection Over Union) はターゲット検出またはセグメンテーション モデルのパフォーマンスを測定するために使用される指標であり、精度、再現率、精度は機械学習の分類タスクで広く使用されています。それらの違いは次のとおりです。

  1. 計算方法: IOU は通常、モデル予測結果と実際のラベルの間の交差領域と結合領域の比率を計算するために、ターゲット検出またはセグメンテーション タスクで使用されます。精度、再現率、精度は、二値または多変量分類タスクにおけるモデル予測と実際のラベルの類似性を継続的に比較します。

  2. IOU = TP/(FP+TP+FN)=15/(7+2+15+2+3)= 0.5172

  3. 不均衡なデータに対する感度: IOU は交差比率を計算するため、モデルが大きなカテゴリの詳細をより適切に捕捉することでより高い IOU 値を達成できるため、データが不均衡な場合に問題が発生する可能性があります。適合率、再現率、適合率は、正しい分類と誤った分類の数のみに焦点を当てるため、不均衡なデータをより適切に処理できます。

  4. インジケーターの意味: IOU は、モデルの予測結果と、ターゲット検出またはセグメンテーション タスクにおける実際のラベルの間の類似性を反映します。これは、さまざまなカテゴリに対するモデルのセグメンテーション効果を評価するのに役立ちます。精度、再現率、適合率は、分類タスクの正しさと誤りに重点を置き、さまざまなカテゴリに対するモデルの分類効果を評価するのに役立ちます。

  5. Miou は各カテゴリの iou の平均値です このプロジェクトは name_classes=1+1, iou/name_classes です 1 カテゴリの場合は name_classes=2 (デフォルトでは背景も 1 カテゴリとしてカウントされます) 2 カテゴリの場合は name_classes=2 、name_classes=3。

(2) ピクセル精度: 全ピクセル数に対する正しく分類されたピクセル数の比率。

(3) ピクセル精度平均 (MPA): PA の変形で、クラス内のすべてのピクセルの数 (グラウンド トゥルース) に対する各クラスの正しく分類されたピクセルの数の比、およびすべてのクラスの平均。

13.Uネット紙

CNKI検索:

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

14.ソースコードアドレス

無料の永久リンク:https://download.csdn.net/download/weixin_46412999/87690385

15. 独自のタスクに変更する方法

a.)make_mask.py、12行目でCLASS_NAMESを独自のカテゴリに変更します(タグ付け時に指定したカテゴリである必要があります)、27行目で元の画像がjpgの場合、pngをjpgに変更します

b.) train.py、15 行目 num_classes=n+1、n をカテゴリの数に変更します。 16 行目で、batch_size は 1 ラウンドでトレーニングする画像の数に変更されます。行 29 のエポックをトレーニングしたいラウンドに変更し、行 38 %1 を各ラウンドの損失を印刷する画像の枚数に変更し、行 47 %50 をモデルを保存するラウンドの数に変更します。

c.)handel_evaluation.py、行 42 [0,1] をカテゴリ リストに変更します。たとえば、3 つのカテゴリは [0,1,2,3]、5 つのカテゴリは [0,1,2,3 ,4, 5]

16.個人的な経験

ゼロから始める:

深層学習におけるセマンティック セグメンテーションの役割を理解する

セマンティック セグメンテーションの原理を理解する

評価指標を理解する

セマンティック セグメンテーションに適した UNet アルゴリズム モデルを理解して選択し、論文を研究する

アップサンプリング、ダウンサンプリング、特徴融合、エンコーダー/デコーダー、画像処理などの原理を理解します。

GPU環境構成を理解する

コンピュータが画像データをどのように理解して処理するかを理解する (さまざまなチャネル表現、画像内の各カテゴリの数の計算: すべてのピクセルの重複排除)

手写所有脚本包括{ { { {

make_mask.pyを手書きしてタグ付けされたjson形式をy_tureに変換します

手書きの data.py、utils.py、rename.py などのデータ前処理コード、

手書きの UNnet ネットワーク構造

手書きのトレーニング コード

手書きのテストコード

手書きの MIOU 評価インジケータ コード}}}}

そしてすべての知識を記録して、見たとおりのブログにします

参考ブロガーリンク:

画像セグメンテーション UNet のハードコアな説明 (unet コードの表示)_bilibili_bilibili

17. 事業実施申請

 

おすすめ

転載: blog.csdn.net/weixin_46412999/article/details/128248726