この記事で扱っていること
画像分類プログラムを作る方法
を紹介しています。
注意:すべてのエラーを確認しているわけではないので、記事の内容を実装する際には自己責任でお願いします。また、エラー配線は適当な部分があるので適宜修正してください。
LabVIEWで画像を扱う方法の一つとして、Vision Development Moduleのアドオンを使用する方法がありますが、このアドオンに含まれる関数にDeep Learningの関数があります。
「LabVIEWでDeep Learningができるのか!」というと少しニュアンスが異なり、LabVIEWで「外部で用意したDeep Learningモデルを取り込んで」画像処理を行うことができる、という関数になっています。
そのため、LabVIEWとは別に、学習済みのモデル(を保存したprotocol bufferファイル)が必要になります。
今回の記事では、画像分類をさせるためのモデルを作成しこれをLabVIEWで呼び出して実際に様々な画像が何なのかを当てるような仕組みの例を紹介しています。
モデルとしてはInception V3を使用します。
どんな結果になるか
フロントパネルには、判定させる画像のファイルパス制御器と画像表示器、結果を表す表示器もおいています。
画像を選択すると、様々な結果が得られることがわかります。
結果を表しているのは「文字列表示器」と「スライダー表示器」のクラスタ、の配列になっています。
スタイリッシュな見た目にしたかったため画像表示器以外はNXGスタイルで統一しています(NXGスタイルの画像表示器がないのが残念)。
プログラムの構造
Deep Learningの関数は、外部で用意した学習モデルが保存されたファイル、プロトコルバッファファイルを取り込み、対象となる画像データを渡してモデルを走らせて結果を得ることができます。
この関数は、以下の場所にあります。
プログラムの基本的な構造はイベントストラクチャを使用したイベントベースのプログラムにしています。
Whileループの外で指定しているinception_v3.pbというのが、学習されたモデルについてのファイルです。
この作り方は記事の後半で紹介しています。(Tensorflow 1.Xを使用する必要があります)
イベントの中で使用するために、ReadLabelList.viで画像の分類をするためのラベルデータを用意しています。
テキストファイル、とは、ラベルごとに「このラベルはこの画像」という情報が入っているファイルのことで、以下のサイトから入手できるものになっています。
https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a
画像を分類させるためのイベントはImage File(ファイルパス制御器)の値変更イベントを採用しています。
この中で、画像を読みとり(IMAQ ReadFile2.vi)、画像サイズを調整し(IMAQ Resample.vi)、適切な形の配列に変換し(あとで紹介するサブviであるImageToSpecificArray.vi)たら、これをIMAQ DL Model Set Input.viに渡し、その後はIMAQ DL Model Run.viでモデルを走らせています。
結果はサブviであるPredictionResult.viを使用して適切な形で表示できるように変換しています。
なお、IMAQ DL Model Set Input.viで指定する入力ノード名は「input_1」、IMAQ DL Model Run.viで指定する出力ノード名は「predictions/Softmax」としていますが、これは後述します。
ImageToSpecificArray.viの中身については、Inception V3のモデルに渡す際の形式である{1:299:299:3}に合わせる必要があります。
最初の1はバッチサイズ、299は画像の縦横サイズ、3はRGBの3要素を表しているので、以下のような変換を施すことになります。
PredictionResult.viでは判定結果から画像分類の結果を表示できるように調整をしています。
ここで使用するArray inは、ReadLabelList.viの出力になっています。
ただし、そのままこのArray inの配列の中身を使用すると余計な文字(’や,など)が入るので、別のサブviによって余計な文字を除きます。
余計な文字を除くサブviが以下のStringFormat.viです。
これらを組み合わせれば、画像分類のプログラムが作れるようになります。
Inception V3のモデルの用意
さて、上記で紹介したようにLabVIEWで画像認識をさせるためには、モデルファイルを用意する必要があります。
今回の例ではInception V3という学習済みモデルを使用しており、これをプロトコルバッファファイルに保存する必要があります。
ではこれをどうやるかというと、Pythonでプロトコルバッファファイルの生成を行うことができます。
私がプロトコルバッファファイルを生成した際のコードが以下のものです。
上記のプログラムを実行して成功するとinception_v3.pbというファイルが生成されます。これをプログラムの中で指定します。
ちなみに、IMAQ DL Model Set Input.viで指定する入力ノード名は「input_1」、IMAQ DL Model Run.viで指定する出力ノード名は「predictions/Softmax」としていましたが、これらの名前は上のPythonプログラムを実行した場合の名前です。(なのでもし違うプログラムでpbファイルを生成した場合には同じ名前ではなくなる可能性があります)
機械学習というかTensorflowの扱いに慣れている方は例えばTensorboardを使用して入出力のノード名を確認することができると思いますが。
なお、使用しているPythonを始め他のモジュールの仕様によっては上記プログラムでうまくプロトコルバッファファイルを作成できないかもしれないのでご注意ください。
ちなみに私が試した際の主要なモジュールのバージョンは以下の通りです。
- Python : 3.7.16
- Tensorflow : 1.13.1
- Keras : 2.2.4
本記事では、画像分類プログラムを作る方法をInception V3のモデルを使用して説明しました。
日々進化するAIの技術、その一端であるDeep LearningをLabVIEWで取り入れる際の参考になればうれしいです。
ここまで読んでいただきありがとうございました。
コメント