プログラマーが夜遅くにPythonでニューラルネットワークを実行し、中学生のようにデスクランプを消す

プログラマーが夜遅くにPythonでニューラルネットワークを実行し、中学生のようにデスクランプを消す

[[271670]]

一度ベッドに入ったら決して起き上がりたくない人にとって、電気を消すことは寝る前の最大の課題になります。

しかし、この世代のネットユーザーは決して失望させません。彼らはライトを消すためのさまざまな方法を開発しました。

[[271671]] [[271672]]

もちろん、ミスター・ビーンの最も単純かつ残酷な方法で電気を消すことは欠かせません。

しかし、イタリアのラポリスに住む若い男性は、自宅の照明を制御するために「ダンス ステップ」(体の姿勢) を使用することにしました。プロセス全体は、次のようにニューラル ネットワークを使用して実装されています。

[[271673]] [[271674]]

以下は若い人が書いたチュートリアルですが、原文の意味を変えずにまとめました。

今日の記事では、カメラで撮影した「ダンスステップ」を認識して照明のスイッチを制御するニューラルネットワークモデルをトレーニングする方法を段階的に説明します。

既存の OpenPose ディープラーニング モデルの上に独自のモデルを構築して体の位置を認識し、さまざまな体のさまざまなポーズを表すサンプルをいくつか構築します。

ダンス ステップ (ヒップホップ スーパーマン ステップ、T ポーズ ステップなど) やその他の体の姿勢のサンプルを作成したら、データセットをクリーンアップし、これらの例を使用してニューラル ネットワークをトレーニングします。

ニューラル ネットワークがトレーニングされたら、それを使用して照明を制御します。

今日の記事では多くの手順を取り上げていますが、すべてのコードは、私が収集した生データの例とともに Github で入手できます。

GitHub リンク:

https://github.com/burningion/dab-and-tpose-controlled-lights

ソフトウェアを作成するソフトウェアの作成: ニューラル ネットワークをどのようにトレーニングしますか?

[[271675]]

1 つ目は、大量のデータです。

今日使用するニューラル ネットワーク モデルは、カーネギー メロン大学のチームでも使用されており、同チームは独自のパノラマ データ セットを使用してモデルをトレーニングしました。このデータセットは、人間の骨の位置を表す 150 万個のラベルが手動で追加された 5 時間半のビデオで構成されています。

パノラマスタジオのドームには 500 台のカメラが設置されており、そのすべてが人々に向けられ、さまざまな角度から彼らの動きを記録します。

このパノラマ スタジオは、トレーニング データセットの構築にほぼ完璧であり、コンピューター ビジョンの実験を行うのに非常に便利です。

[[271676]]

今日は、彼らの仕事を基にして私たちの仕事が始まります。

まず、ツールを使用して小さなデータセットを作成します。最終的なニューラル ネットワークでは、記録されたヒップホップ スーパーマン ダンス ステップ、T ポーズ ダンス ステップ、その他のポーズを含む 171 のポーズのみを使用します。各ポーズの例は、カーネギーメロン大学の既存の研究から抽出されました。

ニューラル ネットワークの優れた点の 1 つは、他のユーザーが構築したモデルを取得し、新しいニューラル ネットワーク レイヤーを追加して拡張できることです。このプロセスは転移学習と呼ばれ、限られたリソースで転移学習を実行できます。

技術的には、このプロジェクトでは転移学習を使用しません。OpenPose の作業に若干の変更を加え、別のニューラル ネットワークを作成するためです。

そこで疑問になるのが、どうやってデータを取得するかということです。

プログラムを作成し、OpenCVを使用してラベル付きデータを収集する

OpenPose の成果を利用して、人間の骨格構造を表す 25 個のラベルを取得しました。ウェブカメラを制御し、画像に対して OpenPose を実行し、その動きをキーボードのキーにマッピングするプログラムを作成できます。

[[271677]]

つまり、T ポーズ アクションを実行してからキーボードの m キーを押すと、このアクションは T ポーズとして分類されます。この方法に従って 171 種類のポーズを追加し、ニューラル ネットワークをトレーニングするためのデータを取得しました。以下はデータ収集に使用されるコードの例です。

  1. # dab、tpose、その他の例のリストを作成します。 dabs = [] tposes = [] other = [] fps_time = 0 # ウェブカメラを毎回読み取りながら永久にループします。while True: ret_val、frame = vs.read() datum.cvInputData = frame opWrapper.emplaceAndPop([datum]) # 何が起こっているかを確認できるようにする必要があります。 image = datum.cvOutputData cv2.putText(image, "FPS: %f" % (1.0 / (time.time() - fps_time)), (10, 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2) cv2.imshow("Openpose", image) fps_time = time.time() # q キーを押すか、b または m キーを押してデータを保存して終了します。 key = cv2.waitKey(1) & 0xFF if key == ord("q"): break elif key == ord("b"): print("Dab: " + str(datum.poseKeypoints)) dabs.append(datum.poseKeypoints[0]) elif key == ord("m"): print("TPose: " + str(datum.poseKeypoints)) tposes.append(datum.poseKeypoints[0]) elif key == ord("/"): print("Other: " + str(datum.poseKeypoints)) other.append(datum.poseKeypoints[0]) # 後で分析するためにデータを numpy バ​​イナリ ファイルとして書き込む dabs = np.asarray(dabs) tposes = np.asarray(tposes) other = np.asarray(other) np.save('dabs.npy', dabs) np.save('tposes.npy', tposes)np.save('other.npy', other)  

次に、NumPy 配列を使用して特徴を保存し、np.save 関数を使用して、後で使用するために特徴をバイナリ ファイルとして保存します。個人的には、データの観察と処理には Jupyter ノートブックを使用することを好みます。

データが収集されると、データを観察してクリーンアップし、モデルをより適切にトレーニングできるようになります。

データを観察し、データをクリーンアップし、データを使用してモデルをトレーニングする

この部分は複雑に思えるかもしれませんが、Jupyter ノートブック、NumPy、Keras を使用することで、データを直感的に観察し、データをクリーンアップし、そのデータを使用してニューラル ネットワークをトレーニングすることができます。

スクリーンショットによると、npy ファイルに保存されたデータと OpenPose モデル自体には、25 個の既知の体の位置座標点、X、Y、および信頼度の 3 つの次元があることがわかります。

私たちのモデルトレーニング作業では、信頼度を使用する必要はありません。ボディ位置ポイントに名前が付けられている場合はそれを保持し、そうでない場合は 0 に設定します。

データの整理が(ほぼ)完了したので、特徴とラベルを組み合わせる必要があります。

0 は他のポーズを表し、1 はヒップホップ スーパーマン ダンス ステップを表し、2 は T ポーズ ダンス ステップを表します。

  1. labels = np.zeros(len(otherDataset))labels = np.append(labels, np.full((len(dabDataset)), 1 ))labels = np.append(labels, np.full((len(tposeDataset)), 2 )) print (labels) print ( "トレーニングの合計例数: %i。" % len(labels))

次に、ワンホットエンコーディングを使用して数値ラベルを処理します。つまり、ラベル 0、1、2 を [1、0、0]、[0、1、0]、[0、0、1] に変換します。その後、sklearnのシャッフル関数を使用してデータラベルと特徴をシャッフルすることができます(データラベルと特徴は元の対応関係を維持します)。

  1. # 今度は、同じ方法でラベルと配列をシャッフルします。from sklearn.utils import shuffleX1, y1 = shuffle(dataset, labels)# 今度は、'one hot' のラベルを付けます。from keras.utils.np_utils import to_categoricaly1 = to_categorical(y1, 3) # 3 つのカテゴリ、dab、tpose、other があります。print(y1.shape[1)]  

入力データは鼻や手などの位置を表し、0〜720と0〜1280の間のピクセル値であるため、データを正規化する必要があります。この方法では、入力画像データの解像度に関係なく、モデルを再利用できます。

  1. X1[:,:, 0 ] = X1[:,:, 0 ] / 720   # 寸法は 1280 x 720 だと思います ?X1[:,:,1] = X1[:,:,1] / 1280 # 確認してみましょう ?X1 = X1[:,:,1:]print(X1.shape)X1 = X1.reshape(len(X1), 50) # 信頼度パーセンテージは削除しました 

最後のステップでは、多次元データを 1 次元に変換します。 50 個の位置 (25 個のパーツ、各パーツの X 値と Y 値) をバッチでモデルに入力します。

モデルの構築とトレーニング

Jupyter ノートブックで Keras を使用すると、ニューラル ネットワーク モデルのトレーニングとテストが非常に簡単になり、それが Keras の最も気に入っている点です。

データにラベルが付けられ準備ができたので、数行のコードで簡単なモデルのトレーニングを開始できます。

ここで、Keras ライブラリをインポートし、単純なニューラル ネットワーク モデルをトレーニングします。

  1. keras.modelsからSequential をインポートkeras.layers からDense、Dropout、Activation、Flatten をインポートkeras.optimizers からSGDをインポート
  2. model = Sequential()model.add(Dense( 128 、 activation= 'relu' 、 input_shape=( 50 、)))model.add(Dropout( 0.5 ))model.add(Dense( 128 、 activation= 'relu' ))model.add(Dropout( 0.5 ))model.add(Dense(y1.shape[ 1 ]、 activation= 'softmax' ))model.compile(optimizer= 'Adam' 、 loss= 'categorical_crossentropy' 、 metrics=[ 'accuracy' ])model.fit(X1、 y1、 epochs= 2000 、 batch_size= 25 )

終わり!

ここで注意すべき点が 1 つあります。入力レイヤーのサイズは 50 です。念のため言っておきますが、この数値は OpenPose モデル内の位置ポイントの X 座標と Y 座標の合計です。

最後に、分類に使用される Softmax レイヤーを使用しました。モデルが異なるカテゴリの数を認識できるように、このレイヤーにy.shape[1]を渡します。

最後に、入力データを使用して、model.fit() メソッドを使用してモデルをトレーニングします。ここでは、2000 回の反復を実行しました (1 回の反復は、すべてのサンプルをトレーニングするための 1 回です)。 2000 回の反復は少し多すぎるように思われるかもしれません。反復が多すぎるとモデルに過剰適合の問題が発生する可能性があるため、500 回程度の反復の方が良いかもしれません。しかし、どちらの場合でも、反復回数を決定するには複数回の試行を実行する必要があります。

このコードを実行すると、精度が向上することがわかります。これが表示されない場合は、データをシャッフルしたときにデータ ラベルとデータ機能の対応が変更されていないことを再確認してください。さらに、データ内の値が0〜1の範囲内であるかどうかを確認する必要があります。

最後に、トレーニングしたモデルを保存します。サンプル データセットを使用してモデルをテストすることもできます。モデルを保存するコードは簡単です。

  1. model.save( 'data/dab-tpose-other.h5' ) # モデルを h5 として保存します 
  2. # 他のコードまたはインラインで、モデルをロードし、サンプルの dab データセットに対してテストしますimport kerasmodello = keras.models.load_model('data/dab-tpose-other.h5')dabDataset = np.load('data/test-dabs.npy')dabDataset[:,:,0] = dabDataset[:,:,0] / 720 # 寸法は 1280 x 720 だと思います ?dabDataset[:,:,1] = dabDataset[:,:,1] / 1280 # 確認してみましょう ?dabDataset = dabDataset[:,:,1:]dabDataset = dabDataset.reshape(len(dabDataset), 50)modello.predict_classes(dabDataset) # array([1, 1, 1, 1, 1, 1]) を返します 

モデルを使用して照明を制御する

ジェスチャーを認識できるモデルができたので、あとはこのモデルをワイヤレス照明制御に接続するだけです。

私の例では、Aeotec Z-Stick を使用して Z-Wave コマンドを送信し、それを 2 つの GE Z-Wave 屋外スイッチとペアリングしています。 USB インターフェイスは、NVIDIA TX2 人工知能モジュールに接続されています。実際、NVIDIA の Jestson Nano でも同じことができますが、Jetson Nano が提供できる解像度は、私のサンプルの 1280x720 解像度よりも低くなります。 Z-Stick を ARM デバイスに接続したら、まずスイッチを Z-Wave モードに切り替える必要があります。そのためには、USB スティックとライト スイッチのボタンをさらに数回押す必要がある場合があります。

コードは複雑ではなく、基本的にはトレーニング環境に追加のステップが追加されたものです。ここで、Keras をインポートし、クリーンアップされたデータを使用してモデルをトレーニングします。

  1. import cv2import pyopenpose as opfrom imutils import translate, rotate, resizeimport openzwavefrom openzwave.option import ZWaveOptionfrom openzwave.network import ZWaveNetwork # これらのコマンドを最初に実行してフラッシュし、次に tensorflow をロードするようにしてください...# tensorflow は、これらのコマンドがフラッシュするのに十分な時間を開始する必要がありますoptions = ZWaveOption('/dev/ttyACM0')options.lock()network = ZWaveNetwork(options)import timeimport numpy as npnp.random.seed(1337)import tensorflow as tf # tensorflow がすべての GPU メモリを占有しないようにしますconf = tf.ConfigProto()conf.gpu_options.allow_growth=Truesession = tf.Session(config=conf)import keras# カスタム パラメータ (その他のパラメータについては include/openpose/flags.hpp を参照してください)params = dict()params["model_folder"] = "../../models/"# TX2 ビデオ キャプチャが組み込まれています sourcevs = cv2.VideoCapture("nvarguscamerasrc ! video/x-raw(memory:NVMM), width=(int)1280, height=(int)720,format=(string)NV12, framerate=(fraction)24/1 ! nvvidconv flip-method=0 ! video/x-raw, format=(string)BGRx ! videoconvert ! video/x-raw, format=(string)BGR ! appsink")tposer = keras.models.load_model('dab-tpose-other.h5')# OpenPose を開始していますopWrapper = op.WrapperPython()opWrapper.configure(params)opWrapper.start()datum = op.Datum()np.set_printoptions(precision=4)fps_time = 0DAB = 1TPOSE = 2OTHER = 0LIGHTS = 0bounced = time.time()debounce = 3 # 別のコマンドを許可する前に 3 秒待機しますwhile True: ret_val, frame = vs.read() datum.cvInputData = frame opWrapper.emplaceAndPop([datum]) # 何が起こっているかを確認できるようにする必要があります image = datum.cvOutputData cv2.putText(image, "FPS: %f" % (1.0 / (time.time() - fps_time)), (10, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2) cv2.imshow("Openpose", image) if datum.poseKeypoints.any(): first_input = debounce: 続行 for node in network.nodes: for val in network.nodes[node].get_switches(): network.nodes[node].set_switch(val, False) LIGHTS = 0 bounced = time.time() elif j == 2: print("tpose が検出されました") if j == 1: print("dab が検出されました") if LIGHTS == 0 or (time.time() - bounced) < debounce: 続行 for node in network.nodes: for val in network.nodes[node].get_switches(): network.nodes[node].set_switch(val, False) LIGHTS = 0 bounced = time.time() elif j == 2: print("tpose が検出されました") if j == 3: print("dab が検出されました") if j == 4: LIGHTS == 1 or (time.time() - bounced) < debounce: continue for node in network.nodes: for val in network.nodes[node].get_switches(): network.nodes[node].set_switch(val, True) LIGHTS = 1 bounced = time.time() fps_time = time.time() # q キーを押すと終了、b または m を押すとデータが保存されます key = cv2.waitKey(1) & 0xFF if key == ord("q"): break # 後始末は自分で行います vs.release() cv2.destroyAllWindows()  

この時点で、作業は基本的に完了です。

ヒップホップ スーパーマンのダンス ステップや T ポーズのダンス ステップを認識するニューラル ネットワーク モデルのトレーニングに成功し、ダンス ステップに基づいてインタラクティブなライトを作成できるようになりました。

素晴らしいです。自分に親指を立ててください!

追記

すべてのコード、モデル、トレーニング データは Github で無料で入手できます。

このプロジェクトを Jupyter ノートブックで試してみることをお勧めします。コードにバグがあり、ワークブックからはそれを解明できませんでした。このバグにより、元の X ラベルと Y ラベルが正しくラベル付けされなくなりました。この脆弱性の解決策を見つけた場合は、Github でプルリクエスト (PR) を作成してください。

さらに、今日構築した基本モデルは、さまざまな種類のダンスの動きをトレーニングするために使用できます。私のモデルは 1 秒あたり数フレームしかキャプチャできませんが、ダンス ステップのデータセットの構築を開始し、さまざまなダンス ステップを認識できるニューラル ネットワーク モデルを構築できます。

<<:  マーケティングにおける AI についての考え方を変える 10 のグラフ

>>:  サーバーが過負荷状態です! GANで生成された肖像油絵は人気があり、一瞬でルネッサンス時代に戻ることができます

ブログ    
ブログ    
ブログ    

推薦する

Excelが変わりました! MicrosoftはPythonを搭載しているので、機械学習を直接行うことができます。

素晴らしいニュースです! Microsoft が Excel に Python を導入しました。 E...

Mambaはこのように使用できます。バイトをトークンに分割せずに効率的に学習します。

言語モデルを定義するときは通常、基本的な単語分割方法を使用して文を単語、サブワード、または文字に分割...

1 つの記事で NLP 実装の難しさを理解する

[51CTO.comからのオリジナル記事] 近年、自然言語処理技術は徐々に最も広く使用されている人工...

会話型AI: パンデミック時代の最先端技術

パンデミックの発生により、世界中の労働システムが危険にさらされています。コンタクト センターの従業員...

OpenAI、自然言語をコードに翻訳するAIシステムCodexのテストを開始

マイクロソフトなどの企業から強力なサポートを受けて、人工知能のスタートアップ企業であるOpenAIは...

ビジネスにおけるAIとIoTの重要性

人工知能とモノのインターネットは、ビジネスの運営方法に革命をもたらしています。一方、AI は、リアル...

壁につかまることを学んだロボット:私を落とすことはできない

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

清華大学の趙明国氏:AIチップ+ロボット、アルゴリズムのボトルネックを突破

この記事はLeiphone.comから転載したものです。転載する場合は、Leiphone.com公式...

ApolloとCarSim/TruckSimの共同シミュレーション

この記事は、Heart of Autonomous Driving の公開アカウントから許可を得て転...

ICML 優勝者 Lu Yucheng: 分散型機械学習の理論的な限界は何ですか?

この記事はLeiphone.comから転載したものです。転載する場合は、Leiphone.com公式...

人工知能の時代に教育はどのように適応すべきでしょうか?

これからの学びは、従来の学校中心の島型ではなく、新しいタイプの島型になります。家庭、インターネット、...

経験を要約し、進化を続け、インテリジェントエージェントのパラメータを最適化するコストを削減できます。

大規模モデルの出現は、インテリジェントエージェントの設計に革命的な変化を引き起こしました。ChatG...

...