コンピュータ ビジョン 11 の応用 - Pytorch フレームワークに基づく畳み込みニューラル ネットワークと注意メカニズムの番地認識への応用

みなさん、こんにちは。私は Weixue AI です。今日は、コンピューター ビジョン 11 の応用、つまり pytorch フレームワークに基づく畳み込みニューラル ネットワークと注意メカニズムの、番地認識への応用を紹介します。この記事では、PyTorch を使用して、ボリュームの構築とトレーニングを迅速に行い、ストリートハウス番号の正確な識別を実現するためのプロダクト ニューラル ネットワーク (CNN) などのモデル。人間の視覚的注意メカニズムを模倣する方法である注意メカニズムを紹介します。これは画像処理タスクに幅広い用途があります。アテンション メカニズムを導入することにより、モデルは自動的に家番号に関連する画像内の領域に焦点を合わせることができ、認識の精度と堅牢性が向上します。

1. プロジェクト紹介

街路家番号の認識は、コンピューター ビジョンにおける重要なタスクです。街路家番の自動認識により、街路画像の理解と分析が向上します。この記事では、PyTorch フレームワークとアテンション メカニズムを SVHN データセットと組み合わせて使用​​し、番地の分類と認識を実現する方法を紹介します。

2.SVHNデータセット

SVHN (Street View House Numbers) は、公開されている大規模な街頭デジタル画像データセットです。このデータセットには、Google ストリート ビューから取得した家番号画像が含まれており、これを使用して、番地を自動的に認識する機械学習モデルのトレーニングとテストに使用できます。

2.1 データセットのダウンロードとロード

まず、SVHN データセットをダウンロードしてロードする必要があります。PyTorch では、torchvision ライブラリのデータセット モジュールを使用してこのステップを実行できます。

データセットのダウンロードと表示:

train_dataset = datasets.SVHN(root='./data', split='train', download=True)

images = train_dataset.data[:10]  # shape: (10, 3, 32, 32)
labels = train_dataset.labels[:10]

images = np.transpose(images, (0, 2, 3, 1))

# Plot the images
fig, axs = plt.subplots(2, 5, figsize=(12, 6))
axs = axs.ravel()

for i in range(10):
    axs[i].imshow(images[i])
    axs[i].set_title(f"Label: {
      
      labels[i]}")
    axs[i].axis('off')

plt.tight_layout()
plt.show()

ここに画像の説明を挿入

データセットの読み込み、前処理、簡単な入力モデルのトレーニング:

import torch
from torchvision import datasets, transforms

# 数据预处理
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.5,), (0.5,))])

# 下载并加载SVHN数据集
trainset = datasets.SVHN(root='./data', split='train', download=True, transform=transform)
testset = datasets.SVHN(root='./data', split='test', download=True, transform=transform)

trainloader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True)
testloader = torch.utils.data.DataLoader(testset, batch_size=64, shuffle=True)

3. 畳み込みネットワークの構築

PyTorch を使用して畳み込みニューラル ネットワークを構築します。畳み込みニューラル ネットワーク (CNN) は、主に画像 (ピクセルの 2D グリッド) やテキスト (単語の 1D グリッド) など、グリッド状の構造を持つデータを処理するために使用されるニューラル ネットワークです。

3.1 ネットワーク構造の定義

以下は、基本的な畳み込みニューラル ネットワーク モデルです。これには、2 つの畳み込み層、2 つの最大プーリング層、および 2 つの全結合層が含まれています。

from torch import nn

class ConvNet(nn.Module):
    def __init__(self):
        super(ConvNet, self).__init__()
        self.layer1 = nn.Sequential(
            nn.Conv2d(3, 32, kernel_size=5, stride=1, padding=2),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2, stride=2))
        self.layer2 = nn.Sequential(
            nn.Conv2d(32, 64, kernel_size=5, stride=1, padding=2),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2, stride=2))
        self.drop_out = nn.Dropout()
        self.fc1 = nn.Linear(7 * 7 * 64, 1000)
        self.fc2 = nn.Linear(1000, 10)

    def forward(self, x):
        out = self.layer1(x)
        out = self.layer2(out)
        out = out.reshape(out.size(0), -1)
        out = self.drop_out(out)
        out = self.fc1(out)
        return self.fc2(out)

4. アテンションメカニズムを追加する

アテンション メカニズムは、モデルのパフォーマンスを向上させることができる手法です。私たちのモデルでは、モデルが入力画像内の重要な部分に焦点を合わせやすくするために、アテンション レイヤーを追加します。

4.1 アテンション層の定義

基本的なアテンション レイヤーを実装します。これは、入力と同じサイズのアテンション マップを生成し、入力にアテンション マップの対応する要素を乗算して、入力に重みを付けます。

アテンション メカニズム層の数学的原理:
アテンション メカニズムの数学的原理は、次の式で表すことができます。

入力テンソルx ∈ R b × c × h × wx \in \mathbb{R}^{b \times c \times h \times w} が与えられるとします。バツRb × c × h × wここでbbbはバッチサイズ、cccはチャネル番号、hhhは身長ですwwwは幅です。アテンションのメカニズムは、特徴抽出と特徴重み付けの 2 つの段階に分かれています。
1. 特徴抽出ステージ:xx が
適応平均プーリング層 (AdaptiveAvgPool2d) に渡されます。x は高さと幅の平均プーリングを実行し、 b × c × 1 × 1 b \times c \times 1 \times 1 の形状になります。b×c×1×1のテンソルyyyここでは、テンソルyy を作成するために適応平均プーリングが使用されます。y は、異なるサイズの入力に対しても同じ出力を生成します。
2. 特徴重み付け段階:
次に、全結合層 (線形) と非線形活性化関数 ReLU を介してテンソルyyyは特徴変換を実行し、チャネルの数を減らし、重要な特徴を保持します。次に、別の全結合層とシグモイド活性化関数を渡して重みテンソル y '' ∈ R b × c × 1 × 1 y' \in \mathbb{R}^{b \times c \times 1 \times 1} を取得しますyRb × c × 1 × 1、各チャネルの重み値を表します。ここでの重み値は 0 ~ 1 であり、後続の計算で各チャネルの比率を制御するために使用されます。重みテンソルy 'y'y'同じ入力テンソルxxxと同じ形状を入力し、入力テンソルと乗算して、注意が重み付けされた特徴テンソルを取得します。これにより、入力テンソルの適応的な特徴重み付けが可能になります。

数学的表現:
y = AdaptiveAvgPool2d ( x ) y ' = Sigmoid ( Linear ( ReLU ( Linear ( y ) ) ) ) 出力 = x ⊙ y ' y = \text{AdaptiveAvgPool2d}(x) \\ y' = \text{ Sigmoid}(\text{Linear}(\text{ReLU}(\text{Linear}(y)))) \\ \text{output} = x \odot y'y=AdaptiveAvgPool2d ( x )y=シグモイド(線形( ReLU (線形( y ))))出力=バツy

ここで⊙ \odot⊙ は要素ごとの乗算演算を意味します。

アテンションメカニズム層の構築コード:

class AttentionLayer(nn.Module):
    def __init__(self, channel, reduction=16):
        super(AttentionLayer, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.fc = nn.Sequential(
            nn.Linear(channel, channel// reduction, bias=False),
            nn.ReLU(inplace=True),
            nn.Linear(channel // reduction, channel, bias=False),
            nn.Sigmoid()
        )

    def forward(self, x):
        b, c, _, _ = x.size()
        y = self.avg_pool(x).view(b, c)
        y = self.fc(y).view(b, c, 1, 1)
        return x * y.expand_as(x)

4.2 ネットワークへのアテンション層の追加

ConvNet モデルにアテンション層を追加します。

class ConvNet(nn.Module):
    def __init__(self):
        super(ConvNet, self).__init__()
        self.layer1 = nn.Sequential(
            nn.Conv2d(3, 32, kernel_size=5, stride=1, padding=2),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2, stride=2),
            AttentionLayer(32))
        self.layer2 = nn.Sequential(
            nn.Conv2d(32, 64, kernel_size=5, stride=1, padding=2),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2, stride=2),
            AttentionLayer(64))
        self.drop_out = nn.Dropout()
        self.fc1 = nn.Linear(8 * 8 * 64, 1000)
        self.fc2 = nn.Linear(1000, 10)

    def forward(self, x):
        out = self.layer1(x)
        out = self.layer2(out)
        out = out.reshape(out.size(0), -1)
        out = self.drop_out(out)
        out = self.fc1(out)
        return self.fc2(out)

5. モデルのトレーニングとテスト

次に、モデルをトレーニングしてテストします。

5.1 モデルのトレーニング

import torch.optim as optim

model = ConvNet()
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9)

for epoch in range(10):  # loop over the dataset multiple times
    running_loss = 0.0
    for i, data in enumerate(trainloader, 0):
        # get the inputs; data is a list of [inputs, labels]
        inputs, labels = data

        # zero the parameter gradients
        optimizer.zero_grad()

        # forward + backward + optimize
        outputs = model(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        # print statistics
        running_loss += loss.item()
        if i % 20 == 0:    # print every 2000 mini-batches
            print('[%d, %5d] loss: %.3f' %
                  (epoch + 1, i + 1, running_loss / 2000))
            running_loss = 0.0

print('Finished Training')

5.2 モデルのテスト

correct = 0
total = 0
with torch.no_grad():
    for data in testloader:
        images, labels = data
        outputs = model(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

print('Accuracy of the network on the 10000 test images: %d %%' % (
    100 * correct / total))

6. 結論

この記事は、コンピューター ビジョン タスクの素晴らしい世界にあなたを導く素晴らしい地図のようなものです。この世界では、PyTorch とアテンション メカニズムという 2 つの強力なパートナーと連携して、番地認識の謎を探索します。

あなたが交通量の多い通りにいて、番地が目に見えにくい場所にいると想像してください。しかし、あなたには魔法のようなビジョンがあり、あらゆる数字を簡単に識別できます。この並外れた能力は、コンピューター ビジョン タスクの魔法です。

私たちは、強力なニューラル ネットワーク モデルの構築に役立つ賢い魔法の杖のような強力なツールである PyTorch を使用したいと考えています。PyTorch を使用すると、モデルの構造を柔軟に定義し、さまざまなパラメーターを設定し、効率的なトレーニングと推論を実行できます。

私たちは、進行方向を照らす明るい標識のような注意メカニズムに遭遇します。アテンション メカニズムにより、ニューラル ネットワークが画像内の重要な領域に焦点を当てることができるため、認識の精度が向上します。このメカニズムを使用すると、モデルをよりインテリジェントにして、番地の位置と詳細に注意を払い、認識しやすくすることができます。SVHN データセットは遠征のガイドであり、現実世界の番地画像が多数含まれています。このデータをインポートすることで、モデルにそのデータから学習させ、認識能力を向上させることができます。これらのイメージは私たちを街の隅々に導き、さまざまなシナリオにおける課題や変化を感じさせます。この記事を通じて、コンピューター ビジョン タスクの性質をより深く理解できるだけでなく、インスピレーションも得ることができます。素晴らしい冒険のように、PyTorch とアテンション メカニズムを使用して、番地を認識するタスクを実現する方法を学びます。この魅力的な旅を一緒にたどり、視野を広げ、新たな可能性を追求しましょう。

おすすめ

転載: blog.csdn.net/weixin_42878111/article/details/132377671