9月に開催される文学フリマに向け、文庫サイズのエッセイ本を製作する作業を進めています。その中で、去年1年間のうちに撮りためてしまった膨大な画像とビデオの中から、本に掲載するための使えそうな写真を選定し、切り出す作業が必要になりました。
もともと私の頭の中には、「鏡越しに撮影した家族写真」や「家族全員が写っている集合写真」といった、特定の文脈を持つ写真を過去のデータから抽出したいというニーズがありました。しかし、それは難易度の高い応用編です。今回はまず、リノベーションの記録として極めて重要な「漆喰」と「タイル貼り」の施工風景を中心に抜き出すことを目標としました。
ハードディスク全体には、ゆくゆく処理することになる10万枚ものデータが眠っていますが、現段階でのターゲットとなる去年1年間の施工写真は、正確な枚数は分かりませんがおよそ2,000枚ほどあるはずです。この二千枚の中から目的の写真を選定しなければなりません。
最初はスマートな方法を考え、Googleフォトにすべてのデータを放り込んでクラウドの検索機能に頼ろうと試みました。クラウド環境のインデックス作成能力は非常に魅力的だからです。ところが、データ容量の重さは想像以上で、同期完了までの予想時間として画面に「残り3日」という数字が表示されてしまいました。今回の作業スケジュールとネットワーク負荷を考慮し、このクラウド計画は一旦保留することにしました。
クラウドに任せるのが難しければ、手元のローカル環境で処理を完了させる仕組みを作るしかありません。
512次元の空間で起こったテキスト検索の誤解
手元で効率よく目的の画像を抽出するため、画像を「ベクトル化」して検索する手法を導入してみることにしました。これは、画像を512個 of 概念の切り口(512次元)に細分化して数値化し、その特徴量の距離を比較して仕分ける技術です。
システムを組み上げ、まずは検索窓に「漆喰」「タイル施工」と言葉を入力して検索を走らせてみました。言葉という扱いやすい入り口から、目的の画像へアクセスできることを期待してのことです。
しかし、返ってきた結果の出来栄えは、体感で「20点」といったところでした。画面には、探している作業風景とは関係のないただの白い壁や、用途の分からない木材の破片が並び、思わずため息が出ました。
この失敗から、AIの検索構造における性質が見えてきました。AIは、テキストという抽象的な言葉を入力した場合、質の良い手本(インプット)が与えられていないと、512次元の空間の中で検索の軸を簡単に誤ってしまうのです。「質の悪い情報を入れるとミスをする」というAIの特性に直面し、言葉から特徴量を推測させるアプローチを断念しました。代わりに、検索のキーとなる「手本となる正解画像」を直接指定し、視覚的な特徴量が近いものを引き当てる「画像から画像を探す」類似検索の手法へ切り替えることにしました。
ギガ制限の瀬戸際と、追加課金への冷や汗
手本となる画像を直接指定する方式へ切り替えたことで、別の現実的な課題が浮上しました。
もともと日常生活の様々な事情が重なり、今月のスマートフォンのパケット通信量は、月末までギガが持つかどうか本当にギリギリの綱渡り状態で、必死に耐えているところだったのです。ここでうっかり、手本を探すために高解像度の重い画像データを何度もリモートでやり取りして上限を突破してしまえば、追加のパケット購入として今月さらに2〜3千円の手痛い出費が発生してしまいます。
ただでさえ文庫本の製作で色々と物入りなこの時期に、無駄な生活費の上乗せは絶対に避けたいところでした。想像するだけで胃がツンと痛むような瀬戸際の状況のなか、通信量を極限まで抑えつつ、自宅にある巨大な画像データベースへアクセスする手段がどうしても必要でした。
Tailscaleと数キロバイトの極小サムネイルによる自作の治具
そこで着目したのが、自宅のサーバー環境で常時起動させている暗号化ネットワーク「Tailscale」の存在です。Tailscaleを利用すれば、LANの外からでも複雑な設定なしに、自宅のメインPCへ安全かつ直接アクセスできます。
この通信基盤のうえに、パケット消費量を極限まで抑えるための「パケット節約型画像ビューアー」を自作することにしました。
通常であれば数メガバイトある高解像度写真を、システム側で事前に1枚あたりわずか数キロバイトの極小ミニサムネイルへ一括圧縮します。その軽量化した画像を、ブラウザ上にタイル状にびっしりと敷き詰めて表示するシンプルな仕組みです。
これならば、モバイル回線で大量の画像を読み込んでもパケットの消費はごく微量に留まります。画面いっぱいに並んだ数キロバイトの極小サムネイルを見つめながら、「この漆喰の写真と、このタイル貼りの写真を参考にしてほしい」と、AIに対して手本となる画像をピンポイントで指定できる環境が整いました。
画像で画像を探す。ベクトル照合が導き出した正解
準備した手本画像のベクトルデータをベースにし、ローカル環境のデータベースに対して再び検索をかけさせました。テキストではなく、512次元の数値データのまとまりそのものを照合させる処理です。
再検索の結果が画面に返ってきた瞬間、思わず声が出ました。
「漆喰」の手本画像に対しては、まったく同じ日の同じ施工箇所を、アングルを少しだけ変えて撮影した前後の写真群が完璧な精度で整列していました。「タイル貼り」のクエリに対しても、表面の質感や目地の凹凸感が極めて近い「正解」の写真がピンポイントで引き当てられています。
画面に整然と並んだ写真を見て、「ほぼ思い通りの画像が得られた。これは実戦で使える」という明確な手応えを得ることができました。抽象的なテキストを介さず、視覚特徴の数値データを直接ぶつけることで、512次元の空間が本来の性能を発揮した瞬間でした。
手元の環境で帳尻を合わせるものづくりの手応え
当初予定していた、クラウドにデータを預けてスマートに処理する計画は同期時間の問題から保留となりました。パケット代の上限超過によって身銭を切り、最初のテキスト検索では20点の出来で途方に暮れるといった回り道も経験しました。
しかし最終的には、自宅で動いていたTailscaleと、数キロバイトに削り落とした極小サムネイルという手元の要素を繋ぎ合わせることで、2,000枚の写真の混沌から必要な記憶を的確に釣り上げるための実用的な道具を作り出すことができました。
また、付随的に進めた「Tailscaleを経由した超軽量Webプレビューでの確認作業」は、単なる一時的なパケット代の節約に留まらない、思わぬ収穫でした。セキュアな暗号化通信のうえで極小の画像をやり取りするこの方法は、帯域制限や端末スペックに制約がある「シンクライアント環境」においても、極めて軽快かつ安全に成果物をリモートでレビューする手法として、今後の別の開発や運用の場面でも十分に活用していける高い手応えを感じています。
完成されたシステムをそのまま使うのではなく、目の前にある制限や手持ちの環境に合わせて、帳尻を合わせるための治具を自ら組み立てていく。その泥臭い試行錯誤のプロセスの中にこそ、ものづくりの確かな手応えと面白さが潜んでいるのだと実感しています。仕上がった写真群を手に、これから文庫本の誌面構成の作業を静かに進めていく予定です。