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

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

新規登録して質問してみよう
ただいま回答率
86.12%
Python 3.x

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

解決済

python画像処理

decomposer
decomposer

総合スコア10

Python 3.x

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

1回答

0リアクション

0クリップ

335閲覧

投稿2022/09/05 00:49

編集2022/09/05 02:44

pythonで画像処理プログラムを作成しています。
google-colaboratry で以下のコードを走らせても
pca.fit(X_train)
の行で以下のエラーメッセージを吐いて処理が止まってしまいます。
PCAの次元削減の部分でどうしてもエラーが返ってきます。
どうすればいいか皆目見当がつきません。
どうかご助力お願いします。

python

import numpy as np import random #擬似乱数を生成するライブラリー from PIL import Image, ImageOps #画像処理ライブラリー from sklearn.metrics import accuracy_score #モデルの正解率を計算するライブラリー import glob #ファイルパス名を取得するライブラリ import matplotlib.pyplot as plt #図をプロットするためのライブラリー import pandas as pd from sklearn.model_selection import train_test_split from sklearn.decomposition import PCA from sklearn.svm import LinearSVC from sklearn.neighbors import KNeighborsClassifier from sklearn.svm import SVC import xgboost as xgb import lightgbm np.random.seed(0) #乱数のシードの設定 def main(): path_train = glob.glob("*****/*.jpg") df_val = pd.read_csv("******/train.csv", index_col=0) print(df_val) df = pd.DataFrame({}) for item in path_train: # im = Image.open(item).convert('RGB') im = Image.open(item).convert("L") img_resize =im.resize((128,128)) # 画像のサイズ変更 im_array = np.ravel(np.asarray(img_resize)) # 画像を配列に変換 # im_array = np.asarray(img_resize) im_regularized = im_array/255 # 正規化 list_value = [[item, im_regularized]] peace = pd.DataFrame(list_value, columns=["image", "data"]) peace = peace.set_index("image") df = pd.concat([df, peace], axis=0) print(df) X_train, X_test, y_train, y_test = train_test_split(df, df_val, test_size=0.2, random_state=0) N_dim = 100 # 100列に落とし込む pca = PCA(n_components=N_dim, random_state=0) pca.fit(X_train) X_train_pca = pca.transform(X_train) X_test_pca = pca.transform(X_test) print('累積寄与率: {0}'.format(sum(pca.explained_variance_ratio_))) if __name__ == "__main__": main()

エラーメッセージ
###############################

TypeError Traceback (most recent call last)
TypeError: only size-1 arrays can be converted to Python scalars

The above exception was the direct cause of the following exception:

ValueError Traceback (most recent call last)
<ipython-input-17-8d81aa9fba70> in <module>
57
58 if name == "main":
---> 59 main()

5 frames
<ipython-input-17-8d81aa9fba70> in main()
49
50 pca = PCA(n_components=N_dim, random_state=0)
---> 51 pca.fit(X_train)
52
53 X_train_pca = pca.transform(X_train)

/usr/local/lib/python3.7/dist-packages/sklearn/decomposition/_pca.py in fit(self, X, y)
380 Returns the instance itself.
381 """
--> 382 self._fit(X)
383 return self
384

/usr/local/lib/python3.7/dist-packages/sklearn/decomposition/_pca.py in _fit(self, X)
429
430 X = self._validate_data(
--> 431 X, dtype=[np.float64, np.float32], ensure_2d=True, copy=self.copy
432 )
433

/usr/local/lib/python3.7/dist-packages/sklearn/base.py in _validate_data(self, X, y, reset, validate_separately, **check_params)
564 raise ValueError("Validation should be done on X, y or both.")
565 elif not no_val_X and no_val_y:
--> 566 X = check_array(X, **check_params)
567 out = X
568 elif no_val_X and not no_val_y:

/usr/local/lib/python3.7/dist-packages/sklearn/utils/validation.py in check_array(array, accept_sparse, accept_large_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, estimator)
744 array = array.astype(dtype, casting="unsafe", copy=False)
745 else:
--> 746 array = np.asarray(array, order=order, dtype=dtype)
747 except ComplexWarning as complex_warning:
748 raise ValueError(

/usr/local/lib/python3.7/dist-packages/pandas/core/generic.py in array(self, dtype)
1991
1992 def array(self, dtype: NpDtype | None = None) -> np.ndarray:
-> 1993 return np.asarray(self._values, dtype=dtype)
1994
1995 def array_wrap(

ValueError: setting an array element with a sequence.
###############################

以下のような質問にはリアクションをつけましょう

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

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

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

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

適切な質問に修正を依頼しましょう。

jbpb0

2022/09/05 02:13

pythonのコードの一番最初の行のすぐ上に ```python だけの行を追加してください また、pythonのコードの一番最後の行のすぐ下に ``` だけの行を追加してください または、 https://teratail.storage.googleapis.com/uploads/contributed_images/56957fe805d9d7befa7dba6a98676d2b.gif を見て、そのようにしてみてください 現状、コードがとても読み辛いです 質問にコードを載せる際に上記をやってくれたら、他人がコードを読みやすくなり、コードの実行による現象確認もやりやすくなるので、回答されやすくなります 現状の質問は、コードの途中の一部だけが上記の状態になってると思いますが、コード全体をそうしてください
jbpb0

2022/09/05 02:17

google colabのエラーメッセージの「5 frames」をクリックしたら、エラーメッセージの隠れてる部分も表示されると思うので、それを全部質問に記載してください (ここに書くのではなく、質問を編集して追記する)
meg_

2022/09/05 10:24

X_trainのshapeはどうなっていますか?
decomposer

2022/09/05 13:20

お忙しい中返答していただき、ありがとうございます。 X_trainのshapeは (3390, 1)でした。どうかよろしくお願いします。
meg_

2022/09/05 13:25

データは1列なのですか?それは想定通りですか?
decomposer

2022/09/05 14:54 編集

はい、データは1列で想定内です。
jbpb0

2022/09/06 00:58 編集

> PCAの次元削減の部分で > データは1列で想定内 1列なら、それ以上「削減」できない > N_dim = 100 # 100列に落とし込む pca = PCA(n_components=N_dim, random_state=0) pca.fit(X_train) が計算できるのは、「X_train」が100列以上ある場合です 下記を実行したら、分かると思います # 200列は100列以上なので大丈夫 X_train = pd.DataFrame(np.random.rand(100, 200)) print(X_train.shape) pca = PCA(n_components=100, random_state=0) pca.fit(X_train) # 100列は100列以上なので大丈夫 X_train = pd.DataFrame(np.random.rand(100, 100)) print(X_train.shape) pca = PCA(n_components=100, random_state=0) pca.fit(X_train) # 99列は100列以上ではないのでダメ X_train = pd.DataFrame(np.random.rand(100, 99)) print(X_train.shape) pca = PCA(n_components=100, random_state=0) pca.fit(X_train) # 1列は100列以上ではないのでダメ X_train = pd.DataFrame(np.random.rand(100, 1)) print(X_train.shape) pca = PCA(n_components=100, random_state=0) pca.fit(X_train)
jbpb0

2022/09/06 01:05

> img_resize =im.resize((128,128)) # 画像のサイズ変更 im_array = np.ravel(np.asarray(img_resize)) # 画像を配列に変換 から、「X_train」が128*128=16384列あるのを前提にして次元削減しようとしてるような気がするのですが、 > データは1列で想定内 は本当ですか?
decomposer

2022/09/06 20:08 編集

はい、すみません。 「『X_train』が128*128=16384列あるのを前提にして次元削減しようと」していました。 勘違いしていました。すみません。 大学院で機械学習を専攻していたわけでなく、本当に独学で学び始めたばかりです。 とにかく画像処理はアマチュアで勉強し始めたばかりで原理などはあまり理解せずにやっていました。 とにかくコードが動作するか確認してみようという意図で今回のコードを書いていたのでそこまで 気にしていませんでした。お手間をお取りして申し訳ありません。
jbpb0

2022/09/07 04:28 編集

> 「『X_train』が128*128=16384列あるのを前提にして次元削減しようと」していました。 現状は「X_train」はそうなってなくて1列なので、「X_train」の作り方が間違ってるわけですよね list_value = [[item, im_regularized]] peace = pd.DataFrame(list_value, columns=["image", "data"]) peace = peace.set_index("image") ↓ 変更 peace = pd.DataFrame(im_regularized.reshape(1, -1)) とすれば、「df」や「X_train」は16384列になり、この質問のエラーは出なくなると思います ただし、そうしたら list_value = [[item, im_regularized]] peace = pd.DataFrame(list_value, columns=["image", "data"]) peace = peace.set_index("image") でやってることが無くなるので、もし後でそれが必要ならば困ります 上記三行でやってることは、必要なのでしょうか?
decomposer

2022/09/07 08:25 編集

ええ、画像処理のDataFrameを作成するうえで3つの工程は必要だと今の自分は考えています。 お時間をおかけして申し訳ありません。 最初は画像をファイルを1つ読み込むごとに 画像1枚分のDataFrameを作成して既存のDataFrameに結合するという処理をしていましたが 助言を受けて全体の工程を見直しました。 画像一枚の処理ごとに画像データのndarrayをリストに入れて 全ての画像データの読み込みが終わった後にndarrayの入ったリストをnumpy.vstack()で結合したのちに DataFrameにする処理でうまくいきました。 主成分分析の次元削減についても勘違いしていてお手間をおかけして申し訳ありませんでした。 とにかく今回の問題については処理方法を見直したことで解決いたしました。 貴重なお時間をお取りしてしまい申し訳ありません。 沢山の技術的アドバイスをいただき、大変勉強になりました。 本当にありがとうございました。
jbpb0

2022/09/07 09:08

> 今回の問題については処理方法を見直したことで解決いたしました。 そうなら、どうやったのかを回答に書いて、「自己解決」にしてください 解決したので、以下は蛇足ですが、私の質問 > 上記三行でやってることは、必要なのでしょうか? は、画像の画素値である「im_regularized」だけじゃなく、画像ファイルのパスである「item」もデータフレームに入れる必要があるのか? という質問です > 画像処理のDataFrameを作成するうえで3つの工程は必要だと今の自分は考えています。 とは、画像ファイルのパスである「item」もデータフレームに入れる必要がある、という意味ですか?
decomposer

2022/09/07 09:51

はい、画像ファイルのパスである「item」もデータフレームに入れる必要があります。 最終的に画像ファイルがどのクラスに所属するかを予測してcsvファイルに出力する必要があります。 ファイル名とその画像ファイルに該当する識別ラベルを出力したいので「item」 もデータフレームに入れる必要があります。 train_test_split関数を(ランダムを前提として)使うと配列の順番がバラバラになってしまって、 学習済みのモデルを用いてテスト用に分割したデータで予測させても、 画像データ単独ではどのラベルにどの画像ファイルが該当するのかわからなくなるので、 画像ファイル名もデータフレームに入れる必要があります。 ご指導いただきありがとうございます。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Python 3.x

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