コンピュータビジョン研究の最近のブレークスルーは、特定のクラスに属するオブジェクトのインスタンスを検出するためのオブジェクト検出や、ピクセル単位の分類のためのセマンティックセグメンテーションなどの技術を通じて、マシンが周囲の世界を知覚することを可能にしました。しかし、リアルタイムビデオ入力を処理するために、これらの技術のほとんどの実装は、時間情報\((t)\)を無視して、同じフレーム\((x,y)\)内のオブジェク 言い換えれば、実行ごとに、完全に無関係な画像であるかのように、各フレームを独立して再評価します。 しかし、連続したフレーム間の関係が必要な場合、たとえば、フレーム間の車両の動きを追跡して現在の速度を推定し、次のフレーム内の位置を予測したいと
または、アーチェリー、野球、バスケットボールなどの人間の行動を認識するために、連続したフレーム間の人間のポーズ関係に関する情報が必要な場p>


このチュートリアルでは、オプティカル-フローとは何か、その二つの主な亜種(スパースとデンス)を実装する方法を学び、ディープラーニングと有望な将来の方向性を含む最近のアプローチの全体像を得ることができます。オプティカルフローとは何ですか?
スパース光フローの実装
密な光フローの実装
ディープラーニングとビヨンド
- 光フローとは何ですか?
- Sparse vs Dense Optical Flow
- スパースオプティカルフローの実装
- ビデオを読み取るようにOpenCVを設定し、パラメータを設定する
- Shi-Tomasi Corner Detector-追跡するピクセルを選択する
- 特定のオブジェクトの追跡
- Lucas-Kanade:Sparse Optical Flow
- 視覚化する
- 密なオプティカルフローの実装
- 環境の設定
- ビデオを読むためにOpenCVを設定する
- Farneback Optical Flow
- 視覚化する
- ディープラーニングを用いたオプティカルフロー
- 光フローアプリケーション:セマンティックセグメンテーション
- 光フローアプリケーション:オブジェクト検出&追跡
- 結論
光フローとは何ですか?
まず、オプティカルフローの高レベルの理解から始めましょう。 オプティカルフローは、オブジェクトとカメラとの間の相対的な動きによって引き起こされる、シーケンスの連続したフレーム間のオブジェク 光流の問題は、次のように表現することができます:

連続したフレーム間で、画像強度\((I)\)を空間\((x,y)\)と時間\((t)\)の関数として表現することができます)\). つまり、最初の画像\(I(x,y,t)\)を\(t\)時間にわたってピクセルを\((dx,dy)\)だけ移動すると、新しい画像\(I(x+dx,y+dy,t+dt)\)が得られます。
まず、オブジェクトのピクセル強度は連続するフレーム間で一定であると仮定します。

第二に、我々はRHSのテイラー級数近似を取り、共通

第三に、我々は光フロー方程式を導出するために\(dt\):ここで、\(u=dx/dt\)と\(v=dy/dt\)は、\(u=dx/dt\)と\(v=dy/dt\)は、\(v=dy/dt\)と\(v=dy/dt\)は、\(v=dy/dt\)と\(v=dy/dt\)と\(v=dy/dt\)と\(v=dy/dt\)と\(v=dy/dt\)と\(v=dy/dt\)と\(v=dy/dt\)と\(v=dy/dt\)と\(v=dy/dt\)と\(v=dy/dt\)と\(v=dy/dt\)と\(v=dy/dt\)と\(v=dy/dt\)と\(v=dy/dt\)\(dI/dx,dI/dy\)と\(dI/dt\)は、水平軸、垂直軸、および時間に沿った画像の勾配です。
\(dI/dx,dI/dy\)と\(dI/dt\)は、水平軸、垂直軸、および時間に沿った画像の勾配です。
\(dI/ つまり、\(u(dx/dt)\)と\(v(dy/dt)\)を解いて時間の経過に伴う動きを決定します。\(v(dy/dt)\)を計算すると、\(v(dy/dt)\)は、\(v(dy/dt)\)を計算することができます。 2つの未知の変数に対して1つの方程式しかないので、\(u\)と\(v\)の光学流れ方程式を直接解くことはできないことに気付くかもしれません。\(u\)と\(v\) この問題に対処するために、Lucas-Kanadeメソッドなどのいくつかのメソッドを実装します。
Sparse vs Dense Optical Flow
Sparse optical flowは、フレーム内のいくつかの”興味深い特徴”(オブジェクトのエッジやコーナーを描いたいくつかのピクセル)のフローベクトルを与え、Dense optical flowは、フレーム全体(すべてのピクセル)のフローベクトルを与える。 あなたが推測したように、高密度の光学フローは、遅い/計算上高価であるというコストでより高い精度を持っています。p>
スパースオプティカルフローの実装
スパースオプティカルフローは、その速度ベクトル(動き)を追跡するために、ピクセルのスパースフィーチャセット(エッジやコーナーなどの興味深いフィーチャ)を選択します。 抽出されたフィーチャは、同じポイントが追跡されていることを確認するために、フレーム間でオプティカルフロー関数に渡されます。 Lucas–Kanade法、Horn–Schunck法、Buxton–Buxton法など、スパース光フローのさまざまな実装があります。 実装には、コンピュータビジョンアルゴリズムのオープンソースライブラリであるOpenCVでLucas-Kanadeメソッドを使用します。OpenCVがまだインストールされていない場合は、ターミナルを開いて次を実行します。
pip install opencv-python
ここで、次を実行してチュートリアルリポジトリをクローンします。
git clone https://github.com/chuanenlin/optical-flow.git
次に、Opencvを開きます。sparse-starter.py あなたのテキストエディタで。 このPythonファイルにすべてのコードを記述します。
ビデオを読み取るようにOpenCVを設定し、パラメータを設定する
Shi-Tomasi Corner Detector-追跡するピクセルを選択する
スパースオプティカルフローの実 画像の特徴は、豊富な画像コンテンツ情報を提示する関心のあるポイントです。 例えば、そのような特徴は、平行移動、スケール、回転、およびコーナーのような強度の変化に対して不変である画像内の点であってもよい。
Shi-Tomasiコーナー検出器は、次の三つの手順によって実装することができる一般的なHarrisコーナー検出器と非常によく似ています。
- \(x\)と\(y\)の両方の方向に翻訳されたときに大きな勾配(画像強度の変動)を持つウィンドウ(小さな画像パッチ)を決定する。
- 各ウィンドウについて、スコア\(R\)を計算します。
- \(R\)の値に応じて、各ウィンドウはフラット、エッジ、またはコーナーとして分類されます。あなたはハリスコーナー検出器のステップバイステップの数学的な説明の詳細を知りたい場合は、これらのスライドを通過すること自由に感じます。
ShiとTomasiは、後に追跡するために彼らの紙の良い機能でハリスコーナー検出器に小さいながらも効果的な変更を行いました。
変更は、スコア\(R\)が計算される式にあります。 Harris Corner検出器では、スコアリング関数は次のように与えられます:begin\開始{アレイ}{C}{R=\operatorname{det}M-K(\operatorname{トレース}M)begin{2}}\NEWLINE\{\operatorname{det}M=\ラムダ_{1}\ラムダ_{2}}\NEWLINE\{\operatorname{トレース}M=\ラムダ_{1}+\ラムダ_{2}}端\{アレイ}
/
代わりに、Shi-Tomasiはスコアリング関数を次のように提案しました。
r
r=\min\left(\lambda_{1}、\lambda_{2}\right)
basically
これは基本的に\(r\)がしきい値よりも大きい場合、それはコーナ 以下は、Harris(左)とShi-Tomasi(右)のスコアリング関数を\(σ1-σ2\)空間で比較したものです。

Shi-Tomasiの場合、\(φ1\)と\(φ2\)が最小しきい値\(φ min\)を超えている場合にのみ、コーナーとして分類されたウィンドウです。
OpenCVによるShi-Tomasiの実装のドキュメントgoodFeaturesToTrack()
ここにあります。
特定のオブジェクトの追跡
特定のオブジェクトのみを追跡するシナリオ(特定の人を追跡するなど)またはオブジェクトのカテゴリ(トラフ コードを簡単に変更して、必要なオブジェクトのピクセルを追跡するには、prev
変数を変更します。
オブジェクト検出とこのメソッドを組み合わせて、検出された境界ボックス内のピクセルの流れのみを推定することもできます。 この方法では、ビデオ内の特定のタイプ/カテゴリのすべてのオブジェクトを追跡することができます。
Lucas-Kanade:Sparse Optical Flow
LucasとKanadeは、ステレオビジョンへの応用と反復画像登録技術を論文の二つの連続したフレームを比較することによっ Lucas-Kanadeメソッドは、次の仮定の下で機能します:
- 二つの連続したフレームは、オブジェクトが大幅に変位しないように、小さな時間増分(\(dt\))で分離されています(言い換えれば、この方法は、動きの遅いオブジ
- フレームは、滑らかに変化するグレーの色合いを示すテクスチャオブジェクトを持つ”自然な”シーンを描いています。
まず、これらの仮定の下で、Shi-Tomasiによって検出された特徴の周りに小さな3×3の窓(近傍)を取り、9つの点すべてが同じ動きを持つと仮定p>



これは、n個のピクセルごとの光流方程式(先に説明した)にすぎません。
方程式のセットは、次の行列形式で表すことができます。

以前に注意してくださ光の流れですか?”セクション)、我々は一つの方程式で二つの未知の変数を解く必要があるという問題に直面しました。 私たちは今、2つの未知数(\(V_X\)と\(V_Y\))を9つの方程式で解く必要がありますが、これは過剰に決定されています。
第二に、過度に決定された問題に対処するために、我々は次の二方程式-二未知の問題を得るために最小二乗近似を適用します。

こで、\(vx=u=dx/dt\)は時間の経過に伴う\(x\)の動きを表し、\(vy=v=dy/dt\)は時間の経過に伴うyの動きを表します。 この二つの変数を解くことで,光流問題が完成する。

一言で言えば、我々は追跡し、反復的にこれらの点の光学フローベクトルを計算するためにいくつかの興味深い特徴を識別します。 しかし、Lucas-Kanade法を採用することは、(私たちの最初の仮定から)小さな動きに対してのみ機能し、大きな動きがあるときに失敗します。 したがって、Lucas-KanadeメソッドのOpenCV実装ではピラミッドを採用しています。

高レベルビューでは、ピラミッドを上がるにつれて小さな動きが無視され、大きな動きが小さな動きに縮小されます。 OpenCVの実装の包括的な数学的説明はBouguetのノートにあり、OpenCVのLucas-Kanadeメソッドの実装のドキュメントはcalcOpticalFlowPyrLK()
here見つけることがで
視覚化する
それだけです! ターミナルを開き、
python sparse-starter.py
を実行して、スパースオプティカルフローの実装をテストします。 👏
コードを見逃した場合、完全なコードは次の場所にありますsparse-solution.py…..
密なオプティカルフローの実装
以前は、ピクセルのスパースフィーチャセットのオプティカルフローを計算しました。 Dense optical flowは、各フレームのすべてのピクセルのオプティカルフローベクトルを計算しようとします。 このような計算は遅くなるかもしれませんが、動きからの構造の学習やビデオセグメンテーションなどのアプリケーションに適した、より正確な結果と密な結果が得られます。 密な光学流れの様々な実装がある。 最も一般的な実装の1つであるFarnebackメソッドを使用し、opencv、コンピュータビジョンアルゴリズムのオープンソースライブラリを使用して実装します。
環境の設定
まだ設定していない場合は、スパースオプティカルフローの実装のステップ1に従って環境を設定してください。
次に開く
次に開くdense-starter.py あなたのテキストエディタで。 このPythonファイルにすべてのコードを記述します。
ビデオを読むためにOpenCVを設定する
Farneback Optical Flow
Gunnar Farnebackは、多項式展開に基づく二フレーム動き推定の論文で二つの連続したフレームを比較するこ
まず、この方法は、多項式展開変換を介して二次多項式によって画像フレームの窓(詳細はスパースオプティカルフロー実装のLucas Kanadeセクションを参照)を近似 次に,平行移動(運動)の下で多項式がどのように変換するかを観察することにより,多項式展開係数から変位場を推定する方法を定義した。 一連の改良の後、密な光学流れが計算されます。 Farnebackの論文はかなり簡潔で簡単なので、数学的導出をより深く理解したい場合は、論文を読むことを強くお勧めします。

calcOpticalFlowFarneback()
はここにあります。
視覚化する
それだけです! ターミナルを開き、
python dense-starter.py
を実行して、密なオプティカルフローの実装をテストします。 👏
コードを見逃した場合、完全なコードは次の場所にありますdense-solution.py.
ディープラーニングを用いたオプティカルフロー
オプティカルフローの問題は、歴史的に最適化の問題でしたが、ディープラーニングを適用すること 一般的に、このような手法は、光学フロー(色分けされた画像)を出力するための入力として二つのビデオフレームを取り、これは次のように表現され得る。:



深いニューラルネットワークを用いたオプティカルフローの計算には、大量の学習データが必要であり、特に取得が困難です。 これは、オプティカルフロー用のビデオ映像をラベル付けするには、画像の各点の正確な動きをサブピクセルの精度に正確に把握する必要があるため ラベリングトレーニングデータの問題に対処するために、研究者は、大規模な現実的な世界をシミュレートするために、コンピュータグラフィックスを使用しました。 世界は命令によって生成されるので、ビデオシーケンス内の画像の各点の動きが知られている。 そのような例としては、様々なシーケンスのためにレンダリングされた光学フローラベル付きのオープンソースCGIムービーであるMPI-Sintelや、光学フローラベル付きのランダムな背景を横切って飛んでいる多くの椅子のデータセットであるFlying Chairsなどがある。


ディープラーニングでオプティカルフローの問題を解決することは、FlowNet、SPyNet、PWC-Netなどのバリエーションが、さまざまなベンチマークで互いに優
光フローアプリケーション:セマンティックセグメンテーション
光フローフィールドは、観測されたシーンのための情報の広大な鉱山です。 光流を正確に決定する技術が向上するにつれて、他のいくつかの基本的なコンピュータビジョンタスクとの接合における光流の適用を見ることは たとえば、セマンティックセグメンテーションのタスクは、画像を一意のオブジェクトクラスに対応する一連の領域に分割することですが、同一のテク しかし,物体が別々に配置されている場合,高密度光流場の不連続性が物体間の境界に対応する場合には,物体の異なる運動が非常に有用である可能性がある。

光フローアプリケーション:オブジェクト検出&追跡
光フローの別の有望なアプリケーションは、オブジェクト検出と追 疎な光学フローは、関心点の追跡を利用するので、そのようなリアルタイムシステムは、静止カメラまたは車両に取り付けられたカメラのいずれかからの特徴ベースの光学フロー技術によって実行されてもよい。


結論
基本的に、光フローベクトルは、ビデオシーケンスのシーン理解を必要とする無数の高レベルのタスクへの入力とし まだ発見されていない光流のための新しいアプリケーションは、その設計者の創意工夫によってのみ制限されています。コードを書くのが面倒で、Gpuに費やしたくないですか? Nanonetsに頭の上に、無料でコンピュータビジョンモデルを構築!