※こちらはPythonデータ分析勉強会#06の発表資料です。
本稿は、ラズパイ+物体検出を使って「将棋駒」を検出するプロジェクトの続きです。
もはや将棋駒ではなく、違うものを検出させていますが、気にせず進めます。
一応、過去の記事のリンクも貼っておきます。
今回は、物体検出を使って組立検査機を作ってみました。
#まずは結果から
部品の組み立て工程では、ボルトの締め忘れや組付け間違いがしばしば発生します。
今回は、物体検出を使って組立工程をチェックする検査機を作りました。
#組立検査の難しさ
組立検査は難しいものがあり、現状では決定版はないものと思われます。
その難しさの要因は、以下のようなものが挙げられます。
- 完成後の外観検査ではチェックできない。(外から見えない部分で組立間違いがあるかもしれない)
- 組立間違いがあっても、動作チェックで不具合が出ない。
特に2番目の方は、根が深く、短期間使っている分には問題ないが、長期間
使っているといきなり壊れるといったケースもあるので、重大クレームに
なってしまうこともあります。
IOTの普及によりカウンタ付きドライバーなどが開発され、記録できる工程も
出てきましたが、接着剤の塗布など記録できない工程もあります。
#物体検出×組立工程
今回の取り組みは、物体検出を使って組立中の手を認識して、正常な作業時間と
位置になっているかどうかをチェックするものです。
#使い方
まずは、使ってみたいという人は以下の方法で使ってみてください。
##環境
- Raspberry Pi 3
- NCS1(Movidius)かNCS2を装着
- OpenVINOがインストール済(インストール手順は前回の記事を参照。)
- USBカメラ
##ダウンロード
こちらのリポジトリから main.py
をダウンロード
@PINTO さんのリポジトリから lrmodel
をダウンロード
二つのフォルダを同一のフォルダに入れ、以下のコマンドで実行します。
python3 main.py -wd 640 -ht 480
##手順
後は、以下の手順で動かしてください。
- 画面が立ち上がったら、[m]ボタンを押して人の手の動きを認識させてください。
- 認識が終わったら、[e]ボタンを押してください。
- お手本ヒートマップ(「Reference」)が出てきますが、ここでは無視してください。
次に検査工程に入ります。
- [s]ボタンを押して先ほどの手の動きを再現してください。
- 認識が終わったら、[e]ボタンを押してください。
- 検査ヒートマップ(「Result」)が出てきます。
- 正常な手の動きをしたのであれば、ほとんど赤い部分はないはずです。
- 異常な手の動きをしたのであれば、その部分が赤くなっているはずです。
- 再度、[s]ボタンで検査、[e]ボタンで検査ヒートマップの出力ができます。
- [q]ボタンで終了します。
#アルゴリズム
##謝辞
@PINTOさんがこちらのリポジトリで MultiStickSSDwithUSBCamera_OpenVINO_NCS2.py
を
作ってくれました。かなりシンプルなコードになっています。感謝!!
私は、RealSenseを持っていないため、上記のコードをベースにしました。
##変更点
オリジナルのコードに対し変更点は##を付けています。
気になる方は main.py
を追って見てください。
主な変更点は以下のとおりです。
- Personを検知したときだけ、赤い表示が出る。
- 文字を黒に変更(組み立て工程は白い背景が多いため)
- 存在確率の閾値を変更(60% → 30%)
- 組立ヒートマップのアルゴリズムを組み込む
- フォルダ内にヒートマップを保存する
##ヒートマップの仕組み
ヒートマップの生成は基本的にPersonと認識したときだけ、演算しています。
###お手本ヒートマップ
まずは、お手本ヒートマップを作ります。仕組みは簡単です。
下の図は5×5ピクセルの画像をイメージしたものです。
t時間で右下にPerson(手)と認識したとします。このとき、そこの部分を1にしておきます。
そして、t+1時間でも右下にPerson(手)と認識したとして、1にしておきます。
t+2時間では左下でPerson(手)と認識したとします。
最後にそれらを足し合わせると下図のようになります。
最後に0~1になるように標準化します。
上の図全体を2で割ります。すると、下図のようなお手本ヒートマップの出来上がります。
###検査ヒートマップ
検査工程では、お手本ヒートマップと同じように、マップを作り、
お手本ヒートマップの差をとって絶対値化しています。
あとは、カメラの画像と合成して出力しています。
#結果
以下に動作の様子を示します。
本来であればラズパイ + NCS2は20FPS(NCS1は8FPS)で高速に動くのですが、
動画保存用にOpenCVを動かしているため、少し遅くなっています。
###お手本の動作
最初にお手本の動作です。
今回は組立工程を簡単にするため、付箋を貼る動作を題材にしています。
1つの付箋を3秒くらいで貼っています。
お手本ヒートマップは以下のようになっています。
比較的、右手を検出した時間が長くなっているようです。
###正常な動作
これ以降、動画と検査ヒートマップをセットで示します。
まずは、正常な動作です。
ご覧のとおり、ほとんど赤い部分はなく、正常な動作が可視化できています。
###右しかやっていない場合(異常)
右しか付箋を貼っていない場合です。
ご覧のように左側にオレンジ色の異常部分が出てきました。
###左しかやっていない場合(異常)
左しか付箋を貼っていない場合です。
ご覧のように右側に赤色の異常部分が出てきました。
###長時間の動作(正常)
ベテランの人は早く作業できますが、慣れていない人は
長時間の作業時間になってしまうこともあります。
前述したとおり、検査工程のマップではお手本マップと同様に標準化しているため、
全体の作業時間が長くなっても同じ土俵で比較できます。
お手本の動作に対し、2倍時間がかかっていますが、大体正常な検査ヒートマップになっています。
検出枠に少しズレがあるのが気になります。
検出枠のズレへの対処方法は後述します。
###両手でやった場合(正常)
人によって組立手順は違います。
右からやる人もいれば、左からやる人もいるかもしれません。
もしくは、両手でやる人もいるかもしれません。
ときどき、左右の手が一つの検出枠になってしまうこともありますが、
検査ヒートマップでは大体正常になっています。
#ガチでやる人のために
もっと本気でやる人のために、メモを残しておきます。
###手の検出精度を上げるには
MobileNET + SSDの「Person」は本来「手」ではなく、「人体」全体を学習させています。
従って、手の検出精度は悪いです。顔が入っていれば、ほぼ100%検出できるのですが・・・
ただ、色の濃い長袖(作業着など)を着ると手の検出精度が上がります。
白い生地のものはダメみたいです。
###位置ズレに弱い
現状は、記憶させたヒートマップと差をとっているだけなので、位置ずれに対し
脆弱です。ただ、ヒートマップを画像として認識させ、ディープラーニングで
異常判定させると非常に安定し、柔軟性がある検査ヒートマップが生成されると思います。
###複雑な工程に対応できない
工具を使った複雑な工程はうまく判定できない可能性があります。ここは、手ではなく
工具を認識させた方が安定した結果が得られると思われます。
###複数工程に対応できない
例えば、ある部品のA面でボルトを締め、裏返してB面で接着剤を塗るといった
複数工程がある場合、現状では対応できません。実は、ここでもアイディアがあり、
複数工程を自動検出できると考えています。
ただ、論文にできるかもしれないので、まだお話しはできません。
もし企業の方で一緒に開発したいという方がいらっしゃれば、共同研究など対応
できるかもしれません。その場合は、メールしていただけると幸いです。
メールアドレスはプロフィールに書いてあります。
#まとめ
- 物体検出を使って組立工程の検査機を作りました。
- 組立工程だけではなく、他の作業でも応用が利くかもしれません。
- 工具など新たなものを学習させる場合、時間と労力がかかるので、ある程度覚悟して望まないと闇の世界に落ちます!お気をつけください。