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

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

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

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

OpenCV

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

Python 3.x

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

機械学習

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

統計

統計は、集団現象を数量で把握することです。また、調査で得られた性質や傾向を数量的に表したデータのことをいいます。

Q&A

解決済

1回答

1073閲覧

どんなローカル画像がきても特定のデータ型やshape次元数、正規化されたデータに変換したい。

dendenmushi

総合スコア98

NumPy

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

OpenCV

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

Python 3.x

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

機械学習

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

統計

統計は、集団現象を数量で把握することです。また、調査で得られた性質や傾向を数量的に表したデータのことをいいます。

0グッド

0クリップ

投稿2020/02/01 15:54

前提・実現したいこと

ローカル画像を取り込んだ際にデータ型や色相などすべてを統一化させる方法。
どんなデータ型の画像を扱おうと、MNISTのデータと同じデータ型や形式や配列、色相に自動的に変換できるメソッドを作りたい。

環境

windows10 64bit
python3.7

該当のソースコード

python

1x_test, y_test = data

このデータにはMNIST1万の画像データが入っています。
x_test.shape = (10000, 28, 28, 1)
x_test.shape[0].shape = (28, 28, 1)
x_test.shape[0][14].shape = (28, 28, 1)

cmd

1(Pdb) x_test[0][14] 2array([[0. ], 3 [0. ], 4 [0. ], 5 [0. ], 6 [0. ], 7 [0. ], 8 [0. ], 9 [0. ], 10 [0. ], 11 [0. ], 12 [0. ], 13 [0. ], 14 [0. ], 15 [0. ], 16 [0. ], 17 [0. ], 18 [0.23137255], 19 [0.9764706 ], 20 [0.99607843], 21 [0.24313726], 22 [0. ], 23 [0. ], 24 [0. ], 25 [0. ], 26 [0. ], 27 [0. ], 28 [0. ], 29 [0. ]], dtype=float32) 30(Pdb) x_test.dtype 31dtype('float32')

y_testはMNIST1万のラベルが格納されています。

y_test.shape = (10000, 10)
y_test[0].shape = (10,)

cmd

1(Pdb) y_test[0] 2array([0., 0., 0., 0., 0., 0., 0., 1., 0., 0.], dtype=float32) 3(Pdb) y_test.dtype 4dtype('float32')

ローカルの画像を同じ形式にしたく以下のような画像変換を行いました。
そのコードが以下です。

試したこと

cmd

1 2 def cv2_bench(image_path, resize_h, resize_w): 3 im = cv2.imread(image_path) 4 5 # resize 6 # (199, 289, 3) → (28, 28, 3) 7 resized = cv2.resize(im, (resize_h, resize_w)) 8 9 # gray (28, 28, 3) → (28, 28, 1) & 255 Normalization 10 np_im = cv2.cvtColor(resized, cv2.COLOR_BGR2GRAY) / 255. 11 12 return np_im 13 14 np_im = cv2_bench(white_line_add, 28, 28) 15 16 # (28, 28) → (1, 28, 28, 1) 17 img_cv2_4 = np_im[np.newaxis, :, :, np.newaxis] 18 19 # dtype float64 → float32 20 a_float = img_cv2_4.astype(np.float32) 21 print(a_float.dtype) 22 23

起こっている問題

本来であれば以下にしたいのですが、

(MNISTの画像データ)

cmd

1(Pdb) x_test[0][14] 2array([[0. ], 3 [0. ], 4 [0. ], 5 [0. ], 6 [0. ], 7 [0. ], 8 [0. ], 9 [0. ], 10 [0. ], 11 [0. ], 12 [0. ], 13 [0. ], 14 [0. ], 15 [0. ], 16 [0. ], 17 [0. ], 18 [0.23137255], 19 [0.9764706 ], 20 [0.99607843], 21 [0.24313726], 22 [0. ], 23 [0. ], 24 [0. ], 25 [0. ], 26 [0. ], 27 [0. ], 28 [0. ], 29 [0. ]], dtype=float32)

しかし上記ソースコードにある画像変換を行うと以下のようになりました。

(ローカル画像のコード実行後)

cmd

1(Pdb) img_cv2_4[0][14] 2array([[1. ], 3 [1. ], 4 [1. ], 5 [1. ], 6 [0.69019608], 7 [0.08235294], 8 [0. ], 9 [0. ], 10 [0.34117647], 11 [0.97647059], 12 [0.99215686], 13 [0.99215686], 14 [0.99215686], 15 [0.99215686], 16 [0.99215686], 17 [0.99215686], 18 [0.99215686], 19 [0.99215686], 20 [0.99215686], 21 [0.94509804], 22 [0.52941176], 23 [0. ], 24 [0. ], 25 [0.28235294], 26 [1. ], 27 [1. ], 28 [1. ], 29 [1. ]]) 30(Pdb) a_float.dtype 31dtype('float32')

もちろん違う画像ですので中身の数値が正確にあっている必要はありません。
正規化により255内が1内に変わった点やdtype32に変わり同じになった点まではよかったのですが、表記方法が違うようです。
カッコの中にdtype32と記載されています。

同じ形式のデータにしようとしているのですが、もうひとつ心配な点があります。
それは次元数をただ単純に先頭と最後に1を追加しているだけで強引にshapeを合わせている点です。
ローカル画像をこのような処置によりデータ型などを合わせるのは正しいのでしょうか。
アドバイス知見頂けないでしょうか。よろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

コードを見ましたが、とくに問題点はないように見えます。

表記方法が違うようです。

前者は numpy 配列を print した結果、後者は dtype だけを print した結果なので、表記が違いますが、どちらも float32 になっているので、問題ないです。

先頭と最後に1を追加しているだけで強引にshapeを合わせている点です。

先頭に1を追加するのは、画像が1枚だけの場合は通常、そうします。
最後に1を追加するのは畳み込み層に入れるなら、チャンネルの次元も必要なので、これもこのやり方で問題ないです。

投稿2020/02/01 16:03

tiitoi

総合スコア21956

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

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

dendenmushi

2020/02/01 16:25

ありがとうございました。
dendenmushi

2020/02/01 16:28 編集

すみません。少し付け加えますが、コマンド自体は名前[0][14]で同じでした。にもかかわらず、前者は,dtype=float32と付加されており、ローカル上で変換処理をかけたほうも名前[0][14]で表示は,dtypeは付加されていませんでしたが、これもデータとしては違いはないのでしょうか。
tiitoi

2020/02/01 16:35

配列a, b があったとして、両方の shape, dtype が一致しているかどうか確認してみてください。一致していれば、問題ないと思います。
dendenmushi

2020/02/01 21:44

そうなのですね。いったいなぜ,dtypeと付加される場合とされない場合があるのか疑問ですが、確かにshapeとdtypeで一致していました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問