分類編sellPython,機械学習,scikit-learn,EV3,アフレルAI本記事の内容はベータ公開としているので内容が変更される場合があります。EV3(以降EV3)とPython環境を利用して色の識別を分類を用いて行っていく。環境構築に関しては環境構築編の記事を参照してほしい。前回の記事ではライントレースと線形回帰を合わせた内容を行っている。内容は以下の書籍を参考にしている。Pythonを使ったEV3の基本的な制御等については以下に網羅されている。上記書籍との内容の関係は以下の通りになる。実行結果まとめ分類手法SVM(サポートベクターマシン)データの散布があったとき、それらを分けるための境界線を引くための手法。いうことになるが、予測には過去のデータを利用する。その際に外れ値のような余計なデータまで使ってしまうと精度が下がる可能性がある。そこでSVMは本当に予測に必要となる一部のデータのみ利用する。予測に必要となるデータのことをサポートベクトルと呼び、サポートベクトルを用いた機械学習法がサポートベクターマシンとなる。やること今回はカラーセンサーでRGB(赤緑青の度合い)と何色かのラベル番号をセットで採取する。EV3のカラーセンサーはRGB値は0~255の数値で取得できる。採取したデータ群をもとにそのデータが何色なのか境界を定めさせデータをもとに推論を行う。前回使用したコースの端にあるカラーを読み取っていく。プログラム内でラベルの定義を変更することで、ある程度の色を学習データとして利用することは可能なので好きな色を分類させることができる。今回も前回と同様のEV3のモデル「ベースロボ」を利用する。今回はモーターを動かすわけではないのでインテリジェントブロックとカラーセンサーさえあれば問題ないが、カラーセンサーは読み取る面から0.5cm~1cm程度の隙間が空いている必要があるため安定してカラーセンサーを固定できるモデルを利用する。今回は以下の2つのプログラムを作成する。EV3側プログラムdata_get_color.pyPC側プログラムClassification.py前回同様データの処理や推論自体はPC側プログラムで行い、EV3側ではカラーのRGB値の取得や送信を行う。それぞれのプログラムの関係性を以下の図に示す。EV3側プログラムEV3側プログラムdata_get_color.pyはVSCode上のワークスペースで作成する。ワークスペースの作成やEV3への転送方法については以下の記事を参照してほしい。program')sys.exit()※EV3側環境は日本語でコメントアウトすると文字コードの性質上エラーが発生するので注意が必要。50010))は、前回と同様に環境に応じて書き換える。以下のRED、GREEN、BLUEの箇所を変更することでデータとして記録する際のラベル名を変更できる。今回は赤、緑、青を読み取るので以下のままにする。}PC側プログラムPC側プログラムではEV3から送られてくるカラーの値とラベルをセットにCSVファイルに記録するのと、EV3側から推論のメッセージが送られてきたらデータ群を元に現在見ている色が何色か推論を行い結果を表示する。前回同様programフォルダにClassification.pyをテキストドキュメントとして作成し、以下の内容を記述する。OneVsRestClassifier(estimator)で多クラス分類を行うモデルを利用する。50010))はEV3側プログラム同様環境に合わせて変更する。環境の確認と変更方法は前回の記事もしくは以下を確認してほしい。ソケット通信のIP設定プログラムの実行2つのプログラムを作成できたらそれぞれ実行していく。data_get_gyro.pyを実行するコースに付属している色の上にEV3を設置し、カラーセンサーでRGB値を取得しPCに送信する。EV3の各ボタンに操作が設定されているため応じてボタンを押下してデータを採取する。上:保存する色(ラベル)を切り替える下:保存する色(ラベル)を切り替える右:ボタンが押されたら、その時のカラーセンサーの値とラベルをPCに送信する(データ採取)左:ボタンがおされたら、その時のカラーセンサーの値をPCに送信する(推論)上記のように操作が設定されているので、採取したい色に上下ボタンでラベルを合わせて、右ボタンを押してデータを採取する。上下ボタンを押すとVSCode上で採取するラベルの名前が切り替わる。右ボタンでカラーのデータを採取するとVSCode上とコマンドプロンプト上に以下のようにRGB値とラベルが出力され、、CSVファイルに保存される。同じように各ラベルである程度データを集める。実行結果ある程度データを採取できたらEV3の左上のボタンを押して一度プログラムを終了する。CSVが作成されているのを確認する。再度同じ手順でPC側、EV3側のプログラムをそれぞれ実行し、それぞれ採取した色の上で左ボタンを押して推論結果をPC側で確認する。それぞれの色が判別できているのが確認できる。実際のカラーデータで判別する前に採取したデータ群の一部をテストデータとして用いて正確率を表示している。まとめ実際にロボットから受け取ったデータで分類を行うことができた。今回はSVMの手法を用いたが、Scikit-learnのモデル指定の記述を変更することでランダムフォレストなど他の分類手法で機械学習を実装することも可能だ。昨今の機械学習ではPC内で簡潔してしまうものが多いが、今回のようにエッジ(ロボット側)で実行結果を確認できる点や自分で採取したデータを利用する点においては身近に感じることができるのではないだろうか。Appendix3次元データのプロット今回取得したRGBのような3次元のデータを以下のようなプログラムでプロットする。プロットには前回の記事でインストールしたライブラリmatpolotlib必要なので注意color_data.csvがあるフォルダ下に3d_graph.pyを作成する。コマンドで作成したフォルダに移動する。3d_graph.pyで実行するとcsvファイルを読み込み以下のように3次元のグラフをプロットすることができ、データの分布を確認することができる。