AIと画像認識の事例!Pythonでプログラミングして試してみた

機械学習

AIで画像認識させて特定の物を検出した場合には外部機器を制御するようにPythonでプログラミングしました。

実際に動く物を検出しますので「人・動物の検知」「工場ラインの管理」等に応用できます。

 

リアルタイムで動体をAI+画像認識を行う

前回記事ではPLC(シーケンサ)と連携してPythonで画像認識を試してみました。前回は止まっていたコインを画像認識しました。

Pythonと機械学習ができること 画像認識を工場の事例で試してみた
「機械学習を使った画像認識」+「ラダー・PLCで動く工場の機器」を連携させてみました。Pythonとラズベリーパイでデバッグしましたので誰でも同様にテストすることができます。 Pythonは多くの分野で活躍しているプログラミング言...

 

今回はリアルタイムで動く「動体」をAIで画像認識させつつ外部機器のPLC(シーケンサ)をPythonで制御させます。イメージとしては下記です。

 

ただし実際の工場ではテストするのは無理のため、身近にある物を動かして画像認識させてPLC(シーケンサ)を制御してみます

 

ラズベリーパイでAI+画像認識をテストする

デバッグ環境としては「カメラ」とGoogle Edge TPU搭載のUSB接続デバイスである「Coral USB Accelerator」を使います。非常にコンパクトに収まります

 

PLCに関してはソフトウェアPLCの「CODESYS」を利用

外部機器としてのPLC(シーケンサ)に関してはソフトウェアPLCの「CODESYS」を使います。

 

誰でもフリーで使うことができ、簡単にラズベリーパイでテストできます。以前まとめた記事はこちらから

ソフトウェアPLC「CODESYS」の使い方まとめ
実質フリー(無料)で使えるのソフトウェアPLC「CODESYS」の使い方をまとめました。 「CODESYS」はラズベリーパイでデバッグできるため「自分でPLC(シーケンサ)を色々触ってみたい!」という方におすすめな記事となっています。...

 

AI(機械学習)+画像認識はカメラ+Google Edge TPUを利用

カメラ」とGoogle Edge TPU搭載のUSB接続デバイスである「Coral USB Accelerator」の使い方に関しては下記記事でまとめています。リンク先はこちらから

Google Edge TPUができること・使い方を確認してみた
Google Edge TPUの初心者である筆者が「ラズベリーパイ(raspberry pi)」+「USB Accelerator」の組み合わせで「できること」・「使い方」を確認・実践してみました。 Google Edge TPU...

 

筆者はGoogle Edge TPUの初心者でしたが、Google(正式にはCoralというブランド)がデモ用のモデル・プログラムを用意してくれていましたので簡単に始めることができました。

 

画像認識のPythonのプログラミング

今回はリアルタイムで「テニスボール」を検出した場合は「PLC(シーケンサ)の入力SW_ON」、「定規」を検出した場合には「PLC(シーケンサ)のリセットSW_ON」させるようにしました。

 

プログラミングの内容としては以前紹介した下記記事と同類です。

Google edge TPUが何を画像認識したかの情報を引っ張ってきて、その情報を元にPythonのGPIO出力からシーケンサを制御します

エッジコンピューティングで機械学習!画像認識・検出を実践してみた
エッジコンピューティングをGoogle edge TPUで実施してみました。機械学習で画像認識させて指定の物を検出した場合にはリアルタイムでGPIO制御(LED出力)させるようにプログラムしてみました。 エッジコンピューティングと...

 

Tensorflow liteのモデル・ラベルの中身を確認する

今回の検出目標である「テニスボール」・「定規」がTensorflow liteのラベルでどのように定義されているかを確認します。

 

モデル・ラベルに関してはCoralの公式ページにある「MobileNet V2 (ImageNet) 」を使います

 

ラベルに関してはテキスト「.txt」になっており簡単に確認できます。どのテキストエディッタでも構いませんのでファイルを開いて検索します。

 

1000個ある中から見つけました。テニスボール(tennis ball)が「853」で定規(ruler)が「770」でした。

 

今回は筆者の身近に在るものを適当に選びましたが、もし皆様で同様に実施する場合は好きな物を選びラベル内にあるかを確認してもらえれば構いません。

 

Edge TPUのPythonライブラリの中身を確認する

Google edge TPUのデモプログラム・ライブラリはPython(.py)で書かれています。

ラズベリーパイ(raspberry pi)ならばデフォルトでエディタも入っていますので直接中身を確認していきます

 

ちなみに筆者は少し前までPython初心者でしたが、下記記事で紹介しているUdemy で勉強することで今回のレベルのことは出来るようになりました。

未経験・社会人向け! Pythonと機械学習の勉強方法・始め方
未経験で社会人である筆者がPythonと機械学習を学ぶにあたって「今回の勉強方法はかなり実用的かつ効率的!」と強く実感した内容でしたので紹介したいと思います。 UdemyがPythonと機械学習の始め方に最適! 結論から言いますとの講座...

 

初心者が高い参考書を買って一人でPython勉強するよりは「非常に分かりやすく」「費用が抑えられる」はずですのでご参考ください。リンク先はこちらから

 

PythonでGPIO出力部のプログラムを並列処理させる

ラズベリーパイの「/home/pi/python-tflite-source/edgetpu/demo」にある「classify_capture.py」を見ていきます。

 

これより下のプログラム箇所は技術的に大分拙い箇所があると思いますが、素人が趣味で遊んでいるというレベルで見てもらえれば幸いです。

 

さらっと中身を見ていきますとresult[0][0]箇所に分類済のラベル番号のようですので、これを参考にフラグを立てて処理をしていきます。

 

高速で機械学習(画像認識)している中にGPIO制御入れていいのかが筆者の経験では分からず、一応並列処理させる形で対応しました。

 

LEDを出力するにはGPIO制御する必要がありますので最初にモジュールをインポートさせつつ、分類ラベルのフラグを共有させて

 

スレッドを「Google edge TPU」と「GPIO」で分けて(並列・平行処理して)対応しました。

 

今回はテニスボールの検出を「GPIO20」、定規の定規を「GPIO21」で出力するように対応しています。

一応何とか動くテストプログラムができました。

 

画像認識後のPLC(シーケンサ)のプログラミング

「CODESYS」を使ったラダーのプログラミングに関しては以前に紹介しましたので、詳細は省略したいと思います。簡単な例(自己保持回路)を作った記事はこちらから

入門編!簡単なPLC・ラダーのプログラムの例を作って動かしてみた
ラズベリーパイをPLC(シーケンサ)として使う実践編で「入門編!簡単なPLC・ラダーのプログラムの例を作って動かしてみた」を紹介します ラズベリーパイでラダーのプログラムを実際に数例動かして紹介しています。「自分でPLC(シー...

 

今回は「テニスボールを検知してPython側からGPIO出力」が来たら「入力_X001」をONするラダープログラムを作りました。同様に「定規を検知」したら「リセット_X003」をONします。

 

またテニスボール検出時の「入力_X001」がONしているときは「赤LED出力_Y001」がON、3回検出したら「緑LED出力_Y003」をONするようにしています。

定規検出時にはリセットされるので全LEDが消灯します。

 

ラズベリーパイのGPIOにPLCの入出力をリンクさせます。やり方については下記記事でまとめましたのでよろしければご覧ください。(リンク先はこちらから)

ラズベリーパイでPLC(シーケンサ)・ラダーの使い方を学んでみた
ラズベリーパイをPLC(シーケンサ)として使う実践編で「ラズベリーパイでPLC(シーケンサ)・ラダーの使い方を学んでみた」を紹介します ラズベリーパイでラダーのプログラムを実際に動かす手順を紹介しています。「自分でPLC(シーケンサ)...

 

今回筆者の場合は「入力SW_X001⇒GPIO4」「リセットSW_X003⇒GPIO22」「LED出力_Y001⇒GPIO17」「Python通知_Y003⇒GPIO27」に設定しました。

 

これでPLC側のラダープログラミングは終了です。テニスボールを検知すると赤LEDが点灯して、定規を検知するとリセットできるようになりました。

 

Python-PLC(シーケンサ)の回路図・配線

今回の回路図としてはLED、またラズベリーパイ内でのGPIO接続しただけの回路図ですが一応載せておきます。左側がPLC、右側がPythonというイメージでざっくり分けています。

 

今回のテスト環境は入力SWが無いので大分すっきりした形となりました、ブレッドボードを2つ使い「Python-PLC接続箇所」「LED箇所」を分けて対応しています。

 

ジャンパーと抵抗・LEDに関しては市販で売られている電子工作セットジャンパーワイヤーを使えば十分でした。

 

リアルタイムでAIの画像認識+PLC制御ができたか確認する

それではテストを開始していきます。

テスト開始方法

今回はラズベリーパイ上でソフトウェアPLCを走らせて…

 

Pythonのプログラムを起動させていきます。コマンド実行方法に関しては以前紹介した下記記事と同様です。作成したプログラムの名前で実行すればOKです

Google Edge TPUができること・使い方を確認してみた
Google Edge TPUの初心者である筆者が「ラズベリーパイ(raspberry pi)」+「USB Accelerator」の組み合わせで「できること」・「使い方」を確認・実践してみました。 Google Edge TPU...

 

python3 demo/classify_capture_kai.py --model test_data/mobilenet_v2_1.0_224_quant_edgetpu.tflite --label test_data/imagenet_labels.txt

 

テスト結果

テスト結果です。

最初にテニスボールを手で動かしてカメラの前を通過するとPythonからPLC入力_X001が入り、赤LEDがONしました。OKです。

 

そして3回テニスボールを画像検出した後はラダープログラム通り、緑LEDがONしています。OKです。

 

最後に定規を画像認識させるとPython側からリセットSWをONさせが行われ3枚のコインが画像認識されました。OKです

 

無事最後まで動作が確認できました。

 

実際の動画

今回も動画も撮ってYoutubeに上げてみました。リアルタイムで動くテニスボール・定規を画像認識してPython側からPLC(シーケンサ)制御できていることが分かります。

 

~16秒  プログラム実行

~28秒  1回目テニスボールを画像認識してPythonからPLC入力_X001が入り、赤LEDがON

~35秒  3回テニスボールを画像認識してラダーで緑LEDがON

~45秒  定規を画像認識してPythonからPLCリセット_X003が入り、緑LEDが消灯

 

まとめ・感想

Pythonでプログラミングしてラズベリーパイ+Edge TPUのデバッグ環境ですがリアルタイムでAIで画像認識させ、PLC(シーケンサ)を制御することができました。

 

Pythonならば簡単にプログラムを組めて色々な機器と連携させることができます。色々なケースで応用できそうです。

 

ちなみに筆者は少し前までPython初心者でしたが、下記記事で紹介しているUdemy で勉強することで今回のレベルのことは出来るようになりました。

未経験・社会人向け! Pythonと機械学習の勉強方法・始め方
未経験で社会人である筆者がPythonと機械学習を学ぶにあたって「今回の勉強方法はかなり実用的かつ効率的!」と強く実感した内容でしたので紹介したいと思います。 UdemyがPythonと機械学習の始め方に最適! 結論から言いますとの講座...

 

初心者が高い参考書を買って一人でPython勉強するよりは「非常に分かりやすく」「費用が抑えられる」はずですのでご参考ください。リンク先はこちらから

 

<<20190512追記>>

次の記事ではGoogleが「CES」等の世界規模の展示会で実施していた「Edge TPU Dev Board」のデモを自前で作ってみました。(リンク先はこちらから)

GoogleのAIの活用事例!Edge TPUのデモを自前で作ってみた
Googleが「CES」等の世界規模の展示会で実施していた「Edge TPU Dev Board」のデモを自前で作ってみました。 「ラズベリーパイ」と「USB Accelerator」で真似できましたので誰でも同様にAIの事例を試せま...

コメント