32
スススススススススススススス IkaLog FPGA ススス Nov 6, 2016 スススススススススススススス 2016 Tokyo/Fall Takeshi Hasegawa (@hasegaw) スススススススススススススススススススススススススススススススススススス

IkaLog_FPGAStartup1

Embed Size (px)

Citation preview

Page 1: IkaLog_FPGAStartup1

スプラトゥーン画像解析ツール「 IkaLog 」と FPGA の利用

Nov 6, 2016オープンソースカンファレンス 2016Tokyo/Fall

Takeshi Hasegawa (@hasegaw)

本スライド中に登場するスプラトゥーン関連画像は任天堂株式会社の著作物です。

Page 2: IkaLog_FPGAStartup1

2

@hasegaw について

長谷川 猛 (HASEGAWA Takeshi)twitter: @hasegaw

2004|

2011

2011|

2014

2014|

SE サービス プリセールス @ Software Research Associates, Inc.システム構築、客先のシステム運用、提案でキャリアをスタート→ プリセールス〜 PM を担当するインフラエンジニア

システムアーキテクト@ Trigence Semiconductor, Inc.エンベデッド開発支援から IT システム管理まで多岐に対応

セールスエンジニア@ Fusion-io, Inc.高速半導体ストレージ ioDrive / ioMemory シリーズの SE として活動

Page 3: IkaLog_FPGAStartup1

3

著書/寄稿

Page 4: IkaLog_FPGAStartup1

4

Page 5: IkaLog_FPGAStartup1

5

IkaLog の利用イメージ

HDMIキャプチャデバイス

IkaLog 実行用 PC

Page 6: IkaLog_FPGAStartup1

6

IkaLog の画像認識例

Page 7: IkaLog_FPGAStartup1

7

IkaLog の画像認識例

Page 8: IkaLog_FPGAStartup1

8

https://stat.ink/

Page 9: IkaLog_FPGAStartup1

タイムライン表示(ゲーム中に何がおきたかを“見える化“)

9

自分が倒されて行動不能だった時間

イカ(味方/敵 計8匹)の生死状況

チームのスペシャル発動、キル/デス自分の塗り面積

https://stat.ink/

Page 10: IkaLog_FPGAStartup1

IkaLog への FPGA 適用

Page 11: IkaLog_FPGAStartup1

11

IkaLog の利用イメージ

HDMIキャプチャデバイス

IkaLog 実行用 PC

Page 12: IkaLog_FPGAStartup1

12

Project Inq

FPGA ボード

Page 13: IkaLog_FPGAStartup1

13

PYNQ-Z1Processor: Dual-Core ARM Cortex-A9FPGA: 1.3 M reconfigurable gatesMemory: 512MB DDR3 / FLASHStorage: Micro SD card slotVideo: HDMI In and HDMI OutAudio: Mic in, Line OutNetwork: 10/100/1000 EthernetExpansion: USB Host connected to

ARM PSInterfaces: 1x Arduino Header, 2x Pmod (49 GPIO)GPIO: 16 GPIO (65 in total with Arduino and Pmods)Other I/O: 6x User LEDs, 4x Pushbuttons, 2x Switches Dimensions: 3.44” x 4.81”

(87mm x 122mm)

Page 14: IkaLog_FPGAStartup1

14

ボード1枚でARM Linux + ビデオキャプチャ!

Page 15: IkaLog_FPGAStartup1

15

単体でビデオパススルーが可能に!

Page 16: IkaLog_FPGAStartup1

16

問題点

Page 17: IkaLog_FPGAStartup1

17

問題点

Intel PC の6倍の時間がかかる!!

Page 18: IkaLog_FPGAStartup1

18

IkaLog on PYNQ-Z1 の HDMI に関する課題

HDMI RX HDMI TX

DDR3SDRAM

(512MB, 1GB/s)

ARM Core

IkaLogImage

IkaLog

HDMIFrame Buffer

Page 19: IkaLog_FPGAStartup1

19

IkaLog on PYNQ-Z1 のHDMI に関する課題 2/2

• PYNQ の実装そのままでは、 HDMI パススルー時にオーディオ情報が消えてしまう

• 内部的に DVI -> ピクセルデータ -> DVI とデータ変換しているため、音が情報が欠落する

• その他にも HDMI を前提とした IP 改修が必要 (EEPROM 、その他論理 )

– HDMI 入出力と IkaLog を同時に実行すると画面が歪む

• メモリ帯域幅の問題?

Page 20: IkaLog_FPGAStartup1

20

IkaLog on PYNQ-Z1 の HDMI に関する課題

HDMI RX HDMI TX

DDR3SDRAM

(512MB, 1GB/s)

ARM Core

IkaLogImage

IkaLog

HDMIFrame Buffer

受信したシリアルデータをそのまま再送出

Page 21: IkaLog_FPGAStartup1

21

問題点

• 当初想定のプロセッサより低いため、処理性能不足

– Intel CPU 利用時の 1/6 のパフォーマンス

– 90 秒の動画処理に 120 秒かかる

• H.264 デコードの時間は、ここでは無視(最終形では、 HDMI キャプチャから RAWデータが入ってくるためデコード不要)

Page 22: IkaLog_FPGAStartup1

22

ソフトウェアレベルでの最適化状況

• uint8 計算 -> AND/OR 演算に置き換え

• より高速に実行できるよう代替処理に置き換え

– np.reshape(np.extract(x, x), (-1)).shape[0]→ cv2.calcHist() ※8bit グレースケール画像の popcnt

– (np.sum(x) / a < b) → (np.amax(x) < b)

• OpenCV 3.1 を WITH_NEON 付きでビルド

• deepcopy 回数を削減

• 画像比較用の中間画像をできるだけ再利用するよう改善

• 処理上問題がない高負荷なアルゴリズムを無効化

Page 23: IkaLog_FPGAStartup1

23

ソフトウェアレベルの最適化状況

Page 24: IkaLog_FPGAStartup1

24

最適化の効果

最適化の効果

Page 25: IkaLog_FPGAStartup1

25

ARM NEON 命令を使った高速化

• 2 画像の論理和/積 + popcnt を ARM NEON 命令で実装pi@raspberrypi:~/ikalog/IkaLog $ PYTHONPATH=./lib/ python3

bench_1024mat.pyencode 0.000015974s logical_and_popcnt 0.094928265s total 0.094944239s

<class 'ikalog.utils.ikamatcher2.reference.Numpy_uint8'>

encode 0.000014544s logical_and_popcnt 0.021027803s total 0.021042347s

<class 'ikalog.utils.ikamatcher2.reference.Numpy_uint8_fast'>

encode 0.005746365s logical_and_popcnt 0.002564192s total 0.008310556s

<class 'ikalog.utils.ikamatcher2.arm_neon.NEON'>

Page 26: IkaLog_FPGAStartup1

26

FPGA でのアクセラレーション案

• H.264 ビデオのハードウェアデコード

– Raspberry Pi なら OpenMax が搭載されている

– ZYNQ にはデコーダがないが PL がある!

• OpenCores に H.264 デコーダがあるが… ?

• キャプチャ画像の色変換

–色変換 (BGR to HSV, Grayscale)–必要時に PS 部で色変換するより、予め PL 部で色

変換を済ませておいたほうがよいのでは?

Page 27: IkaLog_FPGAStartup1

27

ARM Core

IkaLog の色変換のしくみ

HDMIRX

DRAM

RGB(1280, 720, 3)

HSV(1280, 720, 3)

Gray(1280, 720, 1) IkaLog 実行時間の

10.4% が色変換ARM NEON 命令使用

Page 28: IkaLog_FPGAStartup1

28

ARM Core

PL 部による色変換(妄想)

HDMIRX

Color Converter

DRAM

RGB(1280, 720, 3)

HSV(1280, 720, 3)

Gray(1280, 720, 1) IkaLog は色変換済みのデータ参照のみにするキャプチャ時に PL 部で色変換を済ませておき

DRAM に書き込んでおく

Page 29: IkaLog_FPGAStartup1

29

IkaLog on PYNQ-Z1 のHDMI に関する課題 1/2

• HDMI のキャプチャあたり 100ms かかる

– Xilinx の PYNQ ライブラリの実装上の問題?→ 今朝、ほぼ確信

– ドライバを修正すると 100ms/frame → 1ms 以下 /frame に改善しそう

• HDMI ソースとの相性、 HDMI IP の信頼性

– PYNQ が HDMI Sink として受信できる Source が限られている模様

– 画面にノイズがのることがある

Page 30: IkaLog_FPGAStartup1

30

Page 31: IkaLog_FPGAStartup1

31

まとめ

FPGA ボード

共同開発・設計者 募集中!!

Page 32: IkaLog_FPGAStartup1

マンメンミ!( ありがとうございました)