PiCameraによるAI数字認識
Raspberry Pi、Pi Camera、OpenCV、TensorFlowで数字を認識します。
ストーリー
このプロジェクトでは、数字を転写するための深い畳み込みニューラルネットワークをトレーニングします。次に、学習段階のデータを使用して、PiCameraが数字を読み取って認識できるようにします。 AIパイプラインは、画像操作にScikitとOpenCV 3.3を使用し、ディープラーニング部分のバックエンドとしてTensorflowを使用するKerasを使用して実装されます。
これを簡単に保つために、機能のローカリゼーション段階は実行されません。表示される唯一の機能となるように、カメラレンズの前に画像を押し込む必要があります。
MNISTデータセットが使用されます。これは、28×28ピクセルのモノクロ画像としてフォーマットされた手書き数字0〜9の60,000のトレーニング例と10,000のテスト例で構成されています。基本的に、カメラから取得したすべての画像を次のような画像に変換します。
2つのことを行います。まず、数字を認識するためのネットワークをトレーニングします。次に、RaspberryPiカメラから取得したライブカメラフィードの数字を認識するためにトレーニングしたネットワークの重みを使用しました。
これらすべてを開始する前に、必要なものをすべてインストールしましょう。 Python仮想環境を使用してプログラムをセットアップしました。したがって、以下にリストされているすべてのプログラムがあると仮定すると、発行できます:
source〜 / .profile workon cvpython PiCameraApp.py --picamera 1
では、詳細を見ていきましょう。まず、たくさんのプログラムをインストールしましょう。
Tensorflowをインストールする
pip install tensorflow
Kerasをインストールする
pip install keras
Open-CV3.3をインストールする
すべての最適化が必要な場合は、OpenCVのインストールが少し複雑になります。これは、pipパッケージマネージャーからのものにはすべての最適化がないため、最初からコンパイルする必要があることを意味します。
https://www.pyimagesearch.com/2017/09/04/raspbian-stretch-install-opencv-3-python-on-your-raspberry-pi/
pip install "picamera [array]"
RPIにすべてのソフトウェアスタックをインストールしたら、トレーニングを行う必要があります。氷河の遅いパフォーマンスに慣れているヒーローであり、RPIでそれを行うことにした場合を除いて、ネットワークはGPUを備えたラップトップでトレーニングする必要があります。
ネットワークのトレーニング
ネットワークをトレーニングするには、次を発行してラップトップでpythonファイルを実行します:
python Train_MNIST.py
これは、ラップトップにCuda(gpuバージョンを使用している場合)、Tensorflow、Keras、matplotlibがインストールされていることを前提としています。
このファイルのプログラムは、Kerasを使用してディープニューラルネットワークモデルを定義し、コンパイルし、トレーニングと検証のフェーズが完了した後、ネットワークの重みを節約します。
最後に、プログラムはネットワークの重みを.h5ファイルとして保存します。これは、ライブディジット画像を認識するためにRPIで実行されている認識スクリプトにロードするネットワークの重みを含むファイルです。
NVIDIA GPUを使用している場合、カードの計算能力に応じて、トレーニングには数分かかります。ただし、GPUを活用するには、GPUバージョンのTensorflowとNVIDIA WebサイトのCUDA実行可能ファイルをインストールする必要があります。そうしないと、CPUのみを使用している場合は少し時間がかかる可能性があります。
数字のライブ画像の認識
ネットワークは、他の数値に対して非常に低い確率を出力する場合があります。したがって、0.0001%の確率で7になる可能性があります。
貿易のツール。プログラムの説明
プログラムは、「t」キーを押すとカメラからスナップショットを取得し、画像をDNNに転送する前にいくつかの変換手順を適用します。
最初に覚えておく必要があるのは、カラー画像が浮動小数点数の大きな配列として取得されることです。最初に、画像がRGB形式からグレースケール画像に変換されるため、効果的に2つのチャネルを破棄します。
次のステップは、画像の浮動小数点形式を0〜255の範囲の8ビット数に変換することです。
次に、OpenCVを使用してしきい値処理を行います。大津法は、数字の特徴がはっきりとわかるように、画像を自動的にしきい値設定するために使用されます。次のステップは、画像のサイズを28×28ピクセルの形式に変更することです。これは、MNISTDNNで受け入れられているのと同じ形式です。
画像が再スケーリングされた後、次のステップは色を反転することです。MNISTは、数字が白い背景の黒い線ではなく、黒い背景になると想定しているためです。
後処理後、画像はDNNに送信され、観測された数字が予測されます。
出力配列は、観測された画像がその数である確率を表します。したがって、位置2の1は、1であるため、100%の確実性を示します。位置1は0用に予約されていることに注意してください。
アルゴリズムの手順
1.画像を読む
最初のステップは、明らかにカメラの前に画像を配置することです。 CNN(畳み込みニューラルネットワーク)は特定のサイズの画像を想定しているため、これは後でスケーリングされます。
2.グレースケールに変換
取得した画像は、scipy関数呼び出しを使用してグレースケールに変換されます。偶然にも、画像操作にはopencvしか使用できませんが、すべての関数名を覚えておく必要があります。また、別のポイントとして、特定の機能に関しては、scipyとopen-cvの間にいくつかの非常に微妙な違いがあります。
3.画像範囲を拡大縮小します
4.しきい値処理
素敵な白黒画像を取得するには、大津法を使用してしきい値処理を行います。手動でしきい値処理を行うと、値を1つずつ入力するため、これは魔法のソースステップです。
5.画像のサイズを変更する
6.画像を反転
MNIST DNNは、黒の背景に白で描画された28×28ピクセルの画像を受け入れます。したがって、画像を反転する必要があります。
7.訓練されたニューラルネットワークにフィードする
8.回答を印刷する
最後に、0から9までのすべての数字を示す10個のクラスを持つ出力配列になります。配列の位置は、ネットワークによって推論が行われる確率を表します。これを人間の話し方に変換することは、最も高い確率で位置を選択することを意味します。
メインのセットアップは医療機器のように見えます。
フィン!
出典: PiCameraによるAI数字認識
製造プロセス