FPGAに実装したCNNを使用して白線間
を走行するミニ・ロボットカーの製作
筑波大学システム情報系技術室
小野 雅晃
1
本研究は,科学研究費補助金「奨励研究」(課題番号17H00372)の助成を受けて
行った
自己紹介
2
 FPGAの部屋
 2005年5月から
 4,141記事(2018
年4月21日現在)
 筑波大学、技術
職員
 今年60歳、還暦
 定年退職
CNNで白線間を認識して走る
ミニ・ロボットカー
 平成28年度
 カメラを使用した画像認識により白線間を走行するロ
ボットカーの製作
 ガボール・フィルタにより、白線を認識して走るミニ・ロボッ
トカーを発表
 平成29年度
 ガボール・フィルタによる白線認識を、畳み込み
ニューラルネットワーク(CNN)に変更した
 カメラ画像をCNNで解析し白線間を走行
 CNNはFPGAに実装した
3
CNNの出力数と層構成
 CNNを使用して、カメラ画像により白線の状況を
認識して、直進、左旋回、右旋回のいずれかを出
力
 CNNの層構成
 畳み込み層-ReLU-マックス・プーリングー全結合
層-ReLU-全結合層
 「ゼロから作るDeep Leanning」の第7章の層構成と同
じ
4
CNNの学習と推論のベース
5
 学習は「ゼロから作る
Deep Learning」のPython
コードをそのまま利用
 推論の「ゼロから作る
Deep Learning」のPython
コードを適当なビット幅に
量子化するように変更し
て精度を確認
 複数のビット幅で精度を
確認
オライリー・ジャパン 「ゼロから作る
Deep Learning」の表紙を引用
量子化方法(全結合層の場合)
6
 学習はそのまま浮動小数点演算で学習
 推論のみ 重みとバイアス、層の出力を量子化
 量子化方法(forward_int())
 小数部のビット分を掛け算(float型)
 四捨五入してint型に変換し、小数点以下切り捨て
 量子化ビット長で飽和演算
 float型に変換
 掛け算した分を割り算で戻す(float)
 量子化した値で内積を取る(float演算)
 再び量子化
CNNの学習用データの例
7
 白線走行の学習データ例
左旋回 直進 右旋回
• 800x600ピクセルのミニ・ロボットカーの車載カメラ
画像
白線データの用意
8
 77枚の学習画像と74枚のテスト画像を別に用意
(800x600ピクセル)
 画像を加工して増やす(imagemagic)
 コントラストを変更
 ぼかす
 ノイズを加える(ガウス、インパルス、ラプラシアン)
 学習画像-1,386枚、テスト画像ー1,332枚
 サイズ変更(60X45ピクセル) 0.075倍
 白黒変換
 白線の部分を切り取る(56X10ピクセル)
 1枚の画像につき25枚
 学習画像ー34,650枚、テスト画像ー33,300枚
 精度は93%程度
Vivado HLSを使用してCからHDLへ
9
 CNNの推論をCで書き直した
 Vivado HLS(Xilinx社のFPGA用高位合成ツール)を使
用してCコードをHDLに変換してIP化した
 重みやバイアスはCのヘッダとして実装
 直進、左旋回、右旋回という情報を出力するCNNのIP
(Intellectual Property)コアを作成
 推論時間約1.94ms、515fps
 チューニング後の推論時間約96.3us、10,400fps
 約20倍高速になった(オーバースペック)
 ただしチューニング後のCNN IPは実機では未検証
ミニ・ロボットカー
10
 Digilent社のZYBOボードを使用した全長30cm程度
のロボットカー(ZYBOtベース)
 ハード(FPGA内の回路)、ソフト共に独自開発
 ZYBOボード
 Xilinx社のARMプロセッサ(Cortex-A9デュアル)+
FPGAチップ
 Zynq-7010
 2つのCortex-A9でUbuntu14.04が動作
 ソフトウェア実装後にハードウェアにオフロードが簡
単に行える
ミニ・ロボットカーの写真
11
ミニ・ロボットカーのブロック図
12
FPGAとARMプロセッサの動作
13
FPGA
動画デモ
14
動画デモは「カーブ、直線用白線間走行用畳み込みニューラ
ルネットワーク18(ミニ・ロボットカーでの走行テスト)」参照
http://marsee101.blog19.fc2.com/blog-entry-4021.html
まとめ
15
 白線間走行用畳み込みニューラルネットワークを
FPGAに実装
 ミニ・ロボットカーに白線間走行用畳み込み
ニューラルネットワークを搭載
 ミニ・ロボットカーで白線間を走行することができ
た

Fpga robot car