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

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

ただいまの
回答率

89.63%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 73

dendenmushi

score 58

前提・実現したいこと

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

環境

windows10 64bit
python3.7

該当のソースコード

x_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)

(Pdb) x_test[0][14]
array([[0.        ],
       [0.        ],
       [0.        ],
       [0.        ],
       [0.        ],
       [0.        ],
       [0.        ],
       [0.        ],
       [0.        ],
       [0.        ],
       [0.        ],
       [0.        ],
       [0.        ],
       [0.        ],
       [0.        ],
       [0.        ],
       [0.23137255],
       [0.9764706 ],
       [0.99607843],
       [0.24313726],
       [0.        ],
       [0.        ],
       [0.        ],
       [0.        ],
       [0.        ],
       [0.        ],
       [0.        ],
       [0.        ]], dtype=float32)
(Pdb) x_test.dtype
dtype('float32')

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

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

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

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

試したこと

    def cv2_bench(image_path, resize_h, resize_w):
        im = cv2.imread(image_path)

        # resize
        # (199, 289, 3) → (28, 28, 3)
        resized = cv2.resize(im, (resize_h, resize_w))

        # gray (28, 28, 3) → (28, 28, 1) & 255 Normalization
        np_im = cv2.cvtColor(resized, cv2.COLOR_BGR2GRAY) / 255.

        return np_im

    np_im = cv2_bench(white_line_add, 28, 28)

    # (28, 28) → (1, 28, 28, 1)
    img_cv2_4 = np_im[np.newaxis, :, :, np.newaxis]

    # dtype float64 → float32
    a_float = img_cv2_4.astype(np.float32)
    print(a_float.dtype)

起こっている問題

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

(MNISTの画像データ)

(Pdb) x_test[0][14]
array([[0.        ],
       [0.        ],
       [0.        ],
       [0.        ],
       [0.        ],
       [0.        ],
       [0.        ],
       [0.        ],
       [0.        ],
       [0.        ],
       [0.        ],
       [0.        ],
       [0.        ],
       [0.        ],
       [0.        ],
       [0.        ],
       [0.23137255],
       [0.9764706 ],
       [0.99607843],
       [0.24313726],
       [0.        ],
       [0.        ],
       [0.        ],
       [0.        ],
       [0.        ],
       [0.        ],
       [0.        ],
       [0.        ]], dtype=float32)

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

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

(Pdb) img_cv2_4[0][14]
array([[1.        ],
       [1.        ],
       [1.        ],
       [1.        ],
       [0.69019608],
       [0.08235294],
       [0.        ],
       [0.        ],
       [0.34117647],
       [0.97647059],
       [0.99215686],
       [0.99215686],
       [0.99215686],
       [0.99215686],
       [0.99215686],
       [0.99215686],
       [0.99215686],
       [0.99215686],
       [0.99215686],
       [0.94509804],
       [0.52941176],
       [0.        ],
       [0.        ],
       [0.28235294],
       [1.        ],
       [1.        ],
       [1.        ],
       [1.        ]])
(Pdb) a_float.dtype
dtype('float32')

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/02/02 01:25

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

    キャンセル

  • 2020/02/02 01:27 編集

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

    キャンセル

  • 2020/02/02 01:35

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

    キャンセル

  • 2020/02/02 06:44

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

    キャンセル

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

  • ただいまの回答率 89.63%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる
  • トップ
  • NumPyに関する質問
  • どんなローカル画像がきても特定のデータ型やshape次元数、正規化されたデータに変換したい。