[[421061]] PyTorch がさまざまな種類のデータを読み込んで処理できるように、公式では torchvision と torchtext が提供されています。 以前は、torchDataLoader クラスを使用して画像を直接読み込み、テンソルに変換していました。ここでは、torchvisionとtorchtextと組み合わせてtorchに組み込まれているデータセットを紹介します。 TorchvisionのデータセットMNIST MNIST は、正規化され中央が切り取られた手書き画像で構成されるデータセットです。 60,000 枚以上のトレーニング画像と 10,000 枚以上のテスト画像があります。これは、学習や実験の目的で最もよく使用されるデータセットの 1 つです。データセットを読み込んで使用するには、次の構文を使用してインポートします: torchvision.datasets.MNIST()。 ファッションMNIST Fashion MNIST データセットは MNIST に似ていますが、このデータセットには手書きの数字の代わりに T シャツ、パンツ、バッグなどの衣料品が含まれており、トレーニング サンプルとテスト サンプルの数はそれぞれ 60,000 と 10,000 です。データセットを読み込んで使用するには、次の構文を使用してインポートします: torchvision.datasets.FashionMNIST() シーファーCIFAR データセットには、CIFAR10 と CIFAR100 の 2 つのバージョンがあります。 CIFAR10 は 10 個の異なるラベルを持つ画像で構成され、CIFAR100 には 100 個の異なるクラスがあります。これらには、トラック、カエル、ボート、車、鹿などの一般的な画像が含まれます。 - torchvision.datasets.CIFAR10()
- torchvision.datasets.CIFAR100()
ココCOCO データセットには、人、ボトル、文房具、本など、100,000 を超える日常的なオブジェクトが含まれています。この画像データセットは、オブジェクト検出や画像キャプション作成アプリケーションに広く使用されています。 COCO をロードできる場所は次のとおりです: torchvision.datasets.CocoCaptions() エムニストEMNIST データセットは、MNIST データセットの高度なバージョンです。数字や文字を含む画像で構成されています。画像からテキストを認識する問題に取り組んでいる場合、EMNIST は良い選択です。 EMNIST をロードできる場所は次のとおりです: torchvision.datasets.EMNIST() イメージネットImageNet は、高度なニューラル ネットワークをトレーニングするための主要なデータセットの 1 つです。 10,000 のカテゴリに分散された 120 万枚以上の画像で構成されています。通常、このデータセットは、単一の CPU ではこのような大規模なデータセットを処理できないため、ハイエンドのハードウェア システムにロードされます。 ImageNetデータセットをロードするためのクラスは次のとおりです: torchvision.datasets.ImageNet() Torchtext のデータセットIMDB IMDB は感情分類用のデータセットで、トレーニング用に 25,000 件の非常に極端な映画レビューのセット、テスト用にさらに 25,000 件のレビューが含まれています。 torchtext クラスを使用してこれらのデータをロードします: torchtext.datasets.IMDB() ウィキテキスト2 WikiText2 言語モデリング データセットは、1 億を超えるトークンのコレクションです。これは Wikipedia から抽出されたもので、句読点と実際の大文字と小文字が保持されています。長期的な依存関係を伴うアプリケーションで広く使用されています。このデータはtorchtextから読み込むことができます: torchtext.datasets.WikiText2() 上記の 2 つの人気データセットに加えて、SST、TREC、SNLI、MultiNLI、WikiText-2、WikiText103、PennTreebank、Multi30k など、torchtext ライブラリで利用できるデータセットが他にもあります。 MNISTデータセットを詳しく見るMNIST は最も人気のあるデータセットの 1 つです。ここで、PyTorch が pytorch/vision リポジトリから MNIST データセットをロードする方法を確認します。まずデータセットをダウンロードし、data_trainという変数にロードしましょう。 - torchvision.datasetsからMNISTをインポートする
-
- # MNISTをダウンロード
- data_train = MNIST( '~/mnist_data' 、 train= True 、 download= True )
-
- matplotlib.pyplot をpltとしてインポートします。
-
- ランダム画像 = データトレーニング[0][0]
- ランダム画像ラベル = データトレーニング[0][1]
-
- # Matplotlib を使用して画像を印刷する
- plt.imshow(ランダム画像)
- print( "画像のラベルは:" , random_image_label)
DataLoaderはMNISTをロードします次に、以下に示すように、DataLoader クラスを使用してデータセットを読み込みます。 - 輸入トーチ
- torchvisionから変換をインポート
-
- data_train = torch.utils.data.DataLoader(
- MNIST(
- '~/mnist_data' 、トレーニング= True 、ダウンロード= True 、
- 変換 = transforms.Compose([
- 変換.ToTensor()
- ]))、
- バッチサイズ=64、
- シャッフル=真
- )
-
- batch_idxの場合、 enumerate(data_train)のサンプル:
- print(batch_idx, サンプル)
CUDA 読み込みGPU を有効にすると、モデルのトレーニングが高速化されます。ここで、CUDA (PyTorch の GPU サポート) を使用してデータをロードするときに使用できる構成を使用しましょう。 - デバイス = "cuda" 、torch.cuda.is_available() の場合、そうでない場合 "CPU"
- kwargs = { 'num_workers' : 1, 'pin_memory' : True } デバイス == 'cuda'の場合 それ以外{}
-
- トレーニングローダー = torch.utils.data.DataLoader(
- torchvision.datasets.MNIST( '/files/' 、トレーニング= True 、ダウンロード= True )、
- batch_size=batch_size_train、**kwargs)
-
- test_loader = torch.utils.data.DataLoader(
- torchvision.datasets.MNIST( 'files/' 、トレーニング= False 、ダウンロード= True )、
- batch_size=batch_size、**kwargs)
画像フォルダImageFolder は、独自の画像データセットを読み込むのに役立つ、一般的なデータ ローダー クラス torchvision です。分類問題を取り上げ、与えられた画像がリンゴかオレンジかを識別するニューラル ネットワークを構築します。 PyTorch でこれを行うには、まず次のように、画像をデフォルトのフォルダー構造に配置する必要があります。 - 根
- ├──オレンジ
- │ ├── オレンジ_image1.png
- │ └── オレンジ_image1.png
- ├── リンゴ
- │ └── apple_image1.png
- │ └── apple_image2.png
- │ └── apple_image3.png
これらの画像はすべて、ImageLoader クラスを使用して読み込むことができます。 - torchvision.datasets.ImageFolder(ルート、変換)
変換するPyTorch Transforms は、データセット全体を独自の形式に変換できるシンプルな画像変換手法を定義します。 異なる解像度の異なる車の画像を含むデータセットの場合、トレーニング中は、トレーニング データセット内のすべての画像が同じ解像度サイズである必要があります。すべての画像を必要な入力サイズに手動で変換すると時間がかかるため、変換を使用できます。数行の PyTorch コードで、データセット内のすべての画像を必要な入力サイズと解像度に変換できます。 ここで、CIFAR10torchvision.datasets をロードし、次の変換を適用します。 - すべての画像を32×32にサイズ変更します
- 画像に中央切り抜き変換を適用します
- 切り取った画像をテンソルに変換する
- 標準化された画像
- 輸入トーチ
- torchvision をインポートする
- torchvision.transforms をtransformsとしてインポートします
- matplotlib.pyplot をpltとしてインポートします。
- numpyをnpとしてインポートする
-
- 変換 = transforms.Compose([
- # サイズを 32×32 に変更
- 変換.サイズ変更(32)
- # センタークロップのクロッピング変換
- 変換.CenterCrop(32)、
- #から -テンソル
- 変換.ToTensor()、
- # 正規化
- 変換します。正規化します([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
- ])
-
- トレインセット = torchvision.datasets.CIFAR10(ルート = './data' 、トレイン = True 、
- ダウンロード= True 、変換=変換)
- トレインローダー = torch.utils.data.DataLoader(トレインセット、バッチサイズ=4、
- シャッフル = False )
PyTorch でカスタムデータセットを作成する次に、数字とテキストで構成される単純なカスタム データセットを作成します。 Dataset クラスで __getitem__() メソッドと __len__() メソッドをカプセル化する必要があります。 - __getitem__() メソッドは、インデックスによってデータセット内の選択された例を返します。
- __len__() メソッドはデータセットの合計サイズを返します。
以下は、FruitImagesDataset データセットをカプセル化するコードです。これは基本的に、PyTorch でカスタム データセットを作成するための優れたテンプレートです。 - インポートOS
- numpyをnpとしてインポートする
- cv2をインポート
- 輸入トーチ
- matplotlib.patches をパッチとしてインポートする
- アルバムをAとしてインポートする
- albumentations.pytorch.transformsからToTensorV2 をインポートします
- matplotlibからpyplotをpltとしてインポートします
- torch.utils.dataからデータセットをインポート
- xml.etreeからElementTree をElementTreeとしてインポートします
- torchvisionからtorchtransとして変換をインポートします
-
- クラス FruitImagesDataset(torch.utils.data.Dataset):
- def __init__(self, files_dir, width, height, transforms=None):
- self.transforms = 変換
- self.files_dir = ファイルディレクトリ
- self.height = 高さ
- 自己.幅 = 幅
-
-
- self.imgs = [画像for image in sorted(os.listdir(files_dir))
- 画像[-4:] == '.jpg'の場合]
-
- self.classes = [ '_' 、 'リンゴ' 、 'バナナ' 、 'オレンジ' ]
-
- __getitem__(self, idx)を定義します。
-
- img_name = self.imgs[idx]
- image_path = os.path.join (self.files_dir、img_name) です。
-
- # 画像を読み取り、正しいサイズに変換する と色
- img = cv2.imread(画像パス)
- img_rgb = cv2.cvtColor(img、cv2.COLOR_BGR2RGB).astype(np.float32) で、
- img_res = cv2.resize(img_rgb, (self.width, self.height), cv2.INTER_AREA)
- # 255によるダイビング
- 画像解像度 /= 255.0
-
- # 注釈ファイル
- annot_filename = img_name[:-4] + '.xml'
- annot_file_path = os.path.join (self.files_dir、annot_filename)
-
- ボックス = []
- ラベル = []
- ツリー = et.parse(annot_file_path)
- ルート = tree.getroot()
-
- # cv2 イメージはサイズを示します 高さ×幅
- 重量 = 画像の形状[1]
- イメージシェイプ[0]
-
- # xmlファイルのボックス座標が抽出され、指定された画像サイズに合わせて修正されます
- root.findall( 'object' )内のメンバーの場合:
- ラベルを追加します(self.classes.index ( member.find( 'name' ).text))
-
- # 境界ボックス
- xmin = int (member.find( 'bndbox' ).find( 'xmin' ).text)
- xmax = int (member.find( 'bndbox' ).find( 'xmax' ).text)
-
- ymin = int (member.find( 'bndbox' ).find( 'ymin' ).text)
- ymax = int (member.find( 'bndbox' ).find( 'ymax' ).text)
-
- xmin_corr = (xmin / wt) * 自己幅
- xmax_corr = (xmax / wt) * 自己幅
- ymin_corr = (ymin / ht) * 自己高さ
- ymax_corr = (ymax / ht) * 自己高さ
-
- ボックスを追加します([xmin_corr, ymin_corr, xmax_corr, ymax_corr])
-
- #ボックスをtorch.Tensorに変換する
- ボックス = torch.as_tensor(ボックス、dtype=torch.float32)
-
- #ボックスの面積を取得する
- 面積 = (ボックス[:, 3] - ボックス[:, 1]) * (ボックス[:, 2] - ボックス[:, 0])
-
- #すべてのインスタンスが混雑していないと仮定
- iscrowd = torch.zeros((boxes.shape[0],), dtype=torch.int64)
-
- ラベル = torch.as_tensor(ラベル、dtype=torch.int64)
-
- ターゲット = {}
- target[ "boxes" ] = ボックス
- target[ "labels" ] = ラベル
- target[ "area" ] = エリア
- ターゲット[ "iscrowd" ] = iscrowd
- #画像ID
- イメージID = torch.tensor([idx])
- ターゲット[ "image_id" ] = イメージID
-
- self.transformsの場合:
- サンプル = self.transforms(画像 = img_res,
- bboxes=ターゲット[ 'ボックス' ],
- ラベル=ラベル)
-
- img_res = サンプル[ '画像' ]
- ターゲット[ 'boxes' ] = torch.Tensor(サンプル[ 'bboxes' ])
- img_res、ターゲットを返す
- __len__(自分)を定義します:
- len(self.imgs)を返す
-
- get_transform(train)を定義します。
- 電車の場合:
- A.Compose([を返す
- A.水平反転(0.5)、
- テンソルV2(p=1.0)
- ], bbox_params={ 'format' : 'pascal_voc' , 'label_fields' : [ 'labels' ]})
- それ以外:
- A.Compose([を返す
- テンソルV2(p=1.0)
- ], bbox_params={ 'format' : 'pascal_voc' , 'label_fields' : [ 'labels' ]})
-
- files_dir = '../input/fruit-images-for-object-detection/train_zip/train'
- test_dir = '../input/fruit-images-for-object-detection/test_zip/test'
-
- データセット = FruitImagesDataset(train_dir, 480, 480)
|