この記事では、Python を使用してリモートセンシング画像のディープラーニングサンプルペアを作成する方法を例とともに詳しく説明し、公式アカウントに注目し、20230430 に返信してサンプルデータとコードを入手してくださいGeodataAnalysis
。前章と本章のコードとデータ一緒にいるよ。
リモート センシング画像を使用してディープ ラーニング モデルをトレーニングする場合、画像内の雲によりモデルのトレーニング用の画像が生成されます。たとえば、土地被覆分類などの操作はトレーニング前にスクリーニングして、曇った画像ブロックを削除してからラベルを作成する必要があります。もちろん、雲除去モデルまたは雲検出モデルをトレーニングしている場合、操作はまったく逆であり、雲のある画像ブロックを保存する必要があります。
前回の記事では、モデルのトレーニングに必要な各画像ブロックの情報を抽出しましたが、ここでは各画像ブロックのクラウド コンテンツを抽出する例を使用して、この情報の使用方法を説明します。
この例では、landsat 8 の QA バンドを使用して、ピクセルが雲で覆われているかどうかを判断します。他のデータ (センチネルなど、QA バンドなし) を使用する場合は、最初に元のデータを使用して雲マスクを作成します。
1 必要なモジュールをインポートする
その中で、unpackqa
landsat 8 の QA バンドの分析に使用されます。
import os
import unpackqa
import numpy as np
import pandas as pd
import rasterio as rio
from rasterio.windows import Window
2 画像ブロック情報を読み出す
stat_df = pd.read_csv('./patchs.csv')
stat_df.head()
3 後で呼び出すために画像を開きます
ここで言う画像を開くということは、この画像の読み取りインターフェイスを取得するだけであり、この画像のデータをメモリに読み込むわけではないことに注意してください。
id_srcs = {
}
data_dir = './data'
for id in stat_df['id'].unique():
id_path = os.path.join(data_dir, id, id+'_QA_PIXEL.TIF')
if os.path.exists(id_path):
id_srcs[id] = rio.open(id_path)
4 各画像パッチの雲と影のコンテンツを抽出する
まず、画像パッチの情報に基づいて雲と影の内容を計算できる関数を定義します。前回の記事で使用した入力データとタグは両方とも landsat8 です。実際のアプリケーションでは、タグは雲の内容を計算する必要はないかもしれません (雲の除去や雲の検出でない限り)。このとき、判定を画像ブロックがラベルの場合は、6 ~ 7 行目に示すように、直接 0 を返します。
# 数据产品的名字,示例数据为C2 L2级别的landsat 8
L8_qa_product = 'LANDSAT_8_C2_L2_QAPixel'
# 获取每个影像块的云含量,输入为dataframe的一行
def cloud_and_shadow_cover(patch):
if patch.type == 'label':
return 0
# 读取这个影像块对应的QA波段的值
src = id_srcs[patch.id]
win = Window.from_slices((patch.row, patch.row+patch.image_size),
(patch.col, patch.col+patch.image_size))
patch_array = src.read(1, window=win)
# 解析QA波段,计算哪些像元为云或阴影,是的话返回True
mask = unpackqa.unpack_to_array(patch_array,
product=L8_qa_product,
flags=['Cloud','Cloud_Shadow'])
mask = np.any(mask, axis=-1)
# 返回这个影像块的云和阴影所占的比例
return np.count_nonzero(mask) / mask.size
この関数を呼び出して、各画像パッチの雲と影の内容を計算します。
stat_df['cs_cover'] = stat_df.apply(cloud_and_shadow_cover, axis=1)
stat_df.head()
5 フィルター
次のコードは、画像ブロックthre1
とthre2
、入力とラベルのクラウド コンテンツのしきい値をそれぞれフィルターするために使用されます。しきい値は自分で設定でき、クラウド コンテンツがこのしきい値より大きいか、小さいか、または等しいかを設定できます。
thre1, thre2 = 0.01, 0.01
img_mask = stat_df.loc[stat_df['type']=='img', 'cs_cover']>thre1
label_mask = stat_df.loc[stat_df['type']=='label', 'cs_cover']>thre2
mask = np.all([img_mask, label_mask], axis=0)
mask = np.vstack((mask, mask)).T.flatten()
df1 = stat_df.loc[mask, :]