PyTorch torchvision コンピュータビジョンモジュール

torchvision は、PyTorchエコシステムにおけるコンピュータビジョンタスク専用の拡張ライブラリで、以下のコア機能を提供します:

  1. 事前学習済みモデル:ResNet、VGG、AlexNet などの古典的な CNN アーキテクチャ実装を含む
  2. データセットツール:CIFAR10、MNIST、ImageNet などの一般的な視覚データセットを内蔵
  3. 画像変換:さまざまな画像前処理およびデータ拡張手法を提供
  4. 実用ツール:動画処理、画像操作などの補助機能を含む
# 安装 torchvision(通常与 PyTorch 一起安装)
pip install torch torchvision

コアコンポーネントの解析

1. torchvision.models

事前学習済みのコンピュータビジョンモデルを提供し、転移学習に直接利用できます:

サンプル

import torchvision.models as models

# 事前学習済みモデルをロード
resnet18 = models.resnet18(pretrained=True)
alexnet = models.alexnet(pretrained=True)
vgg16 = models.vgg16(pretrained=True)

よく使われるモデルリスト:

モデル名 適用シナリオ パラメータ数 Top-1 精度
ResNet 汎用画像分類 11M-60M 69%-80%
VGG 特徴抽出 138M 71.3%
MobileNet モバイルアプリケーション 3.4M 70.6%
EfficientNet 高効率モデル 5M-66M 77%-84%

2. torchvision.datasets

よく使われるコンピュータビジョンデータセットを内蔵し、データロードのプロセスを簡素化します:

サンプル

from torchvision import datasets

# CIFAR10 データセットをロード
train_data = datasets.CIFAR10(
    root='data',
    train=True,
    download=True,
    transform=transforms.ToTensor()
)

# MNIST データセットをロード
test_data = datasets.MNIST(
    root='data',
    train=False,
    download=True
)

サポートされているデータセットの種類:

サンプル

graph TD
A[torchvision.datasets] --> B[分類データセット]
A --> C[検出データセット]
A --> D[セグメンテーションデータセット]
    B --> B1[CIFAR10/100]
    B --> B2[MNIST/FashionMNIST]
    B --> B3[ImageNet]
    C --> C1[COCO]
    C --> C2[VOC]
    D --> D1[Cityscapes]

3. torchvision.transforms

画像前処理とデータ拡張のコアツール:

サンプル

from torchvision import transforms

# 画像変換パイプラインを定義
transform = transforms.Compose([
    transforms.Resize(256),          # リサイズ
    transforms.CenterCrop(224),       # 中央クロップ
    transforms.ToTensor(),           # テンソルに変換
    transforms.Normalize(             # 標準化
        mean=[0.485, 0.456, 0.406],
        std=[0.229, 0.224, 0.225]
    )
])

よく使われる変換方法の分類:

カテゴリ メソッド例 効果
幾何変換 RandomRotation, RandomResizedCrop 位置不変性を向上
色変換 ColorJitter, Grayscale 色のロバスト性を強化
ぼかし/ノイズ GaussianBlur, RandomErasing 過学習を防止
複合変換 RandomApply, RandomChoice 柔軟な組み合わせ戦略

実践サンプル:画像分類フロー

1. データ準備

サンプル

import torch
from torchvision import datasets, transforms
from torch.utils.data import DataLoader

# データ変換を定義
train_transform = transforms.Compose([
    transforms.RandomHorizontalFlip(),
    transforms.RandomRotation(10),
    transforms.ToTensor(),
    transforms.Normalize((0.5,), (0.5,))
])

# データセットをロード
train_set = datasets.CIFAR10(
    root='./data',
    train=True,
    download=True,
    transform=train_transform
)

# データローダーを作成
train_loader = DataLoader(
    train_set,
    batch_size=32,
    shuffle=True
)

2. モデルトレーニング

サンプル

import torch.nn as nn
import torch.optim as optim

# 事前学習済みモデルを使用
model = models.resnet18(pretrained=True)

# 最終層を変更(CIFAR10 の 10 分類に対応)
num_ftrs = model.fc.in_features
model.fc = nn.Linear(num_ftrs, 10)

# 損失関数とオプティマイザを定義
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9)

# トレーニングループ
for epoch in range(10):
    for images, labels in train_loader:
        outputs = model(images)
        loss = criterion(outputs, labels)
       
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

高度な機能

1. カスタムデータセット

サンプル

from torchvision.datasets import VisionDataset

class CustomDataset(VisionDataset):
    def __init__(self, root, transform=None):
        super().__init__(root, transform=transform)
        # __getitem__ と __len__ を実装
       
    def __getitem__(self, index):
        # (image, target) タプルを返す
        pass
       
    def __len__(self):
        # データセットのサイズを返す
        pass

2. モデルのエクスポートとデプロイ

サンプル

# ONNX 形式にエクスポート
dummy_input = torch.randn(1, 3, 224, 224)
torch.onnx.export(
    model,
    dummy_input,
    "model.onnx",
    input_names=["input"],
    output_names=["output"]
)

ベストプラクティス提案

1、データ拡張戦略:

  • トレーニング時はランダム変換を使用してデータを拡張する
  • 検証/テスト時は決定論的な変換のみを使用する

2、転移学習のテクニック:

サンプル

# 最終層以外のすべてのパラメータを凍結
for param in model.parameters():
    param.requires_grad = False
model.fc.requires_grad = True

3、パフォーマンス最適化:

  • 使用num_workersパラメータでデータロードを高速化
  • 大規模データセットでは、使用を検討するDatasetのサブセット

4、よくある間違い:

  • 呼び出しを忘れるzero_grad()
  • を混同したtrain()とeval()モード
  • 画像テンソルの形状がモデルの要件を満たしていない(C×H×W であるべき)
その他の拡張