PyTorch ~ セマンティック セグメンテーション フレームワーク

3つをシェアします~~

使用した VOC データセットへのリンクが記事内で公開されています。事前トレーニング済みモデルは Github にアップロードされています。私は環境を使用しています。モデルをダウンロードして予測を行うことができますColab pro

コードリンク:  https://github.com/lixiang007666/segmentation-learning-experiment-pytorch

説明書:

  1. VOC データセットをダウンロードし、JPEGImages SegmentationClass2 つのフォルダーをデータ フォルダーに配置します。

  2. ターミナルをターゲット ディレクトリに切り替え、実行してpython train.py -hトレーニングを表示します。

 

トレーニング用のモデルと GPU 番号を選択します (例: 実行)python train.py -m Unet -g 0

  1. 予測predict.pyにはモデルを手動で変更する必要があります

FCN をよく知っている場合は、d2l説明 (ディープラーニングの実践) を最後の部分まで読み飛ばしていただいても構いません。

2つのデータセット

VOC データセットは一般的にターゲット検出に使用されますが、2012 バージョンではセマンティック セグメンテーション タスクが追加されました。

基本データ セットには、1464 枚の画像を含むトレーニング セット、1449 枚の検証セット、1456 枚のテスト セットが含まれます。オブジェクトには合計 21 のカテゴリがあります。

PASCAL VOC セグメンテーション タスクでは、オブジェクトのカテゴリが合計 20 あり、他のコンテンツが背景カテゴリとして使用されます。赤は航空機カテゴリを表し、黒は背景を表し、航空機の境界はベージュで描画されます (次のように見えます)。白) の線は、セグメンテーションのあいまいな領域を示します。

このうち、セグメンテーション ラベルはすべて png 形式の画像であり、実際には単一チャネルのカラー インデックス画像であり、画像と同じサイズの単一チャネルのインデックス画像に加えて、画像には 256 のリストも格納されていますカラー値 (パレット) では、各インデックス値はパレット内の RGB カラー値に対応するため、単一チャネルのインデックス マップ + パレットでカラー マップを表すことができます。

元の画像:ここに画像の説明を挿入

タグ:ここに画像の説明を挿入

画像を選択すると、1 つの画像セグメントに 3 つ以上のカテゴリがあり、各画像のカテゴリが固定されていないことがわかります。

3 完全畳み込みニューラル ネットワーク

セマンティック セグメンテーションでは、画像内のすべてのピクセルを分類できます。完全畳み込みネットワーク (FCN) は、畳み込みニューラル ネットワークを使用して、画像ピクセルからピクセル カテゴリへの変換を実現します。画像分類またはオブジェクト検出セクションで以前に紹介した畳み込みニューラル ネットワークとは異なり、これは、全卷积网络将中间层特征图的高和宽变换回输入图像的尺寸紹介した転置畳み込み層によって実現されます。したがって、出力クラス予測はピクセル レベルで入力画像と 1 対 1 の対応関係を持ちます。空間次元での位置が与えられると、チャネル次元での出力はその位置に対応するピクセルのクラス予測になります。

%matplotlib inline
import torch
import torchvision
from torch import nn
from torch.nn import functional as F
from d2l import torch as d2l

 3.1 ネットワーク構造 

以下では、ImageNet データセットで事前トレーニングされた ResNet-18 モデルを使用して画像特徴を抽出し、このネットワーク インスタンスを として示しますpretrained_netモデルの最後の数層には、グローバル平均プーリング層と完全接続層が含まれますが、これらは完全畳み込みネットワークでは必要ありません。 完全な畳み込みネットワーク インスタンスを作成しますnetResnet-18 のほとんどの事前トレーニング層を複製しますが、最終的なグローバル平均プーリング層と出力に最も近い完全に接続された層は削除されます。  

 

num_classes = 21
net.add_module('final_conv', nn.Conv2d(512, num_classes, kernel_size=1))
net.add_module('transpose_conv', nn.ConvTranspose2d(num_classes, num_classes,
                                    kernel_size=64, padding=16, stride=32))

3.2 転置畳み込み層の初期化

アップサンプリングは通常、画像を拡大するために使用されます。共一次補間は、一般的に使用されるアップサンプリング手法の 1 つであり、転置畳み込み層の初期化にもよく使用されます。

双一次補間を説明するために、入力イメージが与えられ、アップサンプリングされた出力イメージ上の各ピクセルを計算すると仮定します。双線形補間のアップサンプリングは畳み込み層を転置することで実現でき、カーネルは次の bilinear_kernel 関数によって構築されます。スペースの制限のため、アルゴリズムの原理については説明せずに、bilinear_kernel 関数の実装のみを示します。 

def bilinear_kernel(in_channels, out_channels, kernel_size):
    factor = (kernel_size + 1) // 2
    if kernel_size % 2 == 1:
        center = factor - 1
    else:
        center = factor - 0.5
    og = (torch.arange(kernel_size).reshape(-1, 1),
          torch.arange(kernel_size).reshape(1, -1))
    filt = (1 - torch.abs(og[0] - center) / factor) * \
           (1 - torch.abs(og[1] - center) / factor)
    weight = torch.zeros((in_channels, out_channels,
                          kernel_size, kernel_size))
    weight[range(in_channels), range(out_channels), :, :] = filt
    return weight

転置畳み込み層によって実装される双線形補間を使用したアップサンプリングを試してください。入力の高さと幅を 2 ​​倍にする転置畳み込み層を構築し、その畳み込みカーネルを bilinear_kernel 関数で初期化します。

conv_trans = nn.ConvTranspose2d(3, 3, kernel_size=4, padding=1, stride=2,
                                bias=False)
conv_trans.weight.data.copy_(bilinear_kernel(3, 3, 4));

完全な畳み込みネットワークでは、双線形補間によるアップサンプリングで転置畳み込み層を初期化します。1×1 畳み込み層の場合、Xavier 初期化パラメーターを使用します。ワオソフト アイオット http://143ai.com 

W = bilinear_kernel(num_classes, num_classes, 64)
net.transpose_conv.weight.data.copy_(W);

3.3 トレーニング

損失関数と精度の計算は画像分類と基本的に異なりません。転置された畳み込み層のチャネルを使用してピクセルのクラスを予測するため、チャネルの次元は損失計算で指定されます。さらに、モデルは、予測されたクラスがピクセルごとに正しいかどうかに基づいて精度を計算します。

def loss(inputs, targets):
    return F.cross_entropy(inputs, targets, reduction='none').mean(1).mean(1)

num_epochs, lr, wd, devices = 5, 0.001, 1e-3, d2l.try_all_gpus()
trainer = torch.optim.SGD(net.parameters(), lr=lr, weight_decay=wd)
d2l.train_ch13(net, train_iter, test_iter, loss, trainer, num_epochs, devices)

4 オープンソースコードとデータセット

データセットのダウンロード アドレス: http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar

入力サンプル:出力サンプル: トレーニング:

!python3 train.py -m Unet -g 0

予測:モデル コードには FCN、U-Net、Deeplab の実装が含まれており、モデルのトレーニングと予測をより便利に変更できます。 DeeplabV3 セグメンテーションの結果:  FCN セグメンテーションの結果:ここに画像の説明を挿入

U-Net セグメンテーションの結果:

5 まとめ

セグメント化された標準画像と比較すると、モデルの出力セグメント化画像はセグメント化された標準画像とほぼ一​​致しており、モデルの出力セグメント化画像も元の画像とよく統合されていることがわかり、モデルが適切であることを示しています。より精度が高くなります。

さらに、入力画像サイズの観点から、モデルは任意のサイズの画像を入力し、同じサイズのラベル付きセグメント化画像を出力できます。PASCAL VOC データセットの画像に対してセグメント化されているため、PASCAL VOC データセットは 20 カテゴリ (背景は 21 番目のカテゴリ) しかサポートしていないため、セグメント化すると、20 カテゴリに含まれないものが背景としてマークされます。

ただし、全体として、このモデルは PASCAL VOC データセットの画像セグメンテーションに関して高い精度を達成しています。

おすすめ

転載: blog.csdn.net/qq_29788741/article/details/132183129