🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Q&A

解決済

1回答

1841閲覧

CNNで学習した画像をOpenCVで整形

huton

総合スコア30

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

0グッド

0クリップ

投稿2020/12/07 15:44

質問内容

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)

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

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

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

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

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

jbpb0

2020/12/07 23:57 編集

> LeapMotionを用いて作成したデータセットを機械学習で学習させ のコードも、質問者さんが書いたのですよね? > 訓練データの画像のサイズが分からないため > OpenCVでのカメラ画像の整形の部分でエラーが発生 OpenCVでの推論時の入力サイズは、学習に使った「LeapMotionを用いて作成したデータセット」のサイズに合わせればいいのではないのですか? 学習のコードを書いたのなら、データセットのサイズはご存じですよね? というか、「LeapMotionを用いて作成したデータセット」って、そもそも画像なのでしょうか?
jbpb0

2020/12/08 00:12 編集

> ①機械学習のソースコードの実行結果 > 訓練データ :(964, 63) の、964がデータ数、63が各データの特徴量の数だと思います 学習のコード内でcsvを読んで、その後で"label"という項目だけ削除してデータにしているので、おそらくcsvは横方向に数値が64個並んでいるのだと思います なので、OpenCVでの推論時にも、学習時の入力と同じ63個の要素のデータを入力しないといけないと思います LeapMotionというものを全然知らないので、入力の63個のデータと、カメラの画像の関係は分かりませんが、csvを質問者さんが用意されたのなら、その中の64種類("label"を除けば63種類)の数値の意味はご存じなのですよね?
huton

2020/12/08 05:45 編集

>というか、「LeapMotionを用いて作成したデータセット」って、そもそも画像なのでしょうか? 画像であると思い込んでいました。画像ではなく指の各関節の位置やデータであると思われます。 混乱させるようなことを書いてしまい申し訳ありませんでした。 > LeapMotionを用いて作成したデータセットを機械学習で学習させ ①のソースコードは参考させていただいたサイト内のプログラムをほぼほぼコピーしたものです。 上述したように画像と勘違いしていたので、画像の縦横が書かれてはいないけど決まっているはずと思い質問してしまいました。
huton

2020/12/08 05:48

>その中の64種類("label"を除けば63種類)の数値の意味はご存じなのですよね? これに関してもソースコードをほとんど真似ただけなので、63種類の数値があることはわかっていましたが正確な意味はわかりません。
guest

回答1

0

ベストアンサー

学習には指の各ボーンのベクトルを用います。

参照した①について、上記の記載があります。
LeapMotionは画像ではなく指の各関節ごとの骨の座標や大きさのデータを取得して学習しているわけです。

もしもOpenCVを利用して画像から行うのであれば、指の関節などを取得するような前処理が必要になります。

投稿2020/12/07 23:55

t_obara

総合スコア5488

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問