動き検出勉強会 リメイク版
2025.6.6
@natsutan
1
2
これは何?
過去の勉強会のリメイク
3
@natsutan
・ FPGA とプログラミングが好き
・最近はロボットの AI が仕事
https://natsutan.hatenablog.com/
自己紹介
4
FPGA を使った HPC の世界
FPGA は、 Field-Programmable Gate Array の略。
中身が書き換えられる半導体。
シンプルな物から、超高機能な物までピンキリ。
ロボットやドローンにも使われる。 Jetson が入ってくると
ころには FPGA 使われる可能性が高い。 Deep Learning 前
までは Nvidia の競合的な所もあったが、 Deep Learning 後
はちょっと元気がない。頑張ってほしい。
Verilog-HDL 、 VHDL といった専用の言語を使う。
https://ja.wikipedia.org/wiki/FPGA
5
ソフトウェアと FPGA の比較
メリット デメリット
速い
・システムが高価
・消費電力
・物理的な大きさ
・開発に時間がかかる
・デバッグがやりにくい
・データの移動が面倒
・開発環境が有料
・正しく使わないと壊れる
・壊れたときのリカバリが高価
6
FPGA の使いどころ
基本的にはニッチなところで使う。
今だと GPU が使えないところが一つのターゲットだと思う。
↓ 発表当時はこんなことを書いています。
FPGA で専用ハードウェアを作るのであれば、対パソコン比で 1000 倍はほしい。
・ 10 倍程度はアルゴリズムですぐ追いつかれる
・ 10 程度は何もしなくても早くなる
・ CPU
・メモリ
・コンパイラ
・ライブラリ
7
顔認識の速度向上の例
今だと LLM や生成 AI 周
り。
技術が出た当初は FPGA
で高速化の意味があるだ
ろうが、あっという間に
スマホでも動くように
なって FPGA 化の意味が
無くなる。
8
動き検出の話
・動き検出自体が HW 化する価値のあるアルゴリズム
・登場する数式が、機械学習の数式と共通点がある
9
動き検出が使われるところ
Object Tracking :どの物体が、どこに移動したか追跡する。
MPEG :動きベクトルを使って動画を圧縮する
10
動き検出とは
時刻t
画像のブロックが、時間と共にどちらへどれくらい動いたのかを検出する処理。
検出結果は動きベクトルと呼ばれる。
11
動き検出とは
画像の一部分を抜き出し、次の画像と最も一致する場所を探す。
ある物体が 1 フレームの間に 2 ピクセル右に行ったとしたら、右に 2 ピクセルずらしたところ
と画像が一致するはず。
12
動き検出の評価関数
評価関数として SAD 、 SSD が使われる。どちらも 0 なら画像は完全に一致している。
画像の一部を重ねた状態で、画素の差分を取る。
SAD(Sum of Absolute Difference ):各画素の差分の絶対値の和。
SSD(Sum of Squared Difference ):各画素の差分の二乗和
動き検出という点ではあまり精度に差がないこと、計算量が少ないことより SAD が使われる
ことが多い。統計学的には SSD の方が最小二乗和を求めているので SSD が好まれるときもあ
る。
E(𝑤)=
1
2
∑‖𝑑𝑛 − 𝑦(𝑥)‖
2
Deep learning の誤差関数
と同じ
13
動き検出の難しい所
① 原理的に検出できない図形がある
② そもそも動いている画像ではない
SAD が最小となる場所が
複数存在する
SAD が最小となる場所がそも
そも存在しない。
ピントがぼけることで、同じ
ような状況に陥る事がある。
14
当時のネタ
orz に時代を感じる
15
動き検出の実装方法
勾配法
・共役勾配法
・勾配降下法
・確率的勾配降下法
・ニュートン法
傾きを元に反復計算を行い、 SSD が最小
となる場所を探す。
全探索法?
一画素ずつずらして全領域で
の SAD を計算する。
僕が勝手に呼
んでいるだけ
なので注意
16
動き検出の実装方法
ソフトウェア実
装
ハードウェア
実装
② 荒い検索
① 勾配法 ③ 全探索法
(ピクセル単位)
④ サブピクセル計算
Layer1
Layer2
Layer3
17
勾配法
ある初期値を与え、その場所の傾きから次の場所を選ぶ事を繰
り返すことで、 SSD の最小値を求める。
ポテンシャルが一番低い所へ移動していくので、反復計算を降
下( descent) と表現する。
Ex: 確率的勾配降下法 (stochastic gradient descent)
動き検出の場合は 2 次元
勾配法には明確な欠点がある
欠点 1 :局所解に陥る
欠点 2 :何回反復すればよいのか分からない
欠点 3 :解が発散する
18
勾配法
欠点1:
初期値を間違えると、局所解を求めてしまう。
1 回の試行では局所解に陥ったかどうかが判定できな
い。
初期値が大事。
初期値が良ければ 2 ~ 3 回で収束するケースが多い。
良い初期値を得るために、「荒い検索」を利用する。
(後で)
ここを最小値
と判定 本当はこっちが最小値
初期値を変えると上手く行く 局所解に陥っているかどうか
が判断できない
19
勾配法
欠点 2 :
反復回数の計算が読めない。
運が良いと 3 回、運がわるいと数十回の反復が必要。
入力データと初期値に依存し、汎用的な終了の判定方法
が無い。
回数を増やしたり、初期値を変
えると上手く行くときがある。
動き検出の特性として、そも
そも最適な解が存在しない可
能性がある
20
勾配法
欠点 3 :
解が発散する。
検索範囲の端に向かって全力で移動してしまう。
→ 検出は簡単にできるので、局所解よりは扱いがらく
初期値を変えると上手く行くと
きがある。
動き検出の特性として、そも
そも最適な解が存在しない可
能性がある
21
動き検出の実装方法
ソフトウェア実
装
ハードウェア
実装
② 荒い検索
① 勾配法 ③ 全探索法
(ピクセル単位)
④ サブピクセル計算
Layer1
Layer2
Layer3
初期値が全て!
22
荒い検索
・縮小画像での動き検出
Coarse-to-fine search 、画像ピラミッド
・前回の動き検出の結果を使う
・周辺の信頼できる動きベクトルを使
う
動き検出できる
動き検出できない
動き検出できる
荒い検索を使っておおまかな動きベクトルを先に計算しておく
・ SW 実装(勾配法)の場合は、その値が初期値の候補になる
・ HW 実装(全探索)の場合はそのまま検索範囲の原点とする実装が多い
→ HW 実装の場合、特定の領域を取り出すのが面倒
23
画像ピラミッド
¼ にした画像で動
き検出を行う
その結果を初期値にし
て 1/2 にした画像で動
き検出を行う
最後に元の解像度で動
き検出を行う
https://ja.wikipedia.org/wiki/%E3%83%94%E3%83%A9%E3%83%9F%E3%83%83%E3%83%89
画像を積んだ状態がピラミッド
に見えるから画像ピラミッド。
動き検出は上から下へ処理して
いくが、 Deep Learning は下か
ら上に処理してい
く。 Conv→Maxpool
24
動き検出の実装方法
ソフトウェア実
装
ハードウェア
実装
② 荒い検索
① 勾配法 ③ 全探索法
(ピクセル単位)
④ サブピクセル計算
Layer1
Layer2
Layer3
25
全探索法
これができるのがハー
ドウェア実装
26
全探索法
欠点 1 :局所解に陥る
→全探索なので、全体で一番小さいところを検出できる
欠点 2 :何回反復すればよいのか分からない
→反復しないので計算量は一定
欠点 3: 解が発散する
→全探索なので、全体で一番小さいところを検出できる
勾配法の欠点を全てクリアー
27
全探索法
この辺は面白いけど省略
28
動き検出の実装方法
ソフトウェア実
装
ハードウェア
実装
② 荒い検索
① 勾配法 ③ 全探索法
(ピクセル単位)
④ サブピクセル計算
Layer1
Layer2
Layer3
29
サブピクセルの位置推定
http://www.sic.shibaura-it.ac.jp/~yaoki/hikarizou/hikarizou2.pdf
画素単位で探索すると、動きベ
クトルが整数になる。もう少し
細かく動きを検出したいとき
は、簡単なフィッティングでサ
ブピクセルを推定する。
用途によっては不要なこともあ
る。
30
OpenCV で動き検出使って見よう
cv2.optflow.createOptFlow_DualTVL1
cv2.optflow が
動き検出
アルゴリズム
何もしなくても CUDA や OpenCL を使ってくれるときもある
が、明示的に指定することもできる。 OpenCV のコンパイル
オプションとか環境( jetson とか)によっても違う。
ヘッダーファイルも修正必要
#include <opencv2/ocl/ocl.hpp> //opencl
#include <opencv2/gpu/gpu.hpp> //cuda
31
OpenCV で動き検出を早くするオプション
cv2.optflow.createOptFlow_DualTVL1
// パラメータ調整(速度優先)
optical_flow->setTau(0.25);
optical_flow->setLambda(0.10);
optical_flow->setTheta(0.2);
optical_flow->setScalesNumber(3); // デフォルトは 5
optical_flow->setWarpingsNumber(1); // デフォルトは 5
optical_flow->setIterations(10); // デフォルトは 30
optical_flow->setEpsilon(0.03); // デフォルトは 0.01
optical_flow->setScaleStep(0.5);
ScalesNumber が初期値を決
めるためのピラミッドの段
数。小さい方が計算量少ない
Iterations
勾配法の反復の最大数
小さいとワーストが減る
Epsilon
ループの終了条件。大きい方
が早く終わる。
32
OpenCV で動き検出を早くするオプション
cv2.optflow.createOptFlow_DualTVL1
WarpingsNumber
https://www.ipol.im/pub/art/2013/26/
上手く warp
した時
上手く行って
ない warp
一般的な Warp (アフィン変
換)ではなく、画素を物体の正
しい位置に寄せるような動きを
する。数を増やせば上手くいく
が、計算コストが発生する。
とりあえず小さくしておけば早
い。
ここは ChatGPT に聞いたの
で、興味ある人は自分でしっか
り調べてください。
33
最後に
動き検出は面白いし、いろいろ役に立つ技術なのでみんなもやってみよう。

動き検出勉強会リメイク。過去の発表のリメイク版です。動き検出のアルゴリズムとOpencvのオプションについてまとめました