「機械学習を使った画像認識」+「ラダー・PLCで動く工場の機器」を連携させてみました。Pythonとラズベリーパイでデバッグしましたので誰でも同様にテストすることができます。
Pythonは多くの分野で活躍しているプログラミング言語
Pythonは「Webアプリ」「データ分析」「機械学習」など将来性を持った分野で多く使われています。
特に最近ではAIの時代ということもあり、「データ分析」「機械学習」関連が特に盛んでそれに伴いPythonの人気も高まっているという背景もあります。
また人気のデバイスであるラズベリーパイ(raspberry pi)もPythonを最初から簡単に使える環境を用意しており、初心者でもすぐに始めることができます。
AI・IOTの時代で組み込み系でも「Python」の人気は高い
そして最近ではロボット・特定の機械などに対する「組み込み系」のプログラムでもAI・機械学習を使用するため「Python」を使うケースが増えています。
例えば工場内でも機械学習を使った画像認識で品質管理している事例も沢山でできています
また組み込み系の機器にはリアルタイム性を求められるものが多く最近だとエッジコンピューティングを用いた画像認識も流行っており、そこでもPythonが使われています
Pythonを色々弄ってエッジコンピューティングを試してみた記事を前回まとめてみましたので、ぜひご覧ください。(リンク先はこちらから)
工場を想定した事例をPythonで画像認識
今回は「工場の制御機器で使われているPLC(シーケンサ)」+「画像認識+測定」含めた事例を想定してPythonで制御してみます。
想定しているイメージとしては下記です。「PLC(シーケンサ)で工場内の機器を操作する」+「製品を画像認識で測定する」工程をまとめて管理したいと思います
但し、工場の制御機器におけるPLC(シーケンサ)に関しては「ラダー」という特殊なプログラミング言語で書かれていることが大半でPythonでは直接プログラムできません。
そのためPLC(シーケンサ)自身にはそのままのラダープログラムで動いてもらいます。ラダーの箇所(製造工程)が終わったらGPIO経由でPythonに通知して画像認識(測定工程)を行います
Pythonへの通知方法はGPIOでなくても何でも構いません(筆者が使いやすかっただけです)。
Python側はPLCから(GPIO経由)の通知を基に「カメラで撮影」+「機械学習による画像認識」を行っていきます
raspberry piで「PLC制御」+「機械学習による画像認識」
さすがに実際の工場ではテスト出来ないので、デバッグ環境としてラズベリーパイ(raspberry pi)で試していきます。
今回のデバッグ環境としては「ラズベリーパイ本体でPLC制御」を行い、「Google Edge TPU+カメラで機械学習による画像認識」を対応します
「カメラ」とGoogle Edge TPU搭載のUSB接続デバイスである「Coral USB Accelerator」もラズベリーパイに接続して使うので、デバッグ環境としては非常にコンパクトに収まります
PLCに関してはソフトウェアPLCの「CODESYS」を利用
工場の制御機器であるPLC(シーケンサ)のデバッグに関してはソフトウェアPLCの「CODESYS」を使います。
誰でもフリーで使うことができ、簡単にラズベリーパイでテストできます。以前まとめた記事はこちらから
機械学習+画像認識はカメラ+Google Edge TPUを利用
「カメラ」とGoogle Edge TPU搭載のUSB接続デバイスである「Coral USB Accelerator」の使い方に関しては前々回記事でまとめています。リンク先はこちらから
筆者はGoogle Edge TPUの初心者でしたが、Google(正式にはCoralというブランド)がデモ用のモデル・プログラムを用意してくれていましたので簡単に始めることができました。
今回のテスト・デバッグ内容
今回のテストとしては下記手順・内容です
①コインを運びSWを押す(PLC機器を操作して製品を作り、自動化ラインへ物を運ぶイメージ)
②3回作業を繰り返すとカメラが自動でコインを撮影する(規定の個数が製造されたら自動で検査工程に入るイメージ)
③写真の画像認識を行い3枚のコインを認識・測定を行う(検査工程で機械学習による画像認識で製品の測定を行うイメージ)
テスト内容が決まりましたので次章からPLC・Pythonのプログラミングを行っていきます
PLC(シーケンサ)のラダープログラミング
「CODESYS」を使ったラダーのプログラミングに関しては以前に紹介しましたので、詳細は省略したいと思います。簡単な例(自己保持回路)を作った記事はこちらから
今回は「入力SWを(規定回数)3回押す」と「Python側にGPIO通知する」ラダープログラムを作りました。「リセットSW」と「入力SWが押すと光るLED出力」も追加しています。
ラズベリーパイのGPIOにPLCの入出力をリンクさせます。やり方については下記記事でまとめましたのでよろしければご覧ください。(リンク先はこちらから)
今回筆者の場合は「入力SW_X001⇒GPIO4」「リセットSW_X003⇒GPIO22」「LED出力_Y001⇒GPIO17」「Python通知_Y003⇒GPIO27」に設定しました。
これでPLC側のラダープログラミングは終了です。SWを押すとLEDが点灯して、3回押すとPython側に通知できるようになりました。
Pythonのプログラミング
Python側のプログラミングに関しては前々回記事で使った検出プログラムである「object_detection.py」を参考にしていきます(リンク先はこちらから)
前々回は「手とPCマウス」の写真ですがしっかり画像認識して検出できましたので応用していきます
GPIOの入力ピンを条件にプログラムを走らせる
今回はGPIOの入力ピンを条件文で「カメラ撮影して画像認識するか」「待機するか」を判断していきます。
まず「PLC側の通知を受け取る入力ピン⇒GPIO16」「カメラ撮影時に光る緑LED出力ピン⇒GPIO20」「機械学習して画像認識時に光る黄LED出力ピン⇒GPIO21」と定義します
PLC側からの(GPIOの入力)通知が来たら、最初に「カメラ起動して撮影」そのあと「機械学習+画像認識」をするプログラムとしました
画像認識して描くラインを太くした
また画像認識した後に写真に認識した箇所を四角で囲むのですが、しっかり分かるように重ね書きして線を太くする対応をとっています。
drawで線を描いているのですがfor文で重ね書きして検出するラインを太くしています
これにてPython側のプログラム作成も終了です
ちなみに筆者は少し前までPython未経験でした
ちなみに筆者は少し前までPython初心者でしたが、下記記事で紹介しているUdemy で勉強することで今回のレベルのことは出来るようになりました。
初心者が高い参考書を買って一人でPython勉強するよりは「非常に分かりやすく」「費用が抑えられる」はずですのでご参考ください。リンク先はこちらから
今回の回路図・配線
今回の回路図としてはSWとLED、またラズベリーパイ内でのGPIO接続しただけの回路図ですが一応載せておきます。
左側がPLC、右側がPythonというイメージでざっくり分けています。
実際のデバッグ用の配線は少し混雑している形ですが、ブレッドボードを2つ使いSW部とLED部を分けて対応しています。
ジャンパーと抵抗・LEDに関しては市販で売られている電子工作セットやジャンパーワイヤーを使えば十分でした。
PLCと連携してPythonと機械学習ができたか確認してみる
それではテストを開始していきます。
テスト開始方法
今回はラズベリーパイ上でソフトウェアPLCを走らせて…
Pythonのプログラムを起動させていきます。コマンド方法は前々回と大体同じです。Pythonのプログラムによるカメラ写真の保存名「test.jpg」を引数に使っていました。
テスト結果
テスト手順①の結果です。「コインを運びSWを押す」作業をすると無事PLCが動作しカウントアップしました。OKです。
テスト手順②では3回PLC操作した後、Python側に通知され自動的にカメラ撮影が行われました。OKです。
テスト手順③では機械学習による画像認識が行われ3枚のコインが画像認識されました。OKです
無事手順③までの動作が確認できました。
カメラで撮った写真と画像認識後の写真
ラズベリーパイのカメラで撮影した写真が下記となります。(ピントが完全にあっていないのかぼけています)
そしてGoogle Edge TPUで機械学習+画像認識した写真です。3枚のコインは認識できているのですが、余分に何も無い箇所でも一つ認識しています。
出力されたテスト結果としては下記スコアとなっていました。4つ認識されていました。
score = 0.160156
box = [368.4375858306885, 212.07280723111967, 875.1773071289062, 628.8446507283619]
-----------------------------------------
score = 0.121094
box = [670.8559226989746, 731.731755392892, 1077.843360900879, 1015.714121716363]
-----------------------------------------
score = 0.0898438
box = [7.6526641845703125, 0.7636249065399169, 1900.3882598876953, 1080.0]
-----------------------------------------
score = 0.0664062
box = [995.4238128662109, 224.29559060505457, 1581.9051361083984, 706.6516258886882]
実際の動画
実際の動画をYoutubeに上げました。最後の画像認識した写真は見づらいですが一連の流れは分かると思います。
~3秒 プログラム実行
~20秒 手順①…「コインを運びSWを押す」を3回繰り返し
~28秒 手順②…「Python側に通知され自動的にカメラ撮影」
(※わざとディレイを7秒ほど入れているので遅いです)
~33秒 手順③…「機械学習による画像認識が行われ3枚のコインが画像認識」
~44秒 画像認識後の写真を開いて見える位置まで持ってきている
まとめ・感想
ラズベリーパイ(raspberry pi)のデバッグ環境ですがPLC(シーケンサ)を使う工場を想定した画像認識ができました。
ソフトウェア専門でなくてもPythonならば簡単にプログラムを組めて色々な機器と連携させることができます。色々なケースで応用できるのではと考えています。
筆者も元々は初心者でしたが、下記記事の勉強方法である程度Pythonを触れるようになりました。
高い参考書を買って一人でPython勉強するよりは「非常に分かりやすく」「費用が抑えられる」はずですのでかなりおススメです。リンク先はこちらから
<<20190512追記>>
次の記事ではリアルタイムで動く「動体」を画像認識し、PLC(シーケンサ)を制御させるようにPythonのプログラミングさせてみました。(リンク先はこちらから)
コメント