AIで画像認識させて特定の物を検出した場合には外部機器を制御するようにPythonでプログラミングしました。
実際に動く物を検出しますので「人・動物の検知」「工場ラインの管理」等に応用できます。
リアルタイムで動体をAI+画像認識を行う
前回記事ではPLC(シーケンサ)と連携してPythonで画像認識を試してみました。前回は止まっていたコインを画像認識しました。
今回はリアルタイムで動く「動体」をAIで画像認識させつつ外部機器のPLC(シーケンサ)をPythonで制御させます。イメージとしては下記です。
ただし実際の工場ではテストするのは無理のため、身近にある物を動かして画像認識させてPLC(シーケンサ)を制御してみます
ラズベリーパイでAI+画像認識をテストする
デバッグ環境としては「カメラ」とGoogle Edge TPU搭載のUSB接続デバイスである「Coral USB Accelerator」を使います。非常にコンパクトに収まります
PLCに関してはソフトウェアPLCの「CODESYS」を利用
外部機器としてのPLC(シーケンサ)に関してはソフトウェアPLCの「CODESYS」を使います。
誰でもフリーで使うことができ、簡単にラズベリーパイでテストできます。以前まとめた記事はこちらから
AI(機械学習)+画像認識はカメラ+Google Edge TPUを利用
「カメラ」とGoogle Edge TPU搭載のUSB接続デバイスである「Coral USB Accelerator」の使い方に関しては下記記事でまとめています。リンク先はこちらから
筆者はGoogle Edge TPUの初心者でしたが、Google(正式にはCoralというブランド)がデモ用のモデル・プログラムを用意してくれていましたので簡単に始めることができました。
画像認識のPythonのプログラミング
今回はリアルタイムで「テニスボール」を検出した場合は「PLC(シーケンサ)の入力SW_ON」、「定規」を検出した場合には「PLC(シーケンサ)のリセットSW_ON」させるようにしました。
プログラミングの内容としては以前紹介した下記記事と同類です。
Google edge TPUが何を画像認識したかの情報を引っ張ってきて、その情報を元にPythonのGPIO出力からシーケンサを制御します
Tensorflow liteのモデル・ラベルの中身を確認する
今回の検出目標である「テニスボール」・「定規」がTensorflow liteのラベルでどのように定義されているかを確認します。
モデル・ラベルに関してはCoralの公式ページにある「MobileNet V2 (ImageNet) 」を使います
ラベルに関してはテキスト「.txt」になっており簡単に確認できます。どのテキストエディッタでも構いませんのでファイルを開いて検索します。
1000個ある中から見つけました。テニスボール(tennis ball)が「853」で定規(ruler)が「770」でした。
今回は筆者の身近に在るものを適当に選びましたが、もし皆様で同様に実施する場合は好きな物を選びラベル内にあるかを確認してもらえれば構いません。
<<20190908追記>>
また任意の物(サンプルラベルに無いもの)を認識させてたい場合は下記記事参考にモデルを作ることができます
Edge TPUのPythonライブラリの中身を確認する
Google edge TPUのデモプログラム・ライブラリはPython(.py)で書かれています。
ラズベリーパイ(raspberry pi)ならばデフォルトでエディタも入っていますので直接中身を確認していきます
ちなみに筆者は少し前までPython初心者でしたが、下記記事で紹介しているUdemy で勉強することで今回のレベルのことは出来るようになりました。
初心者が高い参考書を買って一人で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」を使ったラダーのプログラミングに関しては以前に紹介しましたので、詳細は省略したいと思います。簡単な例(自己保持回路)を作った記事はこちらから
今回は「テニスボールを検知してPython側からGPIO出力」が来たら「入力_X001」をONするラダープログラムを作りました。同様に「定規を検知」したら「リセット_X003」をONします。
またテニスボール検出時の「入力_X001」がONしているときは「赤LED出力_Y001」がON、3回検出したら「緑LED出力_Y003」をONするようにしています。
定規検出時にはリセットされるので全LEDが消灯します。
ラズベリーパイのGPIOに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です
テスト結果
テスト結果です。
最初にテニスボールを手で動かしてカメラの前を通過すると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勉強するよりは「非常に分かりやすく」「費用が抑えられる」はずですのでご参考ください。リンク先はこちらから
<<20190512追記>>
次の記事ではGoogleが「CES」等の世界規模の展示会で実施していた「Edge TPU Dev Board」のデモを自前で作ってみました。(リンク先はこちらから)
コメント