20-04 FPGAにMNIST手書き文字認識を実装

●FPGA+CMOSカメラで作るリアルタイム検出システム

 EXCEL+
VBAで生成したHDLを道路標識/信号機認識のものと置き換えます。Quartusでコンパイル→プログラムし、NiosII SBTでマイコンソフトを書き込むと、「手書き数字のリアルタイム認識システム」となります。

 FPGAに実装したらこのように、黒板に白いチョークで数字を書き、カメラを向けてみましょう。推論結果が動画に緑色で上書きされます(この動画も参照)。

●スライドSW0〜5で各種モード設定

 前述の動画ではDE1-SoCのスライドスイッチにより、各種モードを設定しています(表20‐02参照)。通常の認識は写真20‐21のようにSW2をH(2値化モード)、SW5をH(背景非表示)にして行います。

  表20‐02 各種モードを設定するスライドスイッチ
名称 説明
SW0 エミュレーションモード HでMNISTテスト画像表示
SW1 動画スルーモード Hで動画映すだけ(推論無し)
SW2 2値化モード Hで画像が真白/真黒の2値
SW3&4 しきい値レベル 判定の閾値がLLで最低/HHで最高
SW5 背景表示モード Hで背景認識結果を非表示

図20‐21 SW2とSW5をH、あとはL (基板の内側でHになる)

●2値化モードで数字がはっきりする

 
MNISTデータセットは白黒画像なのに対して、カメラ(OV5642)はカラー(RGB)です(図20‐22)。
「2値化モード」では、カラー画像を白黒化し、さらに適当なしきい値を境に、各画素を真白/真黒のどちらかにします(図20‐23)。それにより数字がはっきりして、認識しやすくなります。

図20-22 このカメラからの動画は元々カラー


図20‐23 2値化モードにすると白黒になる(真っ白/真っ黒のどちらか

●背景の認識結果は表示させない

 「背景表示モード」にするとこのように、背景認識の結果も併せて表示されます。通常はこのように、「表示させないモード」で認識させます。

●MNIST画像相当で認識率99%だとこんな感じになる

 スイッチを図20‐21のように設定すると、エミュレーションモードOFF(L)、動画スルーモードOFF(L)、画像を2値化(H)、しきい値レベルは(LL)、背景は非表示(H)となります。

 図20‐24はその設定での動作例、黒板に白チョークで書いた数字(0〜9)が全て認識されています(
緑色で認識結果)。

図20-24 0から9まで認識。30×30画素の格子に入るとほぼ認識される

●動作確認用のエミュレーションモード

 「エミュレーションモード」ではMNISTテスト画像を表示・推論し、Pythonとの一致を見ます(詳しくは次のページで)。

次のページへ

目次へ戻る