SIGNATE Quest 衛星画像の分類


このQuestを選んだ理由

  • 学部の研究でも画像を扱った経験があるのでやりきれそう

  • 難易度★★★★☆に惹かれた

新たな学び

探索的分析

ミッション1と2で丁寧に教えてくれる。
flatten()での1次元化に関してもっと解説があれば嬉しい。研究でかなり苦しんだ点である。

探索的分析のまとめ(ミッション3にて)
不均衡データである:モデルがうまく学習することができるのか
今回の衛星画像データはチャンネルを7つもつ:通常の画像処理ライブラリは1チャンネルの白黒画像や3チャンネルのRGB画像を前提としているので特別な処理が必要となる
分布に偏りがある:正規化手法の選択に影響する

正規化の処理

研究ではすでに正規化されたデータを使用させていただいていたため自分でやるのは初めて・・

今回は2段階の処理をする

①すべての値を無理やり範囲内に収める

範囲の最大値より大きい値は最大値、小さい値は最小値に変換される

np.clip(data, min, max)

②0~1に正規化する

x-min/max-min

データの分割

train_test_split()関数
引数stratifyに正解ラベルのデータを指定することで、学習データと検証データをラベルの偏りがなく分割することができる。正解ラベルを前提に「層化」してくれるので分布を維持しながら分割できる。

torchvision.transformsモジュール

  • transforms.Compose()

インスタンス化して使う。中に書いた各前処理を行う。
正規化処理の関数 normalize() とまったく同じ処理を組み込むには?・・・クラスNormalizeを作成、def __call__(self, image):内に関数のnormalize()の処理を書く。

transform = transforms.Compose([
    Normalize(),
    transforms.ToTensor(),
])

モデルの学習時と検証時に異なる前処理をする

Pytorch
クラス Datasetクラス
trainとvalで異なる前処理をするため、読み込みと前処理クラス作成
DataLoaderはその動作を管理する

train用、val用DataLoaderインスタンスを辞書に格納する

preresnet

最初の層

(conv1): Conv2d(3, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)


受け取るチャンネル数=3
出力するチャンネル数=16

受け取るチャンネル数を7で再定義

net.conv1 = nn.Conv2d(7, 16, )kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False

最後の層

 (fc): Linear(in_features=64, out_features=100, bias=True)

100分類ではなく2値分類で再定義
net.fc = nn.Linear(in_features=64, out_features=2, bias=True)

IoU(Intersection over Union)

不均衡データの二値分類タスクにおいて適切な評価指標。
その他、F値、recall、precision


いいなと思ったら応援しよう!