Contenu connexe Similaire à ZytleBot: ROSベースの自律移動ロボットへのFPGAの統合に向けて (20) Plus de Hideki Takase (20) ZytleBot: ROSベースの自律移動ロボットへのFPGAの統合に向けて2. Agenda
• プロローグ [⾼瀬]
• ZytleBotに⽤いた⾃律移動アルゴリズム [⽥村]
ZytleBotの紹介
HW/SWアルゴリズムの検討と選択
• ⾚信号認識のHWアクセラレーション [新⽥]
PS/PL連携
実装について
• エピローグ [⾼瀬]
2
6. Plumbing
• Publish / Subscribe messaging infrastructure
ROSノード︓ロボットシステムを構成する機能単位
üノードの登録・変更・削除が容易に実現できる
トピックを介した⾮同期型の通信⽅式
ü同期通信のserviceも提供されている
6
:
:
:
:
8. Capabilities
• ROSパッケージ
ロボットの有⽤な機能がまとめられたライブラリの集合
ümobility, manipulation, perception, etc.,,,
2,000以上のパッケージが公開されている
ühttps://index.ros.org/packages/
• パッケージ活⽤の利点
既存資産として活⽤できる
コンポーネント指向開発を実現できる
• 公式サポートの⾔語(ROS 1)︓C++, Python, LISP
他にも,C#, Java, Lua, Go, ruby, ,,,
8
9. Ecosystem
• オンラインのコミュニティ
ROS Wiki: 各種⽂書の公開,パッケージ配布
ROS Answers: Q&Aページ
ROS Discourse: リリースやイベントのアナウンス
• オフラインのコミュニティ
ROSCon: 世界規模の開発者会議(最近はlocal Confも)
SIG meetups, tutorial workshop, local events, etc.,,,
9
12. FPGA Design Competition
• FPTおよびHEARTで
開催されている⾃律移動
ロボットの開発コンテスト
• 道路を模したコースを⾛⾏
• センサ類はCMOSカメラのみ
• FPGAが搭載されたSoCで
全てのプログラム動作を
完結させる必要がある
• ⾞体の⼤きさやシステムの
構成は⾃由︕
12
http://fpt19.tju.edu.cn/Contest/FPT201
9_FPGA_Design_Competition.htm
15. ZytleBot
15
• Zynq + TurtleBot
Zynq Ultrascale+ : Heterogeneous MPSoC
TurtleBot3 : ROS standard platform robot kit
17. システム構成 & 分担
• ⽥村(SW)
⾃動運転システム・システム
インテグレーション
カメラ固定⽤3Dモデル作成
• 新⽥(HW)
ロボット機体組み⽴て・調整
⾚信号検出
HWアクセラレーション
17
18. 開発の流れ
18
FPT 2018
HW
SW
2018/7~2018/9 ~2018/12 ~2019/6
シミュレータ作成
ライントレース
によるコース周回
ZyboにROSを
インストール
路⾯画像からの⾃律移動
アルゴリズム
第8回 相磯秀夫杯
ROS 2対応
FPGA利⽤のための
ROSノード作成
Ultra96対応
HEART 2019
PCamからの
画像取得・画像前処理
Petalinuxビルド
TurtleBot3認識 HOG特徴量計算
HW実装 HOG+SVM
HW実装
HOG+RF ⾚信号検出
SW実装
31. 開発内容
• 開発内容
FPGAで動作する回路の設計
ボード⽤Linux Kernel, rootfsの構築
デバイスドライバ・デバイスツリーによるPS/PL連携
ロボット機体の組み⽴て・電源・パーツの選定
• 相磯杯・FPT 2018
Petalinux on ZYBO Z7-20
ZYBOのUSB Hostの電流不⾜問題
TurtleBot3 OpenCRが認識されない問題
• HEART 2019
Ubuntu on Ultra96
31
32. ボード上で動作するLinuxの構築
• Linux Kernel, rootfsの構築
Petalinux
üお⼿軽
üカスタマイズするとなると不⾃由
⾃前で構築
üXilinx-linuxのリポジトリをクローン
• ZYBOのUSB Hostの電流不⾜
2つ以上デバイスを接続すると落ちる
セルフパワーハブを使⽤
• OpenCRが認識されない
Linux Kernelのコンフィグを修正
32
CONFIG_USB_ACM=y
CONFIG_USB_SERIAL=y
CONFIG_USB_SERIAL_GENERIC=y
34. PS/PL連携
• 例︓VivadoHLSで合成した回路をLinuxから操作
• デバイスツリーを記述
Petalinuxを使⽤する場合:system-user.dtsiに記述
Device Tree Overlayを使⽤する⽅法もアリ
/sys/class/uio以下にデバイスとして登録される
34
myip {
compatible = "generic-uio";
reg = <0x0 0x80010000 0x0 0x10000>;
interrupt-parent = <&gic>;
interrupts = <0 89 4>;
};
参考︓
https://qiita.com/tetsu_koba/items/5cb1f3b61d0b2b6f4e2b
https://qiita.com/ikwzm/items/5099d36b1bfd8009dce4
38. 物体認識のアルゴリズム
38
• 分類器を繰り返し⽤いる⽅法
分類器・・RF, SVM
CNN
• スライディングウインドウ法
• 全ての位置・全てのスケールについて試⾏
• 選択的検索法
• R-CNN, Fast-RCNN, Faster-RCNN
領域候補を挙げてそれらをCNNに⼊⼒
• 回帰的に物体検出を⾏う⽅法
• YOLO, SSD
end-to-end学習が可能
領域候補 分類器
分類器
特徴量選定要
特徴量選定不要
参考︓ https://qiita.com/mshinoda88/items/9770ee671ea27f2c81a9
41. 現実的な問題
41
• 理想︓DNN on FPGAに挑戦
• 現実︓コンテストまで1ヶ⽉
p ZyboZ7からUltra96への移⾏
» カーネルビルド
» ⾞体の電源回り
p 他にもやることがいっぱい・・
HOG+SVM on FPGAで妥協
以前HOG+RF on FPGAが遅かったのでそれを改善したいのもあった
42. HOG特徴量
42
HOG: Histogram Of Gradients,輝度勾配
0. ⼊⼒画像︓グレースケール画像
1. 各画素について輝度勾配・⼤きさを求める
2. 各セル(8*8)毎にヒストグラムを作成
ビン︓勾配の⾓度 データ︓勾配の⼤きさ
𝐺" = 𝐼 𝑦 + 1, 𝑥 − 𝐼 𝑦 − 1, 𝑥
𝐺+ = 𝐼 𝑦, 𝑥 + 1 − 𝐼 𝑦, 𝑥 − 1
𝑚𝑎𝑔"+ = 𝐺+
/ + 𝐺"
/ , 𝜃"+ = arctan(
78
79
)
180 0
20
80
60
40
100
120
140
160
1
2
34567
8
9
8pix cell
1 2 3 4 5 6 7 8 9
Histogramℎ",+,< ≔ セル 𝑦, 𝑥のビン 𝑖の値
(0,1)
(2,1)
(1,0) (1,2)
44. HOG+SVMで⾚信号検出
44
• 線形SVM分類器 * Sliding Window法
w: 学習した重み θ︓バイアス
x : 抽出した特徴量
• 特徴量︓RGB,HSV画素値 + HOG特徴量
HOG: Histogram Of Gradients,輝度勾配
𝑡 = K
<LM
N
𝑤< 𝑥< + 𝜃
𝑝𝑟𝑜𝑏𝑎 = 𝑠𝑖𝑔𝑚𝑜𝑖𝑑(𝑡)
46. FPGA実装
46
• Vivado HLSで実装
• ⼊⼒︓320*240pix RGB画像
• 出⼒︓1287個のウインドウのSVM推論結果
• 1度のHW呼び出しで1フレーム全体を処理
• SVM推論器はFPGA実装向き
• ∑𝑤𝑥 + 𝜃
• ⼀部の特徴量が算出された時点で
部分和の計算を開始できる
• 以下の論⽂を参照
BGR->GRAY
BGR->Resize
magnitude,
theta
create_histo
gram
normalization
HOG-SVM
BGR-SVM
Merge
Luo, Jian & Lin, Chang. (2018). Pure FPGA
Implementation of an HOG Based Real-Time
Pedestrian Detection System. Sensors. 18. 1174.
10.3390/s18041174.
47. FPGA実装
47
• Vivado HLSで実装
• ⼊⼒︓320*240pix RGB画像
• 出⼒︓1287個のウインドウのSVM推論結果
• 1度のHW呼び出しで1フレーム全体を処理
• SVM推論器はFPGA実装向き
• ∑𝑤𝑥 + 𝜃
• ⼀部の特徴量が算出された時点で
部分和の計算を開始できる
• #pragmaによるデータフロー最適化
BGR->GRAY
BGR->Resize
magnitude,
theta
create_histo
gram
normalization
HOG-SVM
BGR-SVM
Merge
#pragma HLS DATAFLOW
#pragma HLS STREAM variable = bgr_hsv_resultstream depth = 100 dim = 1
grayscale_and_resizing(instream, gray_pix, upper_scaled_rgb, bottom_scaled_rgb);
compute_mag_and_bin(gray_pix, magstream, binstream);
cell_histogram_generate(magstream, binstream, bottom, upper);
block_histogram_normalization(bottom, upper, ul_out, ur_out, bl_out, br_out);
hog_svm_classification(ul_out, ur_out, bl_out, br_out, hog_resultstream, ..);
bgr_hsv_svm_classification(upper_scaled_rgb, bottom_scaled_rgb, bgr_hsv_resultstream,..)
48. FPGA実装
48
• Vivado HLSで実装
• ⼊⼒︓320*240pix RGB画像
• 出⼒︓1287個のウインドウのSVM推論結果
• 1度のHW呼び出しで1フレーム全体を処理
• SVM推論器はFPGA実装向き
• ∑𝑤𝑥 + 𝜃
• ⼀部の特徴量が算出された時点で
部分和の計算を開始できる
• #pragmaによるデータフロー最適化
BGR->GRAY
BGR->Resize
magnitude,
theta
create_histo
gram
normalization
HOG-SVM
BGR-SVM
Merge
#pragma HLS DATAFLOW
#pragma HLS STREAM variable = bgr_hsv_resultstream depth = 100 dim = 1
grayscale_and_resizing(instream, gray_pix, upper_scaled_rgb, bottom_scaled_rgb);
compute_mag_and_bin(gray_pix, magstream, binstream);
cell_histogram_generate(magstream, binstream, bottom, upper);
block_histogram_normalization(bottom, upper, ul_out, ur_out, bl_out, br_out);
hog_svm_classification(ul_out, ur_out, bl_out, br_out, hog_resultstream, ..);
bgr_hsv_svm_classification(upper_scaled_rgb, bottom_scaled_rgb, bgr_hsv_resultstream,..)
#pragma HLS DATAFLOWは関数のバイパスは
サポート外(動作未定義)
DataFlowViewerで確認してFIFOが推定さ
れていなかったところだけ明⽰
51. FPGA実装
51
Partial Histogram Buffer
Partial Histogram Buffer
Partial Histogram Buffer
Histogram Buffer
Histogram Buffer
ヒストグラム
完成︖
+
bottom cell
upper cell
…
Yes
𝑷 𝟕,𝟎
𝑷 𝟔,𝟎
𝑷 𝟎,𝟎
𝑷 𝟏,𝟎
𝑷 𝟎,𝟑𝟗
𝑷 𝟏,𝟑𝟗
𝑷 𝟔,𝟑𝟗
Histogra
m Voter
54. FPGA実装
54
sum
divide
divide
ブロック
完成︖
ブロック
完成︖
ブロック
完成︖
Yes
Yes
Yes
No
zeroing
sum of cell
𝑪 𝟎,𝟏
𝑪 𝟏,𝟏
𝑪 𝟎,𝟐
𝑪 𝟏,𝟐
𝑪 𝟎,𝟎
𝑪 𝟏,𝟎
bottom cell
upper cell
𝑪 𝟎,𝟎
𝑪 𝟎,𝟏
𝑪 𝟏,𝟎
𝑪 𝟏,𝟏
𝑪 𝟎,𝟏 + 𝑪 𝟏,𝟏
upper_left
upper_right
bottom_left
bottom_right
55. FPGA実装
55
weight ROMweight ROM
weight ROM
Multiply
Accumulator
Partial Sum RAM
33x4
ウインドウ
完成︖
+
+
Yes
No
zeroing
bias
output
vertical number of
block in window=
• 同じ特徴量に対し異なる重みが乗算される
• 縦に並列に計算
56. 実装結果
56
• 学習
• Python+Scikit-learn
パラメータを抽出
• 合成結果
• Latency 207736clock
• 2.7clock/pixel
• データ依存が数か所存在
• 実⾏結果
• AXI DMAでPSと接続
• udmabufでDMA制御
• HW使⽤ ︓6.22milisec / 160fps
SWのみ︓1700milisec / 0.58fps
• 275倍⾼速化
https://github.com/lp6m/ImageDetectionHW2
58. DNN on FPGA
58
• 様々な研究が⾏われている
• あまり考えずにとりあえず試してみたい
• 公開されている有名なフレームワーク
• DNNDKを触ってみた
59. DNN on FPGA
59
ネットワークの圧縮 量⼦化
float32bit->Int8bit
2値化(+1, -1)
XOR演算で処理
圧縮のタイミング 学習後に量⼦化を実⾏ 2値のまま学習
(精度が落ちにくい)
実装⽅法 DPU IP
重み・モデルはSWから転送
(HWの変更不要)
モデルごとにIP化
(HWの変更要)
オープンソース × 〇
対応ボード Xilinx Xilinx, Intel
60. DNN on FPGA
60
• DNNDKのワークフロー
Caffe, Tensorflow対応
右図ではdarknetからCaffeに変換
• decent
重みの量⼦化
キャリブレーション処理
(テストデータを使⽤して量⼦化
のチューニングを⾏う)
• dnndc-dpu
DPU向けの命令にコンパイル
61. DNN on FPGA
61
• モデル︓YOLOv3 darknet
end-to-end学習が可能
学習したモデルをDNNDKで量⼦化
• チュートリアル通りにやれば簡単に動作した