序文
コンピューター ビジョンは、ディープ ラーニングの重要な応用分野です。PyTorch は、画像とビデオの処理に役立つ既製の torchvision ツールを提供します。torchvision には、一般的に使用されるデータ セット、モデル、変換関数などが含まれています。これらの API を学習して使用すると、CV フィールドで PyTorch をより迅速かつ適切に適用するのに役立ちます。
トーチビジョン
torchvision のデータセットはすべて torch.utils.data.Dataset のサブクラスであり、両方とも __getitem__ および __len__ 関数を実装します。これは、データ読み込みの並列処理をサポートするマルチプロセス torch.utils.data.DataLoader ローダーに渡すことができます。
torchvision を使用して画像データセットを書き込む
手元に猫と犬の画像が25,000枚あり、同じディレクトリに保存されており、ファイル名はdog.xxx.jpgとcat.xxx.jpgであるとします。(xxx は 0 ~ 12499 の数字です)
猫と犬を分類しよう
import torch
import os
import numpy as np
from PIL.Image import Image
from torch.utils.data import Dataset
class DogsCatsDataset(Dataset):
'''猫狗数据集定义'''
def __init__(self,root):
# root 为图片路径
imgs = os.listdir(root) # 把root目录下的文件名变成列表的形式
# 仅保存图片的完整路径
self.imgs = [os.path.join(root,img) for img in imgs]
def __getitem__(self, item):
img_path = self.imgs[item]
# 根据文件名确定标签,dog为1 cat为0
label = 1 if 'dog' in img_path else 0
pil_img = Image.open(img_path)
img_array = np.array(pil_img)
# 把图像数据转换为张量
img = torch.from_numpy(img_array)
return img ,label
def __len__(self):
return len(self.imgs)
if __name__ == '__main__':
dataset = DogsCatsDataset("./路径")
img,label = dataset[1]
print(img.shape,label)
このコードは、データセットが ./path というディレクトリに保存され、そのディレクトリに複数のサブディレクトリが含まれ、それぞれに複数の画像ファイルが含まれていることを前提としています。各画像ファイルには、.jpg または .png で終わるファイル名があります。
まず、コードはファイル名に基づいて画像のラベルを決定します。'dog' は犬のラベル、'cat' は猫のラベルです。
次に、コードは各画像ファイルを開き、それをテンソルに変換します。ここでは、PyTorch の torch.from_numpy() 関数を使用して、NumPy 配列をテンソルに変換します。
最後に、コードはテンソルとラベルを返します。len () メソッドは、データセット内の画像の数を返します。
この例では、コードはテンソルの形状とラベルを出力します。この場合、テンソルの形状は (1,) で、画像ファイル名が 'dog' であるため、ラベルは 1 です。
変換モジュール
上で定義した猫と犬のデータセット クラスには、次の 3 つの問題があります。
- 各画像の幅と高さは異なり、処理する必要があります
- 画像の各ピクセルの値の範囲は 0 ~ 255 で、ディープ ネットワークは 0 ~ 1 の範囲に正規化する必要があります
- インジェクションPILツールで読み込んだピクチャテンソルの形状は(H,W,C)ですが、ディープネットワークが受け取るピクチャテンソルの形状は(B,C,H,W)であり、変換が必要です。ここで、B はバッチ、サンプル内の画像の数、H と W はそれぞれ画像の高さと幅、C は画像のチャネル数です。
これに関して、PyTorch torchvision ツールの Transforms モジュールは、PIL Image オブジェクトの画像変換関数を提供します. このモジュールは、塗りつぶし、クロッピング、グレースケール モード、線形変換、および画像の PyTorch テンソルへの変換などの一般的な前処理関数の実装を提供します.また、反転、ランダム クリッピング、カラー ジッタリングなどのデータ拡張を実装する関数もいくつかあります。
画像変換:
python
import torch
from PIL import Image
# 读取图像
img = Image.open('path/to/image.jpg')
# 转换为张量
img_tensor = torch.from_numpy(img.convert('RGB'))
# 转换为PIL Image对象
img_pil = Image.fromarray(img_tensor)
# 转换为RGBA四元组
img_tensor_4d = torch.stack([img_tensor, img_tensor, img_tensor], dim=0)
img_pil_4d = Image.fromarray(img_tensor_4d)
# 定义转换函数
transforms = {
'to_tensor': torch.nn.functional.to_tensor,
'to_pil_image': Image.fromarray,
'to_pil_image_data': Image.fromarray,
}
# 应用转换函数
for transform, method in transforms.items():
img_tensor_transformed = method(img_tensor)
# 处理转换后的张量
画像処理:
import torch
from PIL import Image
import numpy as np
# 读取图像
img = Image.open('path/to/image.jpg')
# 增强对比度
img_contrast = Image.eval(img, contrast=1.5)
# 增强亮度
img_brightness = Image.eval(img, brightness=1.5)
# 增强颜色
img_gamma = Image.eval(img, gamma=1.5)
# 定义增强函数
transforms = {
'contrast': lambda img: np.clip(img.astype(np.uint8) + np.random.randn_like(img), 0, 255),
'brightness': lambda img: np.clip(img.astype(np.uint8) + np.random.randn_like(img), 0, 255),
'gamma': lambda img: np.clip(img.astype(np.uint8) + np.random.randn_like(img), 0, 255),
}
# 应用增强函数
for transform, method in transforms.items():
img_transformed = method(img)
# 处理增强后的张量
データ変換:
import torch
from PIL import Image
# 读取张量
data = torch.randn(1, 3, 224, 224)
# 转换为PIL Image对象
img_pil = Image.fromarray(data.transpose(1, 2))
# 转换为RGBA四元组
data_tensor_4d = torch.stack([data.transpose(1, 0), data.transpose(0, 2), data], dim=0)
img_pil_4d = Image.fromarray(data_tensor_4d)
# 定义转换函数
transforms = {
'to_pil_image': Image.fromarray,
'to_pil_image_data': Image.fromarray,
}
# 应用转换函数
for transform, method in transforms.items():
data_tensor_transformed = method(data_tensor)
# 处理转换后的张量
データ増強:
import torch
from PIL import Image
# 读取张量
data = torch.randn(1, 3, 224, 224)
# 增强随机旋转
data_randrot = data.transpose(2, 0, 1)
data_rot = data_randrot.permute(0, 2, 3, 1)
# 增强随机缩放
data_randscale = data.unsqueeze(0).unsqueeze(0).unsqueeze(0)
使用法を正規化する
Normalize は通常、TransFroms でテンソル画像を正規化するために使用されます。これには、データセットの平均と標準偏差を計算する必要があります。
Normalize は PyTorch の関数で、テンソルの値が指定された範囲内になるように、テンソルの各次元の平均と標準偏差を 0 または 1 に設定するために使用されます。
import torch
# 定义一个张量
x = torch.tensor([[1, 2, 3], [4, 5, 6]], dtype=torch.float32)
# 定义Normalize的参数
mean = [0.0, 0.0]
std = [1.0, 1.0]
# 使用Normalize进行归一化
x_normalized = normalize(x, mean, std)
print(x_normalized)