質問内容
2つのサイトを参考にLeapMotionを用いて作成したデータセットを機械学習で学習させ、それをOpenCVによってカメラ画像によるリアルタイムでの判定を行おうと考えています。しかし訓練データの画像のサイズが分からないためにOpenCVでのカメラ画像の整形の部分でエラーが発生してしまいます。どこから訓練データの画像のサイズが分かるのでしょうか?またこの方法におかしな点はないでしょうか?
ソースコード
①機械学習のソースコード
参考にさせていただいたサイト:python+keras+LeapMotionで手の形の判別をしてみた。
python
1def make_tensorboard(set_dir_name=''): 2 tictoc = strftime("%a_%d_%b_%Y_%H_%M_%S", gmtime()) 3 directory_name = tictoc 4 log_dir = set_dir_name + '_' + directory_name 5 os.mkdir(log_dir) 6 tensorboard = TensorBoard(log_dir=log_dir, write_graph=True, ) 7 return tensorboard 8 9np.random.seed(1671) # for reproducibility 10 11# network and training 12DROPOUT = 0.2 13category = ["A", "I", "U","E","O"] 14lb=LabelBinarizer() 15# data: shuffled and split between train and test sets 16read_data0 = pd.read_csv('./20201202150510_0.csv', sep=',', index_col=0) 17read_data1 = pd.read_csv('./20201202150613_1.csv', sep=',', index_col=0) 18read_data2 = pd.read_csv('./20201202150632_2.csv', sep=',', index_col=0) 19read_data3 = pd.read_csv('./20201202150654_3.csv', sep=',', index_col=0) 20read_data4 = pd.read_csv('./20201202150729_4.csv', sep=',', index_col=0) 21read_data = pd.concat([read_data0, read_data1, read_data2, read_data3, read_data4], ignore_index=True) 22data = read_data.drop("label", axis=1).values 23label = read_data["label"].values 24 25x_train, x_test, y_train, y_test = train_test_split(data, label, test_size=0.2) 26 27x_train=np.array(x_train)/255 28x_test=np.array(x_test)/255 29 30# convert class vectors to binary class matrices 31y_train = np_utils.to_categorical(y_train) 32y_test = np_utils.to_categorical(y_test) 33 34print(" 訓練データ :", x_train.shape) 35print(" 訓練ラベル :", y_train.shape) 36print(" テストデータ :", x_test.shape) 37print(" テストラベル :", y_test.shape) 38 39model = Sequential() 40model.add(Dense(512, activation="relu", input_shape=(x_train.shape[1], ))) 41model.add(Dropout(DROPOUT)) 42model.add(Dense(512, activation="relu")) 43model.add(Dropout(DROPOUT)) 44model.add(Dense(len(category), activation="softmax")) 45model.summary()
②OpenCVでのカメラ画像のソースコード
参考にさせていただいたサイト:MNIST学習済みモデルとOpenCVを使ってリアルタイムに手書き数字を認識させる
# 動画表示 cap = cv2.VideoCapture(0) #model = load_model("sign.h5") # 学習済みモデルをロード model = keras.models.load_model('janken_model.h5') # 無限ループ while(cap.isOpened()): # 判定用データの初期化 Xt = [] Yt = [] ret, frame = cap.read() # 画像のサイズを取得,表示。 h, w, _ = frame.shape[:3] # 画像の中心点を計算 w_center = w//2 h_center = h//2 # 画像の真ん中に142×142サイズの四角を描く cv2.rectangle(frame, (w_center-70, h_center-70), (w_center+70, h_center+70),(255, 0, 0)) # カメラ画像の整形 im = frame[h_center-70:h_center+70, w_center-70:w_center+70] # トリミング im = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY) # グレースケールに変換 _, th = cv2.threshold(im, 0, 255, cv2.THRESH_OTSU) # 2値化 th = cv2.GaussianBlur(th,(9,9), 0) # ガウスブラーをかけて補間 th = cv2.resize(th,(28,28), cv2.INTER_CUBIC) # 訓練データと同じサイズに整形 Xt.append(th) Xt = np.array(Xt)/255 result = model.predict(Xt, batch_size=1) # 判定,ソート ch = ['A','I','U','E','O'] for i in range(len(ch)): r = round(result[0,i], 2) Yt.append([ch[i], r]) Yt = sorted(Yt, key=lambda x:(x[1])) # 判定結果を上位3番目まで表示させる cv2.putText(frame, "1:"+str(Yt[2]), (10,80), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255,155,0), 1, cv2.LINE_AA) cv2.putText(frame, "2:"+str(Yt[3]), (10,110), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255,100,255), 1, cv2.LINE_AA) cv2.putText(frame, "3:"+str(Yt[4]), (10,140), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (100,255,255), 1, cv2.LINE_AA) cv2.imshow("frame",frame) # カメラ画像を表示 # qキーが押されたら途中終了 if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() # カメラを解放 cv2.destroyAllWindows() # ウィンドウを消す
実行結果
①機械学習のソースコードの実行結果
訓練データ :(964, 63) 訓練ラベル :(964, 5) テストデータ :(242, 63) テストラベル :(242, 5) Model:"sequential_1" ---------------------------------------------- Layer(type) OUtput Shape Param # ============================================== dense_1(Dense) (None,512) 32768 ---------------------------------------------- dropout_1(Dropout) (None,512) 0 ---------------------------------------------- dense_2(Dense) (None,512) 262656 ---------------------------------------------- dropout_2(Dropout) (None,512) 0 ---------------------------------------------- dense_3(Dense) (None,5) 2565 ============================================== Total params: 297,989 Trainable params:297,989 Non-trainable params:0 ----------------------------------------------
②OpenCVでのカメラ画像のソースコードの実行結果
Traceback(most recent call last): File "camera.py", line 44,in <module> result = model.predict(Xt,batch_size=1) # 判定, ソート File "C:\Users(ユーザー名)\anaconda3\envs\py37\libs\site-packages\keras\engine\training.py", line 1441, in predict x, _, _ =self._standardize_user_data(x) File "C:\Users(ユーザー名)\anaconda3\envs\py37\libs\site-packages\keras\engine\training.py", line 579, in _standardize_user_data exception_prefix='input') File "C:\Users(ユーザー名)\anaconda3\envs\py37\libs\site-packages\keras\engine\training_utils.py", line 135, in standardize_input_data 'with shape ' + str(data_shape)) ValueError: Error when checking input: expected dense_1_input to have 2 dimensions, but got array with shape (1,28,28)
回答1件
あなたの回答
tips
プレビュー