Q&A
前提・実現したいこと
自作したデータセットを用いて、
入力した画像が犬か猫かを判別するプログラムを作成したいです。
学習させて、精度を求めるところまで、作成できたのですが、
画像を読み込んで、predictするとエラーが発生しました。
発生している問題・エラーメッセージ
X has 64 features, but LogisticRegression is expecting 2500 features as input. 翻訳: Xには64の機能がありますが、LogisticRegressionは入力として2500の機能を期待しています。
該当のソースコード
画像をテストデータにして、predictするプログラム。
Python
1import cv2 2import matplotlib.pyplot as plt 3%matplotlib inline 4 5def predict_digit(filename): 6 #画像を読み込む 7 my_img = cv2.imread(filename) 8 plt.imshow(my_img) 9 plt.show() 10 11 #グレースケールに変換する 12 my_img = cv2.cvtColor(my_img, cv2.COLOR_BGR2GRAY) 13 14 # 8 * 8のサイズに変換する 15 my_img = cv2.resize(my_img,(8,8)) 16# plt.imshow(my_img) 17# plt.show() 18 19 #白黒反転する 20 my_img = 15 - my_img // 16 21 plt.imshow(my_img) #画像を貼り付ける 22 plt.axis('off') #グラフのメモリを消す 23 plt.show() #画像を表示する 24 25 # print(my_img) 26 #二次元を一次元に変換 27 my_img = my_img.reshape((-1,64)) 28 res = clf.predict(my_img) 29 return res[0] 30 31n = predict_digit("dog.jpg") 32print("dog.jpg = " + str(n)) 33
学習して、精度を出すまでのプログラム
Python3
1#集めた画像データを学習データにする 2import matplotlib.pyplot as plt 3import os 4import cv2 5import random 6import numpy as np 7DATADIR = "C:/Users/19t339/Documents/work/犬と猫/PetImages" 8CATEGORIES = ["Dog", "Cat"] 9IMG_SIZE = 50 10training_data = [] 11def create_training_data(): 12 for class_num, category in enumerate(CATEGORIES): 13 path = os.path.join(DATADIR, category) 14 for image_name in os.listdir(path): 15 try: 16 img_array = cv2.imread(os.path.join(path, image_name), cv2.IMREAD_GRAYSCALE) # 画像読み込み 17 img_resize_array = cv2.resize(img_array, (IMG_SIZE, IMG_SIZE)) # 画像のリサイズ 18 training_data.append([img_resize_array, class_num]) # 画像データ、ラベル情報を追加 19 except Exception as e: 20 pass 21create_training_data() 22random.shuffle(training_data) # データをシャッフル 23X_train = [] # 画像データ 24y_train = [] # ラベル情報 25# データセット作成 26for feature, label in training_data: 27 X_train.append(feature) 28 y_train.append(label) 29# numpy配列に変換 30X_train = np.array(X_train) 31y_train = np.array(y_train) 32 33#変数の名前を分かりやすくする 34X = X_train 35y = y_train 36 37 38#画像データの次元を3次元から2次元へ落としている 39X= X.reshape(len(X), -1).astype(np.float64) 40y= y.reshape(len(y), -1).astype(np.float64) 41 42 43#学習データとテストデータのシャッフル 44from sklearn.model_selection import ShuffleSplit 45ss = ShuffleSplit(n_splits=1, 46 train_size=0.8, 47 test_size=0.2, 48 random_state=0) 49 50train_index, test_index = next(ss.split(X,y)) 51 52X_train, X_test = X[train_index], X[test_index] 53y_train, y_test = y[train_index], y[test_index] 54 55#学習と精度評価 56from sklearn import linear_model 57clf = linear_model.LogisticRegression(solver='liblinear') 58 59clf.fit(X_train,y_train) 60clf.score(X_test,y_test) 61
試したこと
画像ファイルの拡張子の変更。
エラーメッセージの検索
補足情報(FW/ツールのバージョンなど)
jupiter notebook
回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。