はじめに
第1章 類似画像検索の基本
第2章 Colaboratory
第3章 NumPyとTensorFlow
第4章 風景類似画像検索システム
第5章 顔類似画像検索システム
第6章 近似最近傍探索
第7章 深層距離学習
おわりに
本書の目的は、PythonとTensorFlowを使って、基本的な類似画像検索システムの作り方を理解すること、また実際に作ってみることです。
NumPyやTensorFlowの基本について説明した後、風景の類似画像検索システムと顔の類似画像検索システムを作ります。また、近似最近傍探索や深層距離学習などについても説明します。
類似画像検索技術の全体像が分かることを目的にしているため、技術的詳細などについては扱っていない部分もあります。あらかじめご了承ください。
本書では次のような人を対象としています。
・類似画像検索技術に興味のある人
・NumPy、TensorFlowを使ったプログラムを作ってみたい人
本書を読むにあたり、次のような知識が必要となります。
・行列やベクトルなどの数学知識がある人
・Pythonの基礎文法
本書に関する質問やお問い合わせは、次のページまでお願いします。正誤表とサンプルコードもここにあります。
・URL: https://github.com/sat0b/python-tensorflow-book
本書に記載されている会社名、製品名などは、各社の登録商標、商標、商品名です。会社名、製品名について、本文中では©︎、®️、™️マークなどは表示していません。
本書に記載された内容は、情報の提供のみを目的としています。したがって、本書を用いた開発、製作、運用は、必ずご自身の責任と判断によって行ってください。これらの情報による開発、製作、運用の結果について、著者はいかなる責任も負いません。
本書籍は、技術系同人誌即売会「技術書典」で頒布されたものを底本としています。
本章では、類似画像検索の基本について説明します。まず、類似画像検索とはどういうものなのかを説明し、検索システムとしてよく使われている全文検索との違いや、類似画像検索の基本的な技術要素について説明します。
情報技術の進歩に伴って、私たちは溢れるような情報の海からほしい情報を見つける必要が出てきました。Webサイトの情報から、SNSへの投稿、写真や動画、ネットでの買い物、数多くの情報がインターネット上に投稿されています。人が管理していたら、とても手に負えないような情報の量です。現代では、このようなビッグデータの中から情報をうまく見つけ出す必要があります。大量のデータ集合から目的のデータを見つけ出すことを検索と呼びます。
本書では、検索の中でも特に画像をクエリとして画像検索する類似画像検索について解説します。類似画像検索について説明する前に、まず通常のテキストによる検索である全文検索について説明します。
テキストを用いて、複数のドキュメントから特定のキーワードが含まれる文書を見つけ出すことを全文検索と呼びます。全文とはドキュメント内のすべての文字のことを指しており、タイトルやファイル名だけで探すのではなく、ドキュメント内のすべての文字を見て探し出すことを意味しています。
全文検索の例としては、Google検索が想像しやすいです。Google検索では、膨大な量であるはずのWeb全体のコンテンツで検索しているにもかかわらず、一瞬で検索結果が表示されます。なぜこのような速度で表示できるのかというと、事前にインデックスを構築しているからです。インデックスについては「1.2 類似画像検索技術の基本」で詳しく説明します。
画像検索とは、複数の画像集合の中からほしい画像を見つけ出すことです。特に画像を用いて似た画像を見つけ出すことを、類似画像検索と呼びます。
類似画像検索は、画像内の雰囲気や模様など、テキストでは表現しにくい要素を検索できます。たとえば、ファッション雑誌で素敵なTシャツを見つけて購入したくなったとします。服に詳しければ、ブランドや色合い、デザインなどを言語化し、全文検索でほしいTシャツを探し出すことが可能です。しかし、模様や色合いなどをテキストに落とし込んで検索するのは少々たいへんですし、そもそもTシャツの説明文にビジュアルを正確に言語化した文言が書かれているとは限りません。全文検索では、テキスト化されていないと検索できません。
たとえば、カメラ写真を撮って撮影画像をクエリとして検索したり、画像URLを元に似たような画像を検索できれば、ずいぶんとビジュアルの検索が楽になります。見た目が重要なコンテンツの場合は、直接見た目で検索できる類似画像検索の方が、全文検索よりも優れているケースがあります。
類似画像検索は、クエリ画像に対して似た画像を検索結果で返します。これを実現するためには、ふたつの画像がどれくらい似ているかを数値化する必要があります。この数値化を行うために、似た画像であるほど距離が近いベクトルに変換し、ベクトルどうしの距離を計算する方法があります。
図1.1は画像をベクトルに変換したイメージ図です。画像Aと画像Bは似た画像で、画像Cは相対的にあまり似ていないとします。空間内の距離が近くなるようなベクトルに変換できれば、任意の画像がどの画像と近いかわかりますし、似た画像を順にN件提示できるようなります。このイメージ図は二次元ベクトルですが、実際には数百から数千の多次元ベクトルとなります。
この本では、似ている画像であるほど近くなるベクトルを作るのに、畳み込みニューラルネットワークを利用します。このベクトル化の処理を特徴抽出と呼びます。特徴抽出は、特徴量空間への射影と考えられることから、埋め込み(embedding)とも呼ばれます。特徴抽出の詳細については4章や5章、7章で解説します。
検索は、全走査による検索とインデックスによる検索に分類できます。全走査による検索は、毎回すべてのドキュメントの中身を見て、クエリのキーワードに合致しているかチェックする方法です。インデックスによる検索は、事前に検索インデックスを構築することで高速化されます。たとえば、本で特定のキーワードが出ているページを探したいとき、全ページ確認してキーワードが出現するページを探す方法が全走査による検索、本の索引ページからあるキーワードが何ページに出ているかを探す方法がインデックスによる検索といえます。
全走査による検索は事前の準備が必要ないため、規模が小さいデータであればこの方法が優れています。一方、インデックスによる検索は、全走査する場合に比べて高速に検索ができますが、インデックスを構築する手間がかかります。また、ドキュメントが更新されるたびに、インデックスを更新する必要があります。
上記の本の例は全文検索の例として紹介しましたが、類似画像検索も同様のことがいえ、データ数が多くなればなるほど検索が遅くなります。そのため、類似画像検索もデータ数が少なければ全走査でもいいのですが、データ数が増えたときはインデックスを構築する必要があります。これは6章の近似最近傍探索で解説します。