概要
Land Lines は、ジェスチャーを使って Google Earth の衛星画像を探索できる試験運用版です。機械学習、データの最適化、グラフィック カードの機能を組み合わせることで、バックエンド サーバーを必要とせずに、スマートフォンのウェブブラウザでテストを効率的に実行できます。ここでは、Google の開発プロセスと、最終結果にたどり着いたさまざまなアプローチをご紹介します。
地球の画像のデータセットの調査について Data Arts チームから相談があったときは、とてもワクワクしました。画像は美しく、人工のものから天然のものまで、さまざまな種類の構造やテクスチャを見せていました。そして、このデータセットをどのようにつなげるか、興味を引かれました。画像の類似性とフィルタリングや整理の方法に関する さまざまな初期テストを実施しました
グループとして、画像の美しく際立った線を何度も繰り返し見ています。高速道路、川、山の縁、土地など、すぐに見つけられる線でした。私たちは、これらを探索するためのいくつかのプロジェクトを設計しました。アーティストとして、私は行のコレクションでできること(たとえば、Cassandra C Jones のライトニングによる作品を参照)からインスピレーションを得ました。そして、このデータセットを扱うのを楽しみにしています。
線検出
当初の課題の一つは、画像内の線を検出する方法でした。トレーシング ペーパーを 1 枚取り、この 1 枚の写真のプリントアウトの上に置き、目に見える線を描くのは簡単ですが、一般的に、線を見つけるためのコンピュータ ビジョン アルゴリズムは、非常に多様な画像ではうまく機能しない傾向があります。
以前のバージョンの検索では、ローカル プロジェクトを使用してプロジェクトにアルゴリズムを描画し、検索対象の行に注釈を手入力して作成しました。作品の上に絵を描くのは楽しいことですが、数十枚の画像から数千枚の画像に変えていくと面倒な作業になります。行を見つけるプロセスを自動化したいと思っていました。
これらの航空画像で、openCv の Canny Edge 検出アルゴリズムのような従来の線検出アルゴリズムを試しましたが、非常に不連続の線セグメントが表示されるか、しきい値が緩すぎると大量の不要な線が表示されることがわかりました。また、良い結果を得るためのしきい値が画像セットごとに異なるため、管理なしで一貫した良好な線のセットを見つけるアルゴリズムが必要でした。
私は、gPb(PDF)などの最近のアルゴリズムを含むさまざまなライン検出アルゴリズムを試しました。このアルゴリズムでは素晴らしい結果が得られましたが、1 枚の画像の実行に数分かかっていました。最終的には、openCV が付属しているアルゴリズムである Structured Forest エッジ検出に決めました。
優れた「線の画像」ができた後でも、実際に線を取得し、個々の線を特定する、つまり、このラスターデータを取得してベクター化する方法はまだ残っていました。imageJ は、コンピュータ ビジョンの問題を調べるときによく調査します。imageJ は、科学者や研究者が使用するオープンソースの Java ベースの画像処理環境で、プラグインの健全なエコシステムを備えています。私は、リッジ検出というプラグインを見つけました。これは、輝度画像を取得して線分のセットに変換するために役立ちます。(補足として、この Matlab のエッジ検出とラベル付けのコードも有用でした)。
サーバーレス
また、マッチングと接続の手間がクライアント側で行われる、本質的にサーバーレスのデータ可視化アプリを実現できるか確認したいと考えました。私はいつも、クリエイティブ コーディングのための C++ フレームワークである openFrameworks で働いています。ただし、時折ある node プロジェクト以外にもサーバーサイドのコーディングはあまり行っていません。計算のすべてをクライアント側で行い、サーバーを JSON と画像データの提供にのみ使用することが可能かどうか知りたかったのです。
描画アプリケーションでは、マッチングが非常に手間のかかる処理になります。線を引く際は、数万本を超える線分の中から最も近いものを見つける必要があります。描画間の距離を計算するために、ドル ジェスチャー認識の指標を使用します。これ自体は多数の距離計算を行います。以前はスレッド化などのテクニックを使っていましたが、クライアント デバイス(スマートフォンを含む)でリアルタイムに機能させるには、より優れたものが必要でした。最近/最近傍探索のために指標ツリーを検討し、視点のポイントツリーを採用しました(JavaScript の実装)。バンテージ ポイント ツリーは基本的に一連のデータと距離指標から構築されます。新しいデータを取り込むと、最も近い値のリストがすぐに表示されます。スマートフォンで初めてこの絵を見た時は、この有利なポイントツリーの実装の大きなメリットの 1 つは、計算後にツリーを保存し、このツリーの計算にかかるコストを削減できることです。
サーバーなしで動作させるうえでのもう一つの課題は、データをモバイル デバイスに読み込ませることです。描画の場合、ツリーと線分セグメントのデータが 12 MB を超え、画像が非常に大きいため、高速でレスポンシブなエクスペリエンスを目指しました。目標は、ダウンロードを小さく抑えることでした。私たちの解決策はデータを段階的に読み込むことでした。描画アプリでは、バンテージ ポイント ツリー データセットを 5 つの部分に分割し、アプリが最初のチャンクを読み込むだけで、その後 10 秒ごとにバックグラウンドで別のデータ チャンクを読み込むため、基本的には、使用開始から 1 分間はアプリの使い勝手が向上していきます。ドラッグアプリでは、ドラッグすると新しい画像がバックグラウンドで読み込まれるように、画像をキャッシュする処理も行われていました。
最後に、予想以上に困難だと感じたのは、両方のアプリにプリローダーを作成することでした。そのため、データの読み込みが問題なく行われるように初期遅延が発生します。ajax リクエストで progress コールバックを使用し、pixi.js 側では非同期で読み込まれる画像が実際に読み込まれていることをチェックし、それを使用してプリロード メッセージを動作させました。
接続中の回線
ドラッグについては、エッジ検出で見つけた線から無限の線を作成します。最初のステップでは、ライン検出アルゴリズムからラインをフィルタし、1 つのエッジで始まり、他の 3 つのエッジのいずれかで終わる長いラインを特定します。
長い線(より正確に言うと、連結された点の集合であるポリライン)を作成したら、これらの線を一連の角度変化に変換しました。通常、ポリラインを点の集合と考えると、点 a が点 c に接続された点 b に接続されます。その代わりに、線を角度の変化として扱うことができます。前進して一定量回転し、前進して一定量回転します。これを視覚化する方法としては、ワイヤーを曲げるマシンで、ワイヤーを押し出し、回転させて回転します。この絵の形は向きを変えて作られています。
直線を点ではなく角度の変化とみなすと、線を 1 本の大きな線にまとめ、不連続の点を減らすほうが簡単です。基本的に、点をつなぎ合わせるのではなく、相対的な角度の変化を追加することになります。線を追加するには、メインラインの現在の角度を image0 して、追加する線の相対的な変化を追加します。
ちなみに、私は線を芸術的利用のために角度の変更に変換するこの手法を使用しました。線をカールしてカール解除する方法と同じように、描画を「アンカール」できます。例: one、two、three
この角度の計算により、ドラッグしながらラインをステアリングできます。メインアングルが希望の位置からどの程度外れているかを計算し、ラインを正しい方向に向けるために最も有用な画像を探します。相対的に考えることがすべてです。
「プロジェクトに参加できて本当に楽しかった」と言います。データ アート チームからのご連絡をありがとうございます。アーティストとして、このような魅力的なデータセットの使用をお願いできることはとても喜ばしいことです。いかがでしたか。