遠藤諭のプログラミング+日記 第195回
最新AIの無料枠を使ってHDDの奥に眠る「あの1枚」をAIが発掘する方法
Googleフォトが「カツカレー」を見つけてくれないので「画像さがす君」を作ってみた
2025年08月04日 10時30分更新
Googleフォトは「カツカレー」を知らない
Googleフォトの検索機能は、単語や撮影年月日などで探せるのでとても便利だ。しかし、少し凝った内容や複雑なニュアンスで画像を探そうとすると、まったくヒットしない。たとえば、私は数えきれないくらいカツカレーを食べて写真をGoogleフォトにあげているはずだが、Googleフォトで「カツカレー」と検索した結果は、次の画面のようなものだった。
ここで重大なポイントは、肝心のカツカレーそのものの写真が1点も出てこないことである。これはきわめて単純な例で、たとえば、「オレンジ色の車の前に人が立っている写真」とか「唐辛子の入った飲物」といった、複数の要素や情景を組み合わせた検索にはほんど役に立たない。
しかも、単純なキーワードで検索した場合は、今度はヒット数が多すぎて、延々とスクロールして目を凝らして探す羽目になる。自分が本当に見たい画像にたどり着くまでに、何十回も追加ロードを繰り返すと時間もかかってしまう。
そこで、今どきAIはとっても賢くなっているんだから、それを使ってGoogleフォト的な検索で生成AIのパフォーマンスを生かしたソフトウェアを書いてみることにした。それが、「画像さがす君」(Windows版、およびMac版)である。
最新AIが生成する画像の説明文が使える
「画像さがす君」は、パソコンの中にあるたくさんの画像を、AIの力で簡単に探し出せるツールだ。たとえば「猫」「青い空」「夕焼け」など、言葉で検索すると、その内容に合った画像をすぐに見つけてくれる。しかも、Googleフォトでは、まったく役に立たなかった「カツカレー」の検索も、次のような検索結果となる。
ご覧のように旨そうなカツカレーの写真のオンパレードである! こんな結果になることは、その原理からすればしごく当たり前である。このプログラムの中では、GoogleのAI「Gemini 2.5 Flash-Lite」が生成した画像の説明文のテキスト検索と、その説明文から計算した「コサイン類似度」という指標を組み合わせている。つまり、画像を「言葉」と「数字(ベクトル)」で整理して、あとから言葉で検索できるようにしているのだ。
このシステムの最大の特徴は、Geminiが生成する非常に詳細で柔軟な画像説明文にある。たとえば、以下のような写真が私のHDDに入っている。
この写真に対して、GoogleのAIが自動生成した説明文(キャプション)は、次のようなものである。
建物正面の緑色の部分に掲げられた大きなメニュー看板を、二人の人物が眺めている様子を捉えた写真。メニュー看板には、料理の写真や「黒毛和牛」といった文字が多く表示されている。左側の人物は黒っぽい服装で、帽子をかぶっている。右側の人物は緑色のコートを着ている。建物の壁面はオレンジ色で、同様に縦にライトが照射されている。空は暗く、人工的な光が中心の色調となっている。
あるいは、次のような写真も私のHDDの中に入っている(食べ物や風景や仕事に関係する写真が多い)。
これに対する説明文は、次のようなものが生成されていた。
グラスに入った氷に、唐辛子を一本落とそうとしている指先が写っています。グラスと氷の冷たさと、唐辛子の鮮やかな赤が対照的です。
こんな簡単な写真なのに、Googleフォトでは「唐辛子」と検索しても「唐辛子 グラス」と検索しても出てこない。そもそも、Googleフォトは、物体の認識しかしないはずなのに、それにも十分に答えてくれない。それに対して、画像さがす君で検索すると「唐辛子とグラス」という検索語で、この写真がいちばん最初にでてくる。
しかも、Google のAIが生成した説明文をみると「画像さがす君」では、「落そうとしている」とか「冷たさと赤が対照的」といった言葉が入っていることに注目してほしい。物体認識以外に、「気分」や「ようす」も検索対象にすることができるわけだ。
そこで、「美味しそうな」と指定して検索した結果が次の写真である。本当に、美味しそうな料理の写真がずらりと出てきた。もちろん、Googleフォトではこのキーワードでは「一致する結果はありません/似た言葉やより一般的なキーワードで検索してみてください」と冷たくあしらわれるだけである。
仕事などで「画像さがす君」が威力を発揮しているのは、「壁にパネルが並んでいる写真」というような漠然としたものを探したいときである。「たしか撮った写真にあったはず」みたいなケースである。次のような写真だ。
Googleフォトでやってみると「壁 パネル」でも、「壁にパネルが並んでいる」でも、以下のように見つからない。看板やパッケージなどの大きな文字ならテキストで探せることもあるが、この写真ではパネル内のタイトル文字(たとえば「歴史の証人」)などでも探せない。
それに対して「画像さがす君」なら、指示どおりに過去撮影した「壁にパネルが並んだ写真」が、このようにリストアップされる。
なお、画像さがす君の結果画面のサムネイルかファイル名をクリックするとオリジナル画像が新しいタブで表示されるようになっている。必要に応じて保存などもできるようになっている。
手前みそだが、Googleフォトも引き続き使っているものの(50万枚以上がアップロードされている)、過去1年ほどの写真は画像さがす君で探してとても便利に使っている。
「画像さがす君」の使い方
1.APIキー取得と実行形式の入手
画像さがす君を使うには、まず、GeminiのAPIキーを取得する必要がある。「Google AI Studio」(https://aistudio.google.com/)にアクセスして、APIキーを生成、これを、環境変数にセットする。セットする環境変数は「GEMINI_API_KEY」だ。
次に、GitHubから「画像さがす君」の実行形式を入手する(https://github.com/hortense667/GazoSagasu)。正確には、画面右サイドの「Release」(https://github.com/hortense667/GazoSagasu/releases)にWindows版とMac版があるので、ダンウンロードする。
2.画像辞書の作成(generate)
次に、ダウンロードした「画像さがす君」(実行型式はLocalAIImageSearch)を使って、ハードディスクの中に処理対象としたい画像ファイルから、画像の辞書ともいえるjsonファイル(local_image_embeddings.json)を生成する。
GeminiのAPIキーには無料枠があり、Gemini 2.5 Flash-Lite」に関しては、1日1000件までのリクエスト、1分間のトークン数が250,000、1分あたりのリクエスト数10件が可能となっている(あくまでこの記事を書いている時点=変更になる可能性があるので十分に注意のこと)。
画像さがす君では、ここが技術的にはキモなのだが、無料枠内でも1日に数千枚から最大1万枚近い画像を処理できる設計になっている。
やり方は、検索対象としたファイルの入っているフォルダに移動して、コマンプロンプトから次のように入力するだけである(LocalAIImageSearch.exeをこのフォルダにコピーして置いた場合=パスが通れば別フォルダでもよい)。Mac版の実行形式名は `LocalAIImageSearch_Mac`(以降のコマンド例はWindows版のものだが、Mac版でもターミナルから同様に実行してほしい)。
対象とする画像ファイルとは、'*.jpg', '*.jpeg', '*.png', '*.gif', '*.bmp', '*.webp'である。
>LocalAIImageSearch generate
最初は、有料契約していないGemini APIキーで使ってもらうのがお勧めである。何かの間違いで課金される心配がないし、自分があつかう画像のファイルサイズによってどの程度の課金になるか分かってから有料契約しても遅くないからだ。上記のコマンドを実行すると、ディレクトリ内の画像に対して辞書を作る処理をはじめるが、APIの無料枠の範囲で処理を終わるようになっている。
画像処理枚数を指定して実行する場合は、パラメーターで数値を与えるようになっている。
> LocalAIImageSearch generate 500
比較的重要な注意点として、Dropboxなどを使われている場合、処理対象とする画像ファイルや関係するjsonファイルはオフラインにしておくことが条件となる。画像の辞書ファイル(local_image_embeddings.json)の競合にも注意してほしい。
Gemini APIキーをすでに持っていて、有料契約している場合、1日のリクエスト制限数を超えて処理することもできる。上記のように処理枚数で指定してもよいし、0を指定するとそのディレクトリ以下にあるすべてのファイルについて一気に処理する。ただし、何かの理由(このプログラムのバグなど)でリクエスト数が大きくなる可能性もありうる。有料契約で使われる人は、あくまで自己責任で動かしていただきたい。
なお、1日のAPIのリクエスト回数は、gemini_daily_usage.jsonというファイルで管理している。1日のうちに他のディレクトリでも画像さがす君を使った場合には、別の計算となるので注意してほしい。なお、1分間のトークン数や1分間のリクエスト数が制限を超えそうになった場合には、1分を経過するまで待ち状態となる。
なお、実行に要する時間だが環境しだいである。Intel Core i5-6400T 2.20GHzというひとむかし前の環境で、128枚の辞書作成に要した時間は4分19秒だった。
3.検索(search)
こうやって、画像の辞書作成が終わったら、あとは検索に使うだけである。使い方は簡単だ。
> LocalAIImageSearch search "カツカレー"
この状態では100件まで結果をウェブを起動して表示する。この件数を増やしたい場合には、次のように表示枚数を指定する。
> LocalAIImageSearch search "香港の風景" 300
検索すると、前述のようにWeb画面にサムネイルで結果が表示され、画像かファイル名をクリックするとオリジナル画像が表示される。なお、Macでは、これらの処理をセキュリティの関係から一時的にローカルサーバーを立てて行っている。必要な画像を探す作業が終わったらターミナルからCtrl-Cで終わってほしい。
検索に要する時間も環境しだいだが、Intel Core i5-6400T 2.20GHzで、1分程度だった。今どきのテキストサーチのスピードと本来高速なコサイン類似度ではあるが、言い訳をすると、PyInstallerによる実行型式であることによるオーバーヘッドが大きい。
「画像さがす君」に苦手なこと
「画像さがす君」で実現できたことを中心に触れたが、簡単な検索対象ならGoogleフォトのほうが見つけやすいはずだ。現在の「画像さがす君」はコマンドプロンプトから叩くようになっていて、それだけでも面倒というものだ(UI版は作成予定)。
Googleフォトでは、同じ人物を認識して分類してくれたり、年月日で検索したりできるが、「画像さがす君」では、一切そうしたことには対応していない(日付はすぐにできるがGoogleフォトで探せばいいでしょう)。
また、今のところコードを公開していないが、検索結果は、テキストとの一致度と、AIが判断した内容の類似度を組み合わせてスコアリングし、総合点の高い順に表示している。そのあたりのチューニングは、まだ調整の余地が十分にある。というのは、検索語によっては、まったくバラバラな理由の見えない結果になることがある。
最後に、やや繰り返しになるが基本的にGemini APIキーは有料契約していない使い方を想定して作ったものだ。従量課金となる使い方も説明したが、お金をかけても気にならない人向けである。課金の単価を見るとそれほど心配するような額ではないのだが、規模にもよるというものだ。
画像の辞書の生成(generate)を大量にする場合には、事前に、以下の公式情報を確認しておくのがよいだろう。
Gemini Developer API の料金
https://ai.google.dev/gemini-api/docs/pricing?hl=ja
レート制限
https://ai.google.dev/gemini-api/docs/rate-limits?hl=ja
自身のAPIキーの課金の詳細
https://aistudio.google.com/usage
なお、画像データをGemini APIに解析してもらっているわけなので、学習に使われることを嫌う人もいるかもしれない。画像データはGoogleのAIモデルの学習データとして使われることはないとしているが、変更になる可能性がある。特定の条件下でのデータの使用に関する例外もある。気になる人は、以下をご覧いただきたい。
Gemini APIの利用規約
https://ai.google.dev/gemini-api/terms?hl=ja
例によって、このソフトウェアの利用によって生じる損害について一切の責任を負うものではないことを了承いただきたい。また、このソフトウェアの使用方法などに関する質問に答えることや動作不備についてのサポートも対応できない。
遠藤(えんどうさとし)
ZEN大学客員教授。ZEN大学 コンテンツ産業史アーカイブ研究センター研究員。プログラマを経て1985年に株式会社アスキー入社。月刊アスキー編集長、株式会社アスキー取締役、株式会社角川アスキー総合研究所取締役などを経て、2025年より現職。DCAJ主催のCTIP(コンテンツテクノロジー・イノベーションプログラム)の審査委員長、ISCA(INTERNATIONAL STUDENTS CREATIVE AWARD)2025の審査員、MITテクノロジーレビュー日本版 アドバイザーなどを務める。2025年7月より角川武蔵野ミュージアムにて開催中の「電脳秘宝館 マイコン展」で解説を担当。趣味は、カレーと錯視と文具作り。2018、2019年に日本基礎心理学会の「錯視・錯聴コンテスト」で2年連続入賞。その錯視を利用したアニメーションフローティングペンを作っている。著書に、『計算機屋かく戦えり』(アスキー)、『頭のいい人が変えた10の世界 NHK ITホワイトボックス』(共著、講談社)など。
X:@hortense667
Bluesky:https://bsky.app/profile/hortense667.bsky.social
mixi2:@hortense667

この連載の記事
-
第201回
プログラミング+
秋葉原・万世書房と薄い本のお話 -
第200回
プログラミング+
11/2(日)ガジェットフリマと豪華ゲストによる変態ガジェットアワードが東京ポートシティ竹芝で開催 -
第199回
プログラミング+
現役“中学生”によって「変態ガジェットプロジェクト」が始動!! -
第198回
プログラミング+
「電脳秘宝館 マイコン展」で、あのマイコン、このパソコン、その原点を訪ねよう -
第197回
プログラミング+
伝説の玩具「アームトロン」に学ぶ——“1モーター×機械式ロジック”が切り拓いたロボット設計 -
第196回
プログラミング+
2025年問題とVHS 55,000本の運命――映画『キムズビデオ』 -
第194回
プログラミング+
長いプロンプト、どこでも履歴から呼び出して手直しして使う――「どこでもロングプロンプト」という解決策 -
第193回
プログラミング+
IME感覚で生成AIを使う――今度は無料の「どこでもGemini」 -
第192回
プログラミング+
「どこでもGPT」で、Gmail、Word、Slack、なんでもAI化する方法 -
第191回
プログラミング+
ティム・オライリー曰く、ソフトウェア開発者がAIに職を奪われることはない - この連載の一覧へ












