torchvision テンソル変換 & 前処理(GbE-2 / Python)
This content is not available in your language yet.
HelloWorld で作成した共通モジュール puclib.py を使用して、GbE-2 から読み込んだ画像データを PyTorch Tensor へ変換し、torchvision.transforms でディープラーニングモデルへの入力用前処理(リサイズ・平滑化・テンソル正規化)を施すプログラムの作成手順です。
-
スクリプトの作成
puclib.pyと同じフォルダーにgbe2_torchvision_single_process.pyを作成し、以下のコードを記述します。gbe2_torchvision_single_process.py from ctypes import c_uint32, c_ushort, c_ubyte, c_void_p, byrefimport numpy as npimport torchimport torchvision.transforms as Tfrom 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 カメラが見つかりませんでした。")returnh_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.valueq_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_bufferxfer_info.nDataSize = xfer_data_size.valueprint("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.0print(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() -
スクリプトの実行
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 つのパイプラインに連結しておくことで、カメラ画像を取得した瞬間に即座に推論用データセット形式へ変換できます。
