Python
 Computer >> コンピューター >  >> プログラミング >> Python

画像をPyTorchテンソルに変換する方法【PIL・OpenCV対応の実装例つき】

PyTorchのテンソル(Tensor)とは、単一のデータ型で構成されたn次元配列(行列)のことです。NumPy配列とよく似ていますが、最大の違いは、テンソルがGPUを活用して数値計算を高速化できるという点にあります。そのため、画像を使った深層学習では、まず画像をテンソル形式へ変換することが一般的な前処理となります。

この記事では、画像をPyTorchテンソルに変換する具体的な手順を、PIL画像を使う例とOpenCV(numpy.ndarray)を使う例の2パターンでわかりやすく解説します。

画像をPyTorchテンソルに変換する手順

  • 必要なライブラリをインポートする:torch、torchvision、Pillow(PIL)を使用します。

  • 画像を読み込む:読み込める画像は、PIL画像、または値の範囲が [0, 255] の numpy.ndarray(H×W×C) である必要があります。ここで H、W、C はそれぞれ画像の高さ(Height)、幅(Width)、チャンネル数(Channels)を表します。

  • 変換(Transform)を定義するtransforms.ToTensor() を使って、画像をテンソルへ変換するためのトランスフォームを定義します。

  • 定義したTransformで画像を変換する:これにより、ピクセル値が [0.0, 1.0] の範囲にスケーリングされたテンソルが得られます。

入力画像

画像をPyTorchテンソルに変換する方法【PIL・OpenCV対応の実装例つき】

例1:PIL画像をテンソルに変換する

# 必要なライブラリをインポート
import torch
from PIL import Image
import torchvision.transforms as transforms

# 画像を読み込む
image = Image.open('Penguins.jpg')

# 画像をテンソルに変換するTransformを定義
transform = transforms.ToTensor()

# PIL画像をPyTorchテンソルに変換
tensor = transform(image)

# 変換後のテンソルを表示
print(tensor)

出力結果

tensor([[[0.4510, 0.4549, 0.4667, ..., 0.3333, 0.3333, 0.3333],
         [0.4549, 0.4510, 0.4627, ..., 0.3373, 0.3373, 0.3373],
         [0.4667, 0.4588, 0.4667, ..., 0.3451, 0.3451, 0.3412],
         ...,
         [0.6706, 0.5020, 0.5490, ..., 0.4627, 0.4275, 0.3333],
         [0.4196, 0.5922, 0.6784, ..., 0.4627, 0.4549, 0.3569],
         [0.3569, 0.3529, 0.4784, ..., 0.3922, 0.4314, 0.3490]],

        [[0.6824, 0.6863, 0.7020, ..., 0.6392, 0.6392, 0.6392],
         [0.6863, 0.6824, 0.6980, ..., 0.6314, 0.6314, 0.6314],
         [0.6980, 0.6902, 0.6980, ..., 0.6392, 0.6392, 0.6353],
         ...,
         [0.7255, 0.5412, 0.5765, ..., 0.5255, 0.5020, 0.4157],
         [0.4706, 0.6314, 0.7098, ..., 0.5255, 0.5294, 0.4392],
         [0.4196, 0.3961, 0.5020, ..., 0.4510, 0.5059, 0.4314]],

        [[0.8157, 0.8196, 0.8353, ..., 0.7922, 0.7922, 0.7922],
         [0.8196, 0.8157, 0.8314, ..., 0.7882, 0.7882, 0.7882],
         [0.8314, 0.8235, 0.8314, ..., 0.7961, 0.7961, 0.7922],
         ...,
         [0.6235, 0.5059, 0.6157, ..., 0.4863, 0.4941, 0.4196],
         [0.3922, 0.6000, 0.7176, ..., 0.4863, 0.5216, 0.4431],
         [0.3686, 0.3647, 0.4863, ..., 0.4235, 0.4980, 0.4353]]])

上記のPythonプログラムでは、PIL画像をテンソルへ変換しています。出力を見ると、各ピクセル値が0〜1の浮動小数点数に正規化され、形状は「チャンネル × 高さ × 幅(C×H×W)」のテンソルになっていることが確認できます。

例2:OpenCVで読み込んだ画像(numpy.ndarray)をテンソルに変換する

画像はOpenCVを使って読み込むこともできます。OpenCVで読み込んだ画像は numpy.ndarray 型になりますが、この場合も同じく transforms.ToTensor() を使ってテンソルへ変換できます。なお、OpenCVは色順序がBGRのため、RGBへ変換してから処理するのがポイントです。

# 必要なライブラリをインポート
import torch
import cv2
import torchvision.transforms as transforms

# OpenCVで画像を読み込む
image = cv2.imread('Penguins.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)  # BGRからRGBへ変換

# 画像をテンソルに変換するTransformを定義
transform = transforms.ToTensor()

# numpy.ndarrayをPyTorchテンソルに変換
tensor = transform(image)

# 変換後のテンソルを表示
print(tensor)

出力結果

tensor([[[0.4510, 0.4549, 0.4667, ..., 0.3333, 0.3333, 0.3333],
         [0.4549, 0.4510, 0.4627, ..., 0.3373, 0.3373, 0.3373],
         [0.4667, 0.4588, 0.4667, ..., 0.3451, 0.3451, 0.3412],
         ...,
         [0.6706, 0.5020, 0.5490, ..., 0.4627, 0.4275, 0.3333],
         [0.4196, 0.5922, 0.6784, ..., 0.4627, 0.4549, 0.3569],
         [0.3569, 0.3529, 0.4784, ..., 0.3922, 0.4314, 0.3490]],

        [[0.6824, 0.6863, 0.7020, ..., 0.6392, 0.6392, 0.6392],
         [0.6863, 0.6824, 0.6980, ..., 0.6314, 0.6314, 0.6314],
         [0.6980, 0.6902, 0.6980, ..., 0.6392, 0.6392, 0.6353],
         ...,
         [0.7255, 0.5412, 0.5765, ..., 0.5255, 0.5020, 0.4157],
         [0.4706, 0.6314, 0.7098, ..., 0.5255, 0.5294, 0.4392],
         [0.4196, 0.3961, 0.5020, ..., 0.4510, 0.5059, 0.4314]],

        [[0.8157, 0.8196, 0.8353, ..., 0.7922, 0.7922, 0.7922],
         [0.8196, 0.8157, 0.8314, ..., 0.7882, 0.7882, 0.7882],
         [0.8314, 0.8235, 0.8314, ..., 0.7961, 0.7961, 0.7922],
         ...,
         [0.6235, 0.5059, 0.6157, ..., 0.4863, 0.4941, 0.4196],
         [0.3922, 0.6000, 0.7176, ..., 0.4863, 0.5216, 0.4431],
         [0.3686, 0.3647, 0.4863, ..., 0.4235, 0.4980, 0.4353]]])

このように、PIL画像でもOpenCVで読み込んだnumpy.ndarrayでも、transforms.ToTensor() を使えば同じ方法でPyTorchテンソルへ変換できます。変換後のテンソルはGPUでの高速計算にそのまま利用できるため、画像認識や畳み込みニューラルネットワーク(CNN)などのモデル学習における基本的な前処理ステップとして覚えておくと便利です。

  1. Tkinterで画像を追加・表示する方法を解説!Pillowとfiledialogの使い方

    画像は、あらゆるアプリケーションにおいて非常に有用な要素のひとつです。Pythonでは、Pillow(PIL)パッケージを利用することで、Tkinterアプリケーション内でも簡単に画像を扱うことができます。画像の読み込みや抽出、画像ペインの設定など、便利な機能が多数用意されています。 サンプルコード:ダイアログで選択した画像を表示する 以下の例では、ユーザーがファイルダイアログから画像を選択し、その画像をLabelウィジェットを使ってウィンドウ上に表示します。 #Tkinterライブラリをインポート from tkinter import * from tkinter import ttk

  2. Windows 10で画像をグレースケール(白黒)に変換する4つの方法

    写真をグレースケールで印刷することは、プリンターのカラ―インキを節約できる便利なテクニックです。カラーでの公開がもったいなく感じることもありますが、実は多くの写真は白黒でも同じように、あるいはそれ以上に魅力的に映ります。画像をグレースケールに変換するのに必要なのは黒インキだけです。この記事では、Windows 10のペイントで写真を白黒にする方法と、その他の変換手段について詳しく解説します。 画像を白黒に変換するメリット 画像をモノクロに変換することには、以下のような利点があります。 質感: 白黒写真ならではの表現力で、被写体の質感やディテールを美しく捉えることができます。 視線の集中: