こしあん
2019-10-10

PyTorchで画像を小さいパッチに切り出す方法

Pocket
LINEで送る


PyTorchで1枚の画像を複数の小さい画像(パッチ)に切り出す方法を紹介します。TensorFlowだとtf.image.extract_patchesにあたる処理です。

torch.Tensor.unfold

torch.Tensor.unfoldという関数を使います。

unfold(dimension, size, step) → Tensor

という形式で、順番にパッチを切り出す次元、パッチサイズ、パッチを切り出す間隔ですね。次元は縦と横で取ればいいので画像の4階テンソルなら2,3で取れば良いでしょう。

コード

この画像を「cat.jpg」とします。

128px × 128pxのパッチで、64px間隔に取り出すものとします。

import torch
import torchvision
from PIL import Image
import numpy as np

# テンソルの読み込み
with Image.open("cat.jpg") as img:
    original = np.expand_dims(np.asarray(img, np.float32).transpose([2, 0, 1]), axis=0) / 255.0
x = torch.as_tensor(original)
print(x.size()) # [1, 3, 821, 547]
# パッチサイズは128x128, 64px間隔で切り出す
patches = x.unfold(2, 128, 64).unfold(3, 128, 64)
print(patches.size())  # [1, 3, 11, 7, 128, 128]
# パッチをタイルして保存
out = patches.permute([0, 2, 3, 1, 4, 5]).reshape(-1, 3, 128, 128) # permuteが必要
torchvision.utils.save_image(out, "patch.png", nrow=7)

縦方向と横方向で2回パッチを取れば良いです。パッチを取った後がごちゃごちゃしていますが、次元は「バッチサイズ、チャンネル数、縦方向のパッチ数、横方向のパッチ数、縦方向のパッチ解像度、横方向のパッチ解像度」となります。縦・横はunfoldを適用する順番によって変わります。結果は次の通り。

Related Posts

KerasのModelCheckpointのsave_best_onlyは何を表すのか?... Kerasには「モデルの精度が良くなったときだけ係数を保存する」のに便利なModelCheckpointというクラスがあります。ただこのsave_best_onlyがいまいち公式の解説だとピンとこないので調べてみました。 ModelCheckpointとは? 公式ドキュメントより ke...
画像のダウンサンプリングとPSNRの測定... U-Netでどこまでの深さが効いているのかを考えるために、画像をダウンサンプリングし、アップサンプリングするという処理を行いPSNRを見ていきます。その結果、PSNRが15~20程度だと、U-Netの深い層が効かないかもしれないという状況を確認することができました。 きかっけ・考え方 U-Ne...
TensorFlowの関数で画像にモザイクを書ける方法... TensorFlow2.0の関数を使い、画像にモザイクをかける方法を紹介します。OpenCVやPILでの書き方はいろいろありますが、TensorFlowでどう書くかはまず出てきませんでした。GPUやTPUでのブーストも使えます。 モザイク付与のアルゴリズム いろいろあるとは思いますが、自分が使...
PyTorchでGANの訓練をするときにrequires_grad(trainable)の変更はいる... PyTorchでGANのある実装を見ていたときに、requires_gradの変更している実装を見たことがあります。Kerasだとtrainableの明示的な変更はいるんで、もしかしてPyTorchでもいるんじゃないかな?と疑問になったので、確かめてみました。 requires_gradの変更とは...
画像のピラミッドを1枚の画像として出力するサンプル... 同一画像で繰り返し半分に縮小しながら積み重ねていく操作(ピラミッド)が必要になったので、ピラミッドを1枚の画像として出力するサンプルを作ってみました。 ピラミッド 同一画像の解像度をある一定比率(よくある例では半分)で繰り返し縮小しながら積み重ねていくことを、ピラミッドと言います。OpenCV...
Pocket
LINEで送る

Add a Comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です