flowの導入具体例について紹介・解説します。解説Opticalflowの仕組み及び活用方法に関してOpticalflowの概要・アルゴリズム概要Opticalflowとは一言でいうと、「2つの異なる画像間で、物体がどのように、どれくらい動いたのか、を捉えるための技術・計算方法」です。https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.htmlこの技術を用いることで、上の例にあるように、動画(画像)の中で、何がどのように動いたのかを追跡したり、そもそも「何か」が動いたのかどうかを検知する、といったようなことが可能になります。Opticalflowの仕組みについて少しだけ詳しくそもそも動画とは、連続した一連の画像がまとまったもの、です。https://www.sugilab.net/jk/joho-kiki/2109/index.html上の図を見ていただくとイメージできるように、動画とは連続した画像を高速で表示することでモノが動いているように見せている、というものです。した複数の画像の間で何がどう動いたかを把握するためにはどうすればよいのでしょうか。結論から申し上げると、「異なる画像の中で、同じ色彩を持っている要素(ピクセル)を比較し、その要素がどの方向に、どれくらい移動しているのか」を計算する、ことで「動き」の経過を計算・記録していく、という方法によってそれが可能になります。https://www.researchgate.net/figure/Calculation-of-optical-flow_fig1_262270679その計算方法がまさにOpticalflowという技術なのですが、本稿ではアルゴリズム自体の詳細については省略し、別の記事(リンク)に譲ることとします。(下記記事に目を通していただくと、後述の具体例を利用した説明についてもより理解が用意になると思いますところ、お時間のある方は是非目を通してみてください。Flow具体的な活用方法の例Opticalflowを利用すると、前述のとおり動画の中での物体の動きを検知・追跡することができるのですが、具体的には下記のような活用事例があります。200→林野火災の早期発見のため、監視カメラ等を用いた火災煙の発生を自動で検知するシステム。FIT2007(第6回情報科学技術フォーラム)→自然環境の評価を目的とし、環境の変化に敏感な野鳥の動向を監視するためのシステムいずれも定点カメラを利用した監視システムという点で一致しておりますが、Opticalflowという技術が、人間が監視するには骨が折れるような環境・条件での定点観測という分野で主に力を発揮できる技術である、といった点がうかがえるかと思います。本技術を利用したデモについて当社ではOpticalflowの原理をより具体的に実感していただくため、簡易的なデモを用意いたしました。本デモではウェブカメラまたはお手持ちの動画ファイルをインプットとして、Opticalflowの処理を加えて物体の動きを追跡した様子を表示するようなデモとなっております。デモという性質上、定点カメラを前提としており、機能も限定しておりますが、原理上、様々な具体例に応じたカスタム化を行うことで大幅な精度向上も見込める、という点もまた、Opticalflowという技術の奥深さであると考えております。お問い合わせをお願いいたします。上記でご紹介した当社のデモでは、OpenCV.jsというライブラリを利用しています。)ですが、OpenCV.jsとはそのOpenCVの機能をブラウザで扱えるように、Javascriptライブラリとして展開したものです。ライブラリのより詳細な説明については、下記リンクから公式ドキュメントをご覧ください。OpenCV.js2.htmlファイルで読み込む同ドキュメントの下段部分のソースコードを参照という2つのステップを踏むだけで簡単に導入することが可能です。ビルドの段階から行いたい、という場合も含め上記公式ドキュメントにすべて記載があります。解説それでは以下、我々が公開しているデモを題材とし、Opticalflow技術とOpenCV.jsの利用方法について、詳細に解説していきたいと思います。上記のような処理を実現するためには、大まかに下記のような流れで実装を進めていく必要があります。上記のループ処理なお、実装内容の全体像については、本稿の最下部にソースコードを掲載しているため、そちらもご確認ください。下記2つのキャプチャー画像を取得し、それぞれをグレースケールに変換していく処理から始めます。・cv.VideoCapture()というのはOpenCVに備えられているキャプチャー用の関数です。この関数に引数として実際にキャプチャーを取得したhtml上のvideo要素を渡してあげるだけでキャプチャーが取得できます。・cv.MatとはOpenCV特有のデータ形式ではありますが、これは単なるマトリクス(行列)データ形式です。channelとなります。channelについては特に注意すべき点であるため、後ほど追加で言及します。ここでのframe1という変数を宣言している部分は、画像のデータを行列として扱えるように、データの「箱」を用意してあげている、といったイメージで捉えるとわかりやすいかもしれません。OpenCV・この時点ではframe1は特になんの情報ももたない空の行列データですが、この用意した「箱」に、キャプチャーした画像の内容(RBGA情報)を入れてあげることで画像の行列データとして利用することができます。この部分の実装が、read関数を利用したcap.read(frame1)の部分となります。これで動画のフレームをキャプチャーした内容を、行列データとして扱えるようになりました(上記1)。・まず、空の行列データの箱を用意し、prvsという変数に格納しています。・その後、cvtColor関数を利用し、上記で読み込んだframe1の内容をグレースケールに変換した上で、prvsに格納しています。第二引数に変換後の行列データの箱、そして第三引数には具体的に変換したい方式(この場合はRGBAからグレースケールに)を指定します。これで、キャプチャー画像をグレースケール化した行列データをprvsとして利用できるようになりました。(※実際にはビデオが再生されている間、processVideoという関数をsetTimeoutに渡し続けることによって上記を実現しています。詳細は本稿末尾のソースコード全体を参照してください。Opticalflowの実行と移動ベクトル(U,V)の取得さて、用意されたprvs及びnextの2つの連続する画像の行列データを利用して、実際にOpticalflowを計算するフェーズです。本稿の冒頭で述べたとおり、Opticalflowとは「異なる画像の中で、同じ色彩を持っている要素(ピクセル)を比較し、その要素がどの方向に、どれくらい移動しているのか(=移動ベクトル(U,V))」を計算する技術です。我々の実装では、この部分を具体的に下記のとおり実装しています。今回の実装では物体の動き全体を捉えたいので、calcOpticalFlowFarnebackという関数を利用し、すべてのピクセルに対してOpticalflowを求めています。(※Opticalflowにはこれ以外にも様々な計算方法がありますが、詳細については下記リンクを参照ください。Flowu,vベクトルここで取得しているu,vとは、移動の方向を表すベクトル値と捉えてください。(同上、y方向)を表しています。これらu,vは、上記、calcOpticalFlowFarneback関数を利用することで用意に取得することができます。これでopticalflowを利用して、それぞれのピクセルの動きのベクトルを取得することができました。それでは次に、取得したu,vを用いて、実際に描画を行っていく手法について解説いたします。動いた部分の描画ここでは上記で取得した結果(u,v)をもとに、動いた範囲を線で描画することで物体の動きを表現する方法について解説します。実装部分は下記のとおりです。・ピクセルごとに動いたかどうかを判断し、処理を行います。・移動した距離はu,vを利用して計算し、magnitudeという変数に格納します。移動距離が一定の場合のみ、描画処理を行うようにしています。・なお、ここでのsensitivityという変数は、デモ画面上で設定可能な「感度」です。感度を操作することで描画処理を加える移動距離の大きさに自由度をもたせています。・p1を原点座標、p2を移動後の座標としています。・cv.line関数を利用し、原点座標と移動後座標を結ぶ線を描画してやります。これで、動いた部分が緑色の線で描画することができました。この処理を一定の間隔ごとのピクセルに対して行います(全てのピクセルに行うと見づらくなるため。動画が再生されている間、フレームごとに上記の処理が行われるように、setTimeout関数を利用して、処理を繰り返してやります。今回の実装の内容は以上となりますが、実装の全体像は下記のとおりです。実際の設定値が1の場合、余計な雑音を無視したちょうどよいくらいになるので一旦この数値に設定している。flowの概念を体験いただくためにご用意したものであり、様々なケースに関して汎用性があるとは必ずしも言えません。本デモの場合、あくまで定点カメラの動画を前提としており、そのため、インプットされた動画のカメラ位置が動く場合、画面全体が「動いたもの」として検知されることになります。実際には定点カメラでない場合、ないしは動く物体の方向や程度が事前にある程度予想できる場合など、様々なケースが考えられますが、そうしたケースにも個別に合わせて開発を行うことで、より良い精度を出すことは十分に可能です。個別具体の案件についてのデモの実施や、PoCのご依頼等につきましては、下記のお問い合わせフォームからのご連絡をお願いいたします。弊社は画像処理やAI等の解析分野を強みとしており、解析技術を用いて各企業様が抱える課題を解決するためのシステムをご提供しております。解析に必要となるデータを取得するためのセンシング(カメラ、レーザー、レーダー等)の選定含めて、ハードウェア・ソフトウェアの両面から、各企業様に最適なご提案をさせて頂いております。弊社パッケージ製品に関しまして、デモのご依頼、また「導入方法について聞きたい」「自社事業に利用できるか相談したい」など、どのようなことでもお気軽にお問い合わせください。お問い合わせフォームはこちら※弊社はドローンを活用した事業も展開しております。ドローンにセンサーを搭載させることで、地上からのセンシングだけでは課題解決が困難であるケースにも対応しております。ドローン活用に関する事例や情報等の詳細は、弊社WEBサイト「ドローンビズ」をご参照下さい。