[Archive] LabVIEW Café

キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 

【LabVIEW TIPS】学習済みモデルを用いた画像認識・物体検出 (AI/機械学習)

前回の記事ではLabVIEWからPython Keras APIを読み込み、手書き文字認識のモデルを訓練するプログラムをご案内しました。Part 2 となる本記事では、LabVIEWビジョンライブラリとPythonノードを使用し、学習済みモデルを流用した実用的な画像・物体認識プログラムをご紹介します。

 

0.png

スマホにはタッチディスプレイ、スピーカー、カメラ、WiFi、アンテナ、GPS、バッテリ、マイクロチップ等のコンポーネントをすべて繋げて、シームレスに連携して動いています。その合計として、100メータ以上の配線になると言われています。この多種多様なコンポーネント間の通信はプリント基板(PCB)上にはんだ付けされたワイヤ、レジスタ、コンデンサー等のパーツで実装されています。

 

スマホに限らず、パソコン、テレビ、エアコン、USBドライブなど、あらゆる電子機器に欠かせないプリント基板ですが、技術の進化によりプリント基板は毎年複雑化しています。特に、コンポーネントやその他部品の増加により、故障が発生しうる要素は増加しています。

 

例えば、一つのパーツでも欠陥があると、デバイスの正常動作が保証できず、デバイスの寿命も落ちてしまいます。そうすると、修理対応や無償交換のコストなどに影響していきます。

 

1.png

コンポーネンツの数の増加や複雑化している中、日本製が誇りとする「品質」を伸ばしていく必要があると私は考えています。

プリント基板の品質を担保するには、出荷前に電気部品のコンポーネントの正常動作をテストする必要があり、よく用いられる方法は、インサーキットテスタ(ICT)を用いて、基板に実装された様々なコンポーネントやパーツを電気的に検査を行う装置です。この手法では、レジスタやコンデンサー、はんだ接合に欠陥がないかをテストすることができます。ただし、ICTは総括的なテストではなく、不具合の85-90%しかカバーできないと言われています。

 

2.png

 

ICTに加え、マシンビジョンを用いた画像検査をテストシステムに追加することで、不良品の出荷をより抑えることができます。さらにPCBが複雑なほど、ICTを用いた評価に時間がかかります。そのためICT検査を実施する前に画像検査を行うことで、不要なICT試験を避けることができます。

 

このマシンビジョンを用いたテストでは、多くの場合パターンマッチング法を用いて行います。あらかじめ用意した良品の画像と、生産ラインで流れる生産物の画像と比較して、欠陥を検出する手法です。ただ、この手法は、照明、角度、位置、色、といった要因を各生産物の画像取得時再現しないと、誤った不具合判定(偽陽性)が下される可能性が高くなります。

 

3.png

1.機械学習を用いた画像検査システムにおける課題

画像検査システムに柔軟性を持たせたい場合は、機械学習を欠陥検出に用います。

このアプローチをとることで、画像の再現性等をさほど考慮せずに、

偽陽性の確率を抑え、真陽性を検知する確率を大幅に向上させることができます。

下記のイメージでは、本記事でご紹介する「Yolo V3」機械学習モデルアーキテクチャをベースとし、PCB物体検出モデルを実装した結果です。

 

4.png

ただ、一般的に機械学習のプロジェクトでは以下の問題が発生します。

 

  • 機械学習の深い知見がないため、どこから始めればいいのかわからない
  • 機械学習を用いた画像検査システムを外注すると、高コストかつ、やり取りに時間が掛かる
  • 既存のテストシステム等に画像検査機能を追加するのが困難である

 

2. NI LabVIEWを使用するメリット

  • データ収集装置(いわゆるセンシング)と解析側の連携や修正が容易にできます。LabVIEWはハードウェアとの接続が優れているプログラミング言語です。
  • Python等の他言語を呼び出して統合することで、既存のアルゴリズムと連携した完全なテストシステムを短時間で構築できます。
  • LabVIEWが提供する豊富な画像処理関数、解析関数による高速処理

 

3. 学習済みモデルを用いた物体検出

こちらの記事では、学習済みのモデルを用いた物体認識プログラムをご案内します。

学習済みのモデルを用いることで、ある物体の判別や認識に特化したアルゴリズムを流用し、そこを起点とし、用途に合わせた学習をさせることができます。(これをTransfer Learningと呼びます)

 

物体検出は画像を取り込み、画像の中から定められた物体の位置とカテゴリー(クラス)を検出することを指します。

 

たとえば以下の応用先が考えられます。

 

1)自動運転・ADAS: 周りの車や人間などの危険を及ぼす物体を検出して、それに応じて操作を行う

2)ロボティクス: 物体の位置によってロボットアーム制御をより的確に動かす

3)趣味:ノートPCを使って、機械学習について学ぶ

 

上記が代表例になりますが、皆さんはまた他のアイディアあるかもしれません。

 

5.png

※上記アニメ―ションはYolo V3を使用していますが、応用先は自動運転等です!

 

4.実際に動かしてみる

今回ご紹介するのは学習済みのモデルを用いて、カメラから取得した画像に対してラベル付けをする画像認識プログラムです。

こちらのサンプルは、LabVIEWの強みである:

 

1)データ収集(カメラで画像取得)

2)画像処理(イメージから配列等)

3)他のアプリケーションとの連動(Python)

 

の利点をフル活用したプログラムになります。

 

プログラム動かす前のチェックリスト

まず、Pythonの環境を構築して、LabVIEWから呼び出すには前回の記事をご確認のうえ、

こちらの記事をご参考にしてください。LabVIEWでPythonノードを用いる際は、

様々な注意点を理解していないとエラーが発生してしまう可能性が高いです。

 

1)まず、こちらのサンプルを使うには、LabVIEWに加え、以下のNIビジョン関連ソフトが必要になります。

・画像収録用の「Vision Acquisition Software」有償ライセンス

・画像処理用の「Vision Development Module」有償ライセンス

 

2)カメラ付きノートPCや、USBカメラ等のハードウェア

NI-MAXから「マイシステム」→「デバイスとインターフェース」にて、カメラのマークで「”cam#”」と自動的に認識されるはずです。

 

6.png

 

3)Pythonに追加に「 MatPlotlib」ライブラリのインストールが必要になります。

Windows コマンドラインから [>>pip install matplotlib]

 

7.png

 

フロントパネルでプログラムの動作確認

 

8.png

 

上記がフロントパネル(GUI)になります。

「Camera Session」にてカメラを選択し、

「Model File Path」で学習済みのKeras .h5モデルファイルを選択します。

(本サンプルで使用するには、コメント欄に記載したリンクから入手できる「model.h5」でございます)

 

「Load Model」ボタンを押すと、リアルタイムでカメラから収録した画像に対して、

オブジェクトの位置とラベルが自動的に表示されます。

 

ブロックダイアグラムのアルゴリズムを確認

Initialize.PNG

 

初期化コードの処理説明:

・Python Nodeのセッションを開く

・Python Nodeを用いて学習済みのモデルをロードする

・ビジョン関数を使用して、画像収録(IMAQdx)セッションを開く

 

mainLoop2.PNG

メインループ(Main関数)の処理説明:

  1. 画像を取得
  2. 画像の寸法をモデルに合わせる(今回は416x416に変換)
  3. イメージデータを2D配列に変換
  4. 2D配列のイメージデータを3D配列のイメージデータに変換 (X, Y, RGB) 
  5. 3Dイメージ配列をPython Nodeに入力
  6. 出力生データを(Left, Top, Right, Bottom, Label, Score)データに変換して、イメージにオーバレイ

Pythonコードの処理を確認

本記事で使用した学習済みモデルとPythonコードは下記のリンクを参考にさせていだきました。

 

YOLOv3 Keras - Image Object Detection | Kaggle

https://www.kaggle.com/fanconic/yolov3-keras-image-object-detection?select=model.h5

 

上記リンクの内容をほぼ応用し、実装しています。注意点としてPython Nodeの出力は複数のデータタイプ(例:数値と文字列)を含むことはできません。そのため、ラベル、位置、スコアを含むFloat型配列として出力して、LabVIEW側で受け取った生データ(Double型配列)を有意義なデータに変換する必要があります。

 

本記事のPython Nodeで出力される生の1D配列データの構成は以下の通りです。

 

11.png

N = 認識されたオブジェクトの数

 

LabVIEW側では、この生の1Dダブル型配列データを"Left, Top, Right, Bottom, Label, Score"のように各物体の有意義なデータに変換します。(ブロックダイアグラムの6に当たります)

 

※Pythonのソースコード「main_Cifar10.py」では、「boxes_to_array」関数で生データの準備をしています。

 

5.まとめ

LabVIEWの強みである

1)データ収集・制御(カメラで画像取得、アナログ信号、デジタル信号等)

2)データ処理・解析(信号処理、PID、FFT、フィルタ等)

3)他のアプリケーションとの連動(Python, C, C#等)

をフル活用し、より性能が高い検査システムの構築が可能になります。

 

AI・機械学習を用いたテストシステムの構築をご検討されている方々は、ぜひお声がけください。

弊社のプラットフォームを用いて、どのようにAIプロジェクトを進めるべきかなどご案内できればと思います。

 

この記事を書いた人

水野 智生

沖縄生まれ、カリフォルニア育ち、アメリカンな純日本人。

アメリカ滞在中は日本のメーカが日本人として誇りで、その素晴らしい日系企業に貢献したいと思い日本ナショナルインスツルメンツ(NI)に入社。

最先端のテクノロジーについて勉強するのが好きで、特にパソコンやスマホの課題、トレンド、進化を常にチェックしています!

ご相談・お問い合わせなどありましたら、こちらよりお気軽にお問い合わせください。

 

メッセージ1/2
5,065件の閲覧回数

添付が本記事でご紹介したサンプルになります。

「Keras_Advanced_Example.lvproj」を開いていただき、「KerasMain.vi」をご選択ください。

(LabVIEW 2019 64ビット以上のバージョンが必要になります)

 

学習済みの.h5ファイルは、下記のリンクから入手できます。

 

YOLOv3 Keras - Image Object Detection | Kaggle
https://www.kaggle.com/fanconic/yolov3-keras-image-object-detection?select=model.h5

 

 

0 件の賞賛
メッセージ2/2
5,054件の閲覧回数