質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.30%
NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Q&A

解決済

3回答

1643閲覧

python 1枚の画像から部分画像のミニバッチ生成の高速化

HikuichiSan

総合スコア24

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

0グッド

0クリップ

投稿2019/07/03 02:22

pythonで1枚の画像から、部分画像を切り出してきてミニバッチを生成するプログラムで
256x256画像から、20パターンの回転、3ピクセルごとのスライディングウィンドウで32x32を切り出し、並べてミニバッチを作成します。
プログラムは下記の様に作成し機能は満たしていますが、非常に時間がかかるため、
高速化したいです。どのようにコーディングすれば良いでしょうか。

def genImageInputs(image, stride=5, size=32, num_rot=20): width = image.shape[1] height = image.shape[0] hsize = size//2 stack = np.copy(image).reshape(1, width, height) output = None for r in range(1, num_rot): rot = r * 180 / num_rot pil_img = Image.fromarray(image) pil_img = pil_img.rotate(rot) stack = np.concatenate([stack, np.asarray(pil_img).reshape(1, width, height)], 0) #print(stack.shape) for i in np.arange(hsize, width-hsize, stride): for j in np.arange(hsize, height-hsize, stride): sub = stack[:, j-hsize:j+hsize, i-hsize:i+hsize] if output is None: output = sub else: output = np.concatenate([output, sub], 0) return output

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

自己解決

concat部分をlist.appendに変更しループの外でconcatすることで解決しました。

投稿2019/07/09 02:40

HikuichiSan

総合スコア24

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

※追記:手違いで乱立してしまいました すみません

私はPythonについて「特別」詳しいというわけではないので、それほど力になれず申し訳ありませんが、
下記のようなコードを実行した際にHikuichiSan様の環境では実行速度が変わりますでしょうか?

Python

1import time 2import numpy as np 3from PIL import Image 4from multiprocessing import Process 5 6 7def genImageInputs(img, stride=5, size=32, num_rot=20): 8 start = time.time() 9 width = img.shape[1] 10 height = img.shape[0] 11 hsize = size // 2 12 print(img.dtype, img.shape) 13 stack = np.copy(img).reshape(1, 256, 256) 14 output = None 15 for r in range(1, num_rot): 16 rot = r * 180 / num_rot 17 pil_img = Image.fromarray(img) 18 pil_img = pil_img.rotate(rot) 19 stack = np.concatenate([stack, np.asarray(pil_img).reshape(1, 256, 256)], 0) 20 for i in np.arange(hsize, width - hsize, stride): 21 for j in np.arange(hsize, height - hsize, stride): 22 sub = stack[:, j - hsize:j + hsize, i - hsize:i + hsize] 23 if output is None: 24 output = sub 25 else: 26 output = np.concatenate([output, sub], 0) 27 return output 28 print(time.time() - start) 29 30if __name__ == "__main__": 31 dummy_input = np.zeros((256, 256)) 32 print(dummy_input.shape) 33 genImageInputs(dummy_input) 34 p = Process(target=genImageInputs,args=(dummy_input,)) 35 p.start() 36 p.join()

投稿2019/07/03 04:27

編集2019/07/03 04:28
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HikuichiSan

2019/07/09 02:39

該当コードは、自分の環境では動きませんでした。 concatをループの外に出すことで1sec切ることができました。 ご回答ありがとうございます
guest

0

実機で確認致しましたが起動できませんでした
全文を記載してください

また、どのように速度を向上させたいかによりますが、
Cython,multiprocessing,multithread,そもそも論ではコードの最適化になります

投稿2019/07/03 03:14

編集2019/07/03 03:18
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HikuichiSan

2019/07/03 03:51

全文です。基本的にconcatでメモリコピーが発生して遅くなっていると思います。 現在100sec以上かかっているので、効率の良い書き方を探しています ``` import time import numpy as np import PIL from PIL import Image def genImageInputs(img, stride=5, size=32, num_rot=20): width = img.shape[1] height = img.shape[0] hsize = size//2 print(img.dtype, img.shape) stack = np.copy(img).reshape(1, 256, 256) output = None for r in range(1, num_rot): rot = r * 180 / num_rot pil_img = Image.fromarray(img) pil_img = pil_img.rotate(rot) stack = np.concatenate([stack, np.asarray(pil_img).reshape(1, 256, 256)], 0) for i in np.arange(hsize, width-hsize, stride): for j in np.arange(hsize, height-hsize, stride): sub = stack[:, j-hsize:j+hsize, i-hsize:i+hsize] if output is None: output = sub else: output = np.concatenate([output, sub], 0) return output dummy_input = np.zeros((256, 256)) print(dummy_input.shape) start = time.time() genImageInputs(dummy_input) print(time.time()-start) ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問