スプラトゥーン画像解析ツール
「IkaLog」とFPGAの利用
Nov 6, 2016
オープンソースカンファレンス2016
Tokyo/Fall
Takeshi Hasegawa (@hasegaw)
本スライド中に登場するスプラトゥーン関連画像は任天堂株式会社の著作物です。
@hasegaw について
2
長谷川 猛 (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 として活動
著書/寄稿
3
4
IkaLog の利用イメージ
5
HDMI
キャプチャデバイス
IkaLog 実行用PC
IkaLog の画像認識例
6
IkaLog の画像認識例
7
8
https://stat.ink/
タイムライン表示
(ゲーム中に何がおきたかを“見える化“)
9
自分が倒されて
行動不能だった時
間
イカ(味方/敵 計8匹)の生死状況
チームのスペシャル発動、キル/デス
自分の塗り面積
https://stat.ink/
IkaLogへのFPGA適用
IkaLog の利用イメージ
11
HDMI
キャプチャデバイス
IkaLog 実行用PC
Project Inq
12
FPGAボード
PYNQ-Z1
13
Processor: Dual-Core ARM Cortex-A9
FPGA: 1.3 M reconfigurable gates
Memory: 512MB DDR3 / FLASH
Storage: Micro SD card slot
Video: HDMI In and HDMI Out
Audio: Mic in, Line Out
Network: 10/100/1000 Ethernet
Expansion: USB Host connected to
ARM PS
Interfaces: 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)
ボード1枚で
ARM Linux + ビデオキャプチャ!
14
単体でビデオパススルーが可能に!
15
問題点
16
問題点
17
Intel PCの6倍の時間がかかる!!
IkaLog on PYNQ-Z1のHDMIに関する課題
18
HDMI RX HDMI TX
DDR3
SDRAM
(512MB, 1GB/s)
ARM Core
IkaLog
Image
IkaLog
HDMI
Frame Buffer
IkaLog on PYNQ-Z1の
HDMIに関する課題 2/2
• PYNQの実装そのままでは、HDMIパススルー時
にオーディオ情報が消えてしまう
• 内部的にDVI -> ピクセルデータ -> DVIと
データ変換しているため、音が情報が欠落する
• その他にもHDMIを前提としたIP改修が必要 (EEPROM、
その他論理)
– HDMI入出力とIkaLogを同時に実行すると
画面が歪む
• メモリ帯域幅の問題?
19
IkaLog on PYNQ-Z1のHDMIに関する課題
20
HDMI RX HDMI TX
DDR3
SDRAM
(512MB, 1GB/s)
ARM Core
IkaLog
Image
IkaLog
HDMI
Frame Buffer
受信したシリアル
データをそのまま再送出
問題点
• 当初想定のプロセッサより低いため、
処理性能不足
– Intel CPU利用時の 1/6 のパフォーマンス
– 90秒の動画処理に120秒かかる
• H.264デコードの時間は、ここでは無視
(最終形では、HDMIキャプチャからRAW
データが入ってくるためデコード不要)
21
ソフトウェアレベルでの最適化状況
• 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回数を削減
• 画像比較用の中間画像をできるだけ再利用するよう改善
• 処理上問題がない高負荷なアルゴリズムを無効化
22
ソフトウェアレベルの最適化状況
23
最適化の効果
24
最適化の効果
ARM NEON命令を使った高速化
• 2画像の論理和/積 + popcnt を ARM NEON
命令で実装
25
pi@raspberrypi:~/ikalog/IkaLog $ PYTHONPATH=./lib/ python3
bench_1024mat.py
encode 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'>
FPGAでのアクセラレーション案
• H.264ビデオのハードウェアデコード
– Raspberry PiならOpenMaxが搭載されている
– ZYNQにはデコーダがないがPLがある!
• OpenCores に H.264デコーダがあるが…?
• キャプチャ画像の色変換
– 色変換(BGR to HSV, Grayscale)
– 必要時にPS部で色変換するより、予めPL部で色
変換を済ませておいたほうがよいのでは?
26
ARM Core
IkaLogの色変換のしくみ
27
HDMI
RX
DRAM
RGB
(1280, 720, 3)
HSV
(1280, 720, 3)
Gray
(1280, 720, 1) IkaLog実行時間の
10.4%が色変換
ARM NEON 命令使用
ARM Core
PL部による色変換(妄想)
28
HDMI
RX
Color
Converter
DRAM
RGB
(1280, 720, 3)
HSV
(1280, 720, 3)
Gray
(1280, 720, 1) IkaLogは色変換済みの
データ参照のみにするキャプチャ時にPL部で
色変換を済ませておき
DRAMに書き込んでおく
IkaLog on PYNQ-Z1の
HDMIに関する課題 1/2
• HDMIのキャプチャあたり100msかかる
– XilinxのPYNQライブラリの実装上の問題?
→ 今朝、ほぼ確信
– ドライバを修正すると 100ms/frame → 1ms以下
/frame に改善しそう
• HDMIソースとの相性、HDMI IPの信頼性
– PYNQがHDMI Sinkとして受信できるSourceが
限られている模様
– 画面にノイズがのることがある
29
30
まとめ
31
FPGAボード
共同開発・設計者 募集中!!
マンメンミ!
(ありがとうございました)

IkaLog_FPGAStartup1

Editor's Notes