画像1枚でAIが場所を当てる？Gemini + Google Maps で作るリバースジオロケーションアプリ

# はじめに

こんにちは！ノベルワークスのザワッチです！

写真を見ただけでその場所がどこか分かる人、いますよね。

旅行好きの友人とか、地理に詳しい人とか。

ということで、今回は、**画像を1枚アップロードするだけで、AIが「ここは〇〇です！」って場所を特定してくれるWebアプリ**を作ってみました。

## なぜ作ったのか

きっかけは、友人から「この写真どこで撮ったか覚えてる？」って聞かれてわかんなかったこと。

既存のサービスや仕組みはあるのですが、もっと詳細な解析結果とか、地図上でのビジュアライゼーションとか、技術的な興味で自分で作ってみたくなりました。

最近のGoogle AI Studioでは、ぽいことはできるんですが、やっぱり自分でカスタマイズして作ってみたいと思いました。

# 作ったもの

「**ReverseGeo**」という名前で、画像から場所を逆算（リバースジオロケーション）するWebアプリを開発しました。

:::note info
GeoGuessrにインスピレーションをとても受けています
https://www.geoguessr.com
:::

## 基本的な流れ
1. カメラで撮影 or 画像をアップロード
2. Geminiが画像を解析
3. 緯度・経度・場所の説明を取得
Tokyo Station, Japan (35.6762, 139.6503)みたいに出る
4. Google Maps で位置をマーカー表示
5. 履歴を保存(DuckDB)

# 主な機能

## 様々なモードで画像解析
画像に映っている文字もOCRしてくれて、テキスト生成してくれるのでインサイトがすさまじいです。

- **Basic**: 画像→場所解析
- **Grounding**: 画像解析→検索クエリ生成→Web検索結果
- **Image Search**: 類似画像検索でランドマークを特定

これ、モードによって精度が全然違って、Groundingとかでは最新のニュースやWebの情報も参考にするので、「最近できた建物」とかもいける感じですね。

https://ai.google.dev/gemini-api/docs/image-understanding?hl=ja

https://ai.google.dev/gemini-api/docs/grounding?hl=ja&lang=python

https://ai.google.dev/gemini-api/docs/grounding/search-suggestions?hl=ja

## リアルタイム解析
WebRTCを使ってカメラ映像をリアルタイムで解析します。

100msごとにフレームをキャプチャするのですが、フレームレートとAPI呼び出し頻度のバランスが重要

あまり頻繁だとAPI制限に引っかかって、遅すぎるとリアルタイム感がなくなる。

100msごとというのが、Geminiと格闘した結果のベストバランスです。

https://ai.google.dev/gemini-api/docs/live?hl=ja#javascript

カメラを色々な方向に向けながら、リアルタイムで場所が変わっていくのを見るのは結構楽しいです。

## インタラクティブマップ
- Google Maps 2D/3D表示
- 検出した場所にマーカー表示
- 履歴の可視化
- ズーム・パン操作

3Dマップがかなりカッコいいです。特に都市部だと建物も立体的に表示されるので、臨場感があります。

JavascriptAPIで提供されていたので、Google Cloudのプロジェクトを作って、Google MapsAPIを有効化して、APIキーを発行しました。

https://developers.google.com/maps/documentation/javascript/reference/3d-map?hl=ja

## クライアントサイドで履歴管理
DuckDB WASMを使って、ブラウザ内で履歴データを管理。

こちらの記事でも使ったので、詳細はこちらに↓

https://qiita.com/zawatti/items/54ee3cff7e60c5b223c0

# デモ

トップ画面はこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478853/4716bcd0-5831-41cf-a20f-c92c675f5e07.png)



## 実際に試してみた結果

:::note warn
ライブモードでもやりたかったのですが、人も移っちゃうので今回は勘弁🥶

:::
　
- **東京駅**
流石です。
何もテキストないけど、東京駅と言えば見たいな画像なのでめっちゃ学習されてそう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478853/8e1aa303-1959-4fb6-a8cc-b8617b7876d0.png)

- **渋谷スクランブル交差点**
いいっすね！
やっぱり特徴的なのか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478853/079db620-36ce-41d7-9cf0-f69858131fa7.png)

- **エッフェル塔**
むしろ海外のほうがいっぱい学習されるので得意ですよね。
1秒くらいで出てきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478853/4627c356-57d1-4dbf-a27e-8b6185fb4e8a.png)

- **マチュピチュ**
さすがにきついかなと思いきや、難なくクリア。
出力の中の追加説明で勉強にもなった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478853/102b396d-fd14-4329-b047-fcd36dea422f.png)

- **天神橋筋商店街**
弊社のオフィス近くにある天神橋筋商店街、さすがに天下のGoogleでも日本の商店街までは網羅してないと思いきや、ほぼニアピン。
近くの学校の校庭を指してた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478853/1f88cdc3-d7ba-4c6b-826c-91503691c8a0.png)

- **グラングリーン大阪**
今年の春にできたグラングリーン大阪。さすがに新しすぎてAIも学習してないはず。
と思いきや、ちゃんと当ててきたって。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478853/53aa1aa9-8c9e-424c-afbb-0a8a1e0a95d0.png)

- **弊社にあるジムスペース**
建物内部はかなり特徴的じゃないと、安直な回答をしてしまう。
これだと、一見ただのジムのスペースとして認識してしまって、考えるのをやめてしまう。
AIに「こんなに簡単でいいのか」みたいな内省の仕組みがいりそうな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478853/4d503f28-a6fc-4238-9f9f-7cf9a0a7742c.png)

解析時間は大体2-5秒（モードによって異なる）で、思ったより当ててきた

最後に分析履歴の画面：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478853/888bcd3d-4f92-484f-a5ed-7c730b69757e.png)


# 使ってみて

## 画像理解能力改めてかなりすごい
Gemini 2.0 Flash の画像理解能力は本当にすごい。

特に印象的だったのは、「写真に写っている文字や看板も読み取って、それを手がかりに場所を特定する」という能力。人間の思考プロセスと似ていて、AIが本当に「見て理解している」感じがします。

入力画像の解像度がどんどん上がれば、瞳に映ったものから特定しそう


## ゲーム感覚みたいな楽しさ
AIこれやったらいけるかな？これは無理やろ！みたいなを一人でずっとやっててたんですが、めちゃ面白い。

## 改善したい点
### 精度のばらつき
場所によって精度にかなりばらつきがあります。有名な観光地は高精度ですが、住宅地とかだと「だいたいこの辺り」レベルになることも。

### ネットワーク依存
当然ですが、AIサービスに依存しているので、ネットワークが不安定だと使えません。

オフライン対応とかできたら面白そう。

山奥でサバイバルするときに使うとか（笑）別の目的になりそう

# おわりに
今回、Gemini 2.0 Flash を使って画像解析アプリを作ってみて、AIに対する新たな気付きを得ることができました。

数年前なら「夢の技術」だったことが、今では個人でも簡単に実装できるようになっているのは本当にすごいことだと思います。

読んでいただき、ありがとうございました！