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

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

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

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

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

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

Q&A

解決済

2回答

9258閲覧

Numpy 複数画像の行列

akihico

総合スコア27

NumPy

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

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

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

0グッド

0クリップ

投稿2017/07/17 15:58

編集2017/07/17 22:09

機械学習用のトレーニングデータを作成しようとしています。

numpyで、複数画像の行列を作ろうとしているのですが、うまくいきません。

ひとまず、下記のようなコードを書いてみました。
意図は、
1.DBに記録されているコードに対応する画像を拾いx_train_tempに代入。
2.x_train_tempをx_trainに追加。

各変数や動きについてですが、次のとおりです。

  • res:データベースから取得した値で、0001〜9999の値が入っています。
  • img_dir:画像が格納されているディレクトリです。ここに 変数resの値 にファイル名が対応する画像ファイルがあります。0001.png〜9999.png

ここでは、img_dirにある画像を次々と取って、numpyの配列に入れようとしています。

  • x_train_temp:は画像一枚を一時的に格納しています。x_train_temp.shapeとやると(720, 720, 3)となります。
  • x_train:x_train_tempを追加して、(画像の枚数, 720, 720, 3)の配列を作りたいのですが、ここで躓いています。

python3

1x_train = np.array([]) 2for row in res: 3 img_path = img_dir + row['id'] + '.png' 4 x_train_temp = cv2.imread(img_path) 5 x_train = np.append(x_train,x_train_temp,axis=0)

実行しますと、次のようなエラーになります。

python3

1--------------------------------------------------------------------------- 2ValueError Traceback (most recent call last) 3<ipython-input-20-e099c89ccb9c> in <module>() 4 4 img_path = img_dir + row['id'] + '.png' 5 5 x_train_temp= cv2.imread(img_path) 6----> 6 x_train = np.append(x_train,x_train_temp,axis=0) 7 7 i += 1 8 9~/anaconda3/lib/python3.6/site-packages/numpy/lib/function_base.py in append(arr, values, axis) 10 5001 values = ravel(values) 11 5002 axis = arr.ndim-1 12-> 5003 return concatenate((arr, values), axis=axis) 13 14ValueError: all the input arrays must have same number of dimensions

画像のサイズは720 x 720 pixなので、(画像の枚数,720,720,3)の配列を作りたいのですが、どのようにすればよろしいでしょうか。

書き方を変えてみるとつぎのようになります。

python3

1import cv2 2import numpy as np 3 4x_train_1= cv2.imread('/home/kwdr/dcvol/Script/SNN/html/stock_img/1301.png') 5x_train_1.shape 6(720, 720, 3) 7 8x_train_2= cv2.imread('/home/kwdr/dcvol/Script/SNN/html/stock_img/1332.png') 9x_train_2.shape 10(720, 720, 3)

x_train_1とx_train_2を追加したx_trainの配列を作りたいのですが、どのようにすれば良いでしょうか。

↓作ろうとしているもの。

python3

1x_train.shape 2(2, 720, 720, 3)

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2017/07/17 16:32

resだとかidだとか、ああこういう構造だろう、と思われる変数が出てきていますが、全貌がつかみにくい書き方と思われます。この辺の変数を含めてもう少し大きい範囲でこちらに書いた方が諸兄の回答が得られやすいと思います。
MasashiKimura

2017/07/17 20:17

そうですね、x_train と xtrain_tempの shape がわからないことにはなんとも言えません
akihico

2017/07/17 21:43

失礼しました。修正してみましたが、いかがでしょうか。
guest

回答2

0

Python

1In []: x_train1=np.empty((720, 720, 3)) 2 3In []: x_train1 = np.expand_dims(x_train1, axis=0) 4 5In []: x_train1.shape 6Out[]: (1, 720, 720, 3) 7 8In []: x_train2=np.empty((720, 720, 3)) 9 10In []: x_train2 = np.expand_dims(x_train2, axis=0) 11 12In []: x_train2.shape 13Out[]: (1, 720, 720, 3) 14 15In []: x_train = np.concatenate((x_train1, x_train2), axis=0) 16 17In []: x_train.shape 18Out[]: (2, 720, 720, 3)

となります。

投稿2017/07/18 13:32

MasashiKimura

総合スコア1150

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

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

akihico

2017/07/20 16:07 編集

ご回答、ありがとうございました。 expand_dims、concatenateは知らなかったので、調べます。 教えていただいたサンプルから、自分の作りたい形に寄せて書き直したところ、うまく動きました。 参考にさせていただきます。 ーーーー ​import numpy as np import numpy as np In [2]: x_train1=np.empty((720, 720, 3)) x_train1 = np.expand_dims(x_train1, axis=0) x_train2=np.empty((720, 720, 3)) x_train2 = np.expand_dims(x_train2, axis=0) x_train3=np.empty((720, 720, 3)) x_train3 = np.expand_dims(x_train3, axis=0) In [3]: x_train = x_train1 x_train = np.concatenate((x_train, x_train2), axis=0) x_train = np.concatenate((x_train, x_train3), axis=0) In [4]: x_train.shape Out[4]: (3, 720, 720, 3) --------- 後日談なのですが、全てnumpyで行った方が、多くの画像を取り込んでも処理が落ちないことが分かり、こちらの方式で開発を勧めています。
guest

0

ベストアンサー

やりたいこと(要旨)
x_train_temp:追加したい画像(for文を何回も回しながらリストから拾う)
x_train:追加後の画像リスト
このような画像リストを作りたい。

起きている問題
ValueError: all the input arrays must have same number of dimensions
値エラー:すべての入力される配列は、同じ次元数でなければなりません。

原因?と思しきこと
動かしてないので保証はありませんが、恐らくこういうことかと。
追加元と追加先で要素の数が違って追加できない。
つまるところ、
画像のshape(縦、横、3ch)-->3
新しく追加したい配列のshape(インデックス、縦、横、3ch)--->4
∴追加時に2つの配列の要素数をそろえる必要がある。

解決策
1.for文を回しながら画像を3要素で配列に追加
2.for文の外でnp配列に変換
※問題があればintegerにするだとか正規化するだとかを挟んでください。

Python

1x_train = np.array([]) 2for row in res: 3 img_path = img_dir + row['id'] + '.png' 4 x_train_temp = cv2.imread(img_path) 5 # x_train = np.append(x_train,x_train_temp,axis=0) 6 x_train.append(x_train_temp) 7x_train = np.asarray(x_train)

投稿2017/07/17 22:05

編集2017/07/17 22:08
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

akihico

2017/07/18 14:33

ありがとうございます。無事に解決できました。 状況のまとめがわかりやすく、次回の質問に活かしたいと思いました。 最初の1行ですが、少し手直しして、動作しました。 #x_train = np.array([]) x_train = []
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問