前提・実現したいこと
ローカル画像を取り込んだ際にデータ型や色相などすべてを統一化させる方法。
どんなデータ型の画像を扱おうと、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を合わせている点です。
ローカル画像をこのような処置によりデータ型などを合わせるのは正しいのでしょうか。
アドバイス知見頂けないでしょうか。よろしくお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/01 16:25
2020/02/01 16:28 編集
2020/02/01 16:35
2020/02/01 21:44