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

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

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

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

Q&A

解決済

1回答

671閲覧

python画像処理

decomposer

総合スコア18

Python 3.x

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

0グッド

0クリップ

投稿2022/09/05 00:49

編集2022/09/05 02:44

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

python

1import numpy as np 2import random #擬似乱数を生成するライブラリー 3from PIL import Image, ImageOps #画像処理ライブラリー 4from sklearn.metrics import accuracy_score #モデルの正解率を計算するライブラリー 5import glob #ファイルパス名を取得するライブラリ 6import matplotlib.pyplot as plt #図をプロットするためのライブラリー 7import pandas as pd 8from sklearn.model_selection import train_test_split 9from sklearn.decomposition import PCA 10from sklearn.svm import LinearSVC 11from sklearn.neighbors import KNeighborsClassifier 12from sklearn.svm import SVC 13import xgboost as xgb 14import lightgbm 15 16np.random.seed(0) #乱数のシードの設定 17 18def main(): 19 path_train = glob.glob("*****/*.jpg") 20 df_val = pd.read_csv("******/train.csv", index_col=0) 21 print(df_val) 22 df = pd.DataFrame({}) 23 24 for item in path_train: 25 # im = Image.open(item).convert('RGB') 26 im = Image.open(item).convert("L") 27 28 img_resize =im.resize((128,128)) # 画像のサイズ変更 29 im_array = np.ravel(np.asarray(img_resize)) # 画像を配列に変換 30# im_array = np.asarray(img_resize) 31 im_regularized = im_array/255 # 正規化 32 33 list_value = [[item, im_regularized]] 34 peace = pd.DataFrame(list_value, columns=["image", "data"]) 35 peace = peace.set_index("image") 36 df = pd.concat([df, peace], axis=0) 37 print(df) 38 39 X_train, X_test, y_train, y_test = train_test_split(df, df_val, test_size=0.2, random_state=0) 40 41 N_dim = 100 # 100列に落とし込む 42 pca = PCA(n_components=N_dim, random_state=0) 43 pca.fit(X_train) 44 45 X_train_pca = pca.transform(X_train) 46 X_test_pca = pca.transform(X_test) 47 48 print('累積寄与率: {0}'.format(sum(pca.explained_variance_ratio_))) 49 50if __name__ == "__main__": 51 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.
###############################

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

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

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

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

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

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関数を(ランダムを前提として)使うと配列の順番がバラバラになってしまって、 学習済みのモデルを用いてテスト用に分割したデータで予測させても、 画像データ単独ではどのラベルにどの画像ファイルが該当するのかわからなくなるので、 画像ファイル名もデータフレームに入れる必要があります。 ご指導いただきありがとうございます。
guest

回答1

0

自己解決

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

python

1import numpy as np 2import random #擬似乱数を生成するライブラリー 3from PIL import Image, ImageOps #画像処理ライブラリー 4from sklearn.metrics import accuracy_score #モデルの正解率を計算するライブラリー 5import glob #ファイルパス名を取得するライブラリ 6import matplotlib.pyplot as plt #図をプロットするためのライブラリー 7import pandas as pd 8from sklearn.model_selection import train_test_split 9from sklearn.decomposition import PCA 10from sklearn.svm import LinearSVC 11from sklearn.neighbors import KNeighborsClassifier 12from sklearn.svm import SVC 13import xgboost as xgb 14import lightgbm 15 16def main(): 17 path_train = glob.glob("*****/*.jpg") 18 df_val = pd.read_csv("******/train.csv", index_col=0) 19 print(df_val) 20 array_list = [] 21 list_file = [] 22 23 for item in path_train: 24 list_file.append(item) 25 im = Image.open(item).convert('RGB') 26 img_resize =im.resize((128,128)) # 画像のサイズ変更 27 im_array = np.ravel(np.asarray(img_resize)) # 画像を配列に変換 28 im_regularized = im_array/255 # 正規化 29 array_list.append(im_regularized) 30 31 df = pd.DataFrame(np.vstack(array_list), index=list_file, dtype="float") 32 print(df) 33 34 X_train, X_test, y_train, y_test = train_test_split(df, df_val, test_size=0.2, random_state=0) 35 print("X_train:shape = ", X_train.shape) 36 print("X_train = ", X_train) 37 38 N_dim = 100 # 100列に落とし込む 39 pca = PCA(n_components=N_dim, random_state=0) 40 pca.fit(X_train) 41 X_train_pca = pca.transform(X_train) 42 X_test_pca = pca.transform(X_test) 43 44if __name__ == "__main__": 45 main()

投稿2022/09/07 10:00

decomposer

総合スコア18

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問