Skip to content

torchvision テンソル変換 & 前処理(GbE-2 / Python)

This content is not available in your language yet.

HelloWorld で作成した共通モジュール puclib.py を使用して、GbE-2 から読み込んだ画像データを PyTorch Tensor へ変換し、torchvision.transforms でディープラーニングモデルへの入力用前処理(リサイズ・平滑化・テンソル正規化)を施すプログラムの作成手順です。

  1. スクリプトの作成

    puclib.py と同じフォルダーに gbe2_torchvision_single_process.py を作成し、以下のコードを記述します。

    gbe2_torchvision_single_process.py
    from ctypes import c_uint32, c_ushort, c_ubyte, c_void_p, byref
    import numpy as np
    import torch
    import torchvision.transforms as T
    from torchvision.utils import save_image
    # 共通モジュール puclib.py から読み込み
    from puclib import (
    load_sdk, PUC_SUCCEEDED, PUC_DETECT_TARGET_HAWK,
    PUC_Q_COUNT, PUC_DETECT_FILTER, PUC_DETECT_INFO, PUC_XFER_DATA_INFO
    )
    def main():
    print("INFINICAM GbE-2 torchvision テンソル変換処理開始...")
    # 1. SDKのロードと初期化
    puclib = load_sdk()
    if puclib.PUC_Initialize() != PUC_SUCCEEDED:
    print("エラー: SDKの初期化に失敗しました。")
    return
    # 2. デバイスの検索とオープン
    detect_filter = PUC_DETECT_FILTER(nDeviceTypeFlags=PUC_DETECT_TARGET_HAWK)
    detect_info = PUC_DETECT_INFO()
    if puclib.PUC_DetectDevice2(byref(detect_filter), byref(detect_info)) != PUC_SUCCEEDED or detect_info.nDeviceCount == 0:
    print("エラー: GbE-2 カメラが見つかりませんでした。")
    return
    h_device = c_void_p()
    if puclib.PUC_OpenDevice2(0, byref(h_device)) != PUC_SUCCEEDED:
    print("エラー: デバイスのオープンに失敗しました。")
    return
    # 3. 解像度・量子化テーブル・転送サイズの取得
    width, height = c_uint32(), c_uint32()
    puclib.PUC_GetResolution(h_device, byref(width), byref(height))
    w, h = width.value, height.value
    q_vals = (c_ushort * PUC_Q_COUNT)()
    puclib.PUC_GetQuantization2(h_device, q_vals)
    xfer_data_size = c_uint32()
    puclib.PUC_GetXferDataSize(h_device, byref(xfer_data_size))
    print(f"解像度: {w} x {h} ピクセル")
    # 4. バッファの確保
    comp_buffer = (c_ubyte * xfer_data_size.value)()
    line_bytes = (w + 3) & ~3 # 4バイト境界アラインメント
    decoded_buffer = (c_ubyte * (line_bytes * h))()
    # 5. 1フレームキャプチャの実行
    xfer_info = PUC_XFER_DATA_INFO()
    xfer_info.pData = comp_buffer
    xfer_info.nDataSize = xfer_data_size.value
    print("1フレーム撮影中...")
    if puclib.PUC_GetSingleXferData(h_device, byref(xfer_info)) == PUC_SUCCEEDED:
    # 6. 復号処理
    ret = puclib.PUC_DecodeData(
    decoded_buffer, 0, 0, w, h, line_bytes, comp_buffer, q_vals
    )
    if ret == PUC_SUCCEEDED:
    # 7. NumPy 配列へ変換
    img_np = np.ctypeslib.as_array(decoded_buffer).reshape((h, line_bytes))[:, :w]
    # 8. PyTorch Tensor への変換 [0.0, 1.0] に正規化 & 形状変更 (1, H, W)
    tensor_img = torch.from_numpy(img_np).float().unsqueeze(0) / 255.0
    print(f"変換前 Tensor 形状: {list(tensor_img.shape)} (Channels x Height x Width)")
    # 9. torchvision パイプライン定義(224x224にリサイズ + ノイズ抑制)
    transform_pipeline = T.Compose([
    T.Resize((224, 224), antialias=True),
    T.GaussianBlur(kernel_size=(5, 5), sigma=(1.0, 2.0))
    ])
    # 前処理適用
    processed_tensor = transform_pipeline(tensor_img)
    print(f"前処理後 Tensor 形状: {list(processed_tensor.shape)}")
    # 10. 処理結果 Tensor を画像ファイルへ保存
    filename = "torchvision_processed_result.png"
    save_image(processed_tensor, filename)
    print(f"SUCCESS: 処理結果 Tensor を画像として保存しました ({filename})")
    else:
    print(f"エラー: 画像データの復号に失敗しました。ErrorCode: {ret}")
    else:
    print("エラー: 画像データの取得に失敗しました。")
    # 11. クローズ
    puclib.PUC_CloseDevice(h_device)
    if __name__ == "__main__":
    main()
  2. スクリプトの実行

    Terminal window
    python gbe2_torchvision_single_process.py

    実行完了後、入力サイズから AI 推論モデル向けサイズ (224x224) へ前処理された torchvision_processed_result.png が生成されます。


PyTorch / torchvision 連携のポイント

Section titled “PyTorch / torchvision 連携のポイント”

1. ゼロコピー型テンソル変換 (torch.from_numpy)

Section titled “1. ゼロコピー型テンソル変換 (torch.from_numpy)”

torch.from_numpy() を使用することで、SDK 側でデコードした NumPy 配列のメモリ領域を再確保することなく、高速に torch.Tensor へキャスト可能です。

tensor_img = torch.from_numpy(img_np).float().unsqueeze(0) / 255.0
  • .unsqueeze(0): (Height, Width) の 2 次元テンソルから、torchvision で標準的に用いられる (Channels, Height, Width) の 3 次元形式へ次元を拡張します。
  • / 255.0: 8bit 整数データ(0 〜 255)を機械学習で汎用的に用いられる浮動小数点数(0.0 〜 1.0)へ正規化します。

2. データパイプラインの統一 (torchvision.transforms.Compose)

Section titled “2. データパイプラインの統一 (torchvision.transforms.Compose)”

モデル入力に必要なリサイズ・トリミング・畳み込み処理などを T.Compose で 1 つのパイプラインに連結しておくことで、カメラ画像を取得した瞬間に即座に推論用データセット形式へ変換できます。