GEMINI LABEN
FLASH — Gemini 3.5 Flashが一般提供(GA)に。エージェントやコーディングで持続的なフロンティア性能をうたいますTIER — 3.1 Pro・3.1 Flash-Liteといった新ティアがアプリ・クラウド・業務ツールへ順次展開されていますPIXEL — 6月Pixel DropでGeminiの楽曲生成、AIによる動画・音楽作成、画面録画リアクションが追加されましたOMNI — 生成のGemini Omni、推論の3 Deep Think、調査のDeep Researchが並行して強化されていますLIVE — Gemini Liveのライブやりとりが、Android・検索・YouTube・各Googleアプリへ広がっていますULTRA — Google AI Ultraは最上位アクセス・Deep Research・Veo 3動画・100万トークン文脈を提供しますFLASH — Gemini 3.5 Flashが一般提供(GA)に。エージェントやコーディングで持続的なフロンティア性能をうたいますTIER — 3.1 Pro・3.1 Flash-Liteといった新ティアがアプリ・クラウド・業務ツールへ順次展開されていますPIXEL — 6月Pixel DropでGeminiの楽曲生成、AIによる動画・音楽作成、画面録画リアクションが追加されましたOMNI — 生成のGemini Omni、推論の3 Deep Think、調査のDeep Researchが並行して強化されていますLIVE — Gemini Liveのライブやりとりが、Android・検索・YouTube・各Googleアプリへ広がっていますULTRA — Google AI Ultraは最上位アクセス・Deep Research・Veo 3動画・100万トークン文脈を提供します
記事一覧/API / SDK
API / SDK/2026-06-19上級

見た目がほぼ同じ画像を公開前に弾く — gemini-embedding-2 で近重複ゲートを作る

画像検索ではなく『近重複の除去』に gemini-embedding-2 のマルチモーダル埋め込みを使います。ベクトル化・クラスタリング・公開前ゲートの動くコードと、しきい値の決め方をまとめました。

gemini85gemini-embedding-23embeddings11image5deduplication

プレミアム記事

複数サイトを運用していると、画像アセットは「足りない」より「似たものが増えすぎる」ことの方が後から効いてきます。私自身、壁紙アプリと4つのブログのOGP画像を個人開発で抱えていて、半年ほど前から「この淡いブルーの抽象背景、前にも公開した気がする」と手が止まる場面が増えました。1枚ずつ目で確かめるのは、枚数が三桁を超えたあたりで現実的でなくなります。

2026年6月に File Search が gemini-embedding-2 のマルチモーダル検索に対応したことで、この問題に素直な道具が増えました。ただ、ここで扱いたいのは「検索」ではありません。似た画像を探して引っ張ってくるのではなく、似すぎている画像を公開前に弾くことです。この2つは目的も実装も別物で、混同するとゲートが素通りします。

なぜ「画像検索」では近重複を弾けないのか

検索(retrieval)は「クエリに近い上位N件を返す」処理です。返ってくるのは常に何かしらの結果で、しきい値は緩くても成立します。一方、近重複の除去(near-duplicate detection)が必要とするのは「ある2枚が、実質的に同じと言えるほど近いか」という二値の判定です。

retrieval をそのまま転用すると、「最も近い1件」は必ず返るので、まったく別の画像同士でも"似ている候補"として並びます。逆に、しきい値を検索向けに緩めたままだと、本当に弾きたい色違い・トリミング違いを取りこぼします。近重複ゲートでは、スコアそのものを判定境界として使う設計に切り替える必要があります。

私はこの違いを最初は軽視していて、File Search の検索結果の上位を見て「重複なし」と判断していました。実際には、似た構図のグラデーション背景が3系統に膨らんでいて、検索の文脈では別々のヒットとして扱われていただけでした。

画像をベクトル化する

まず各画像を gemini-embedding-2 で埋め込みベクトルに変換します。マルチモーダル対応なので、テキストと同じエンドポイントに画像パートを渡せます。

import os
from pathlib import Path
from google import genai
from google.genai import types
 
client = genai.Client(api_key="YOUR_API_KEY")
 
EMBED_MODEL = "gemini-embedding-2"  # マルチモーダル対応(2026-06 GA)
 
def embed_image(path: Path) -> list[float]:
    data = path.read_bytes()
    mime = "image/png" if path.suffix.lower() == ".png" else "image/jpeg"
    resp = client.models.embed_content(
        model=EMBED_MODEL,
        contents=[types.Part.from_bytes(data=data, mime_type=mime)],
    )
    return resp.embeddings[0].values

ベクトルはあらかじめ L2 正規化しておくと、内積がそのままコサイン類似度になり、後段の計算が単純になります。

import math
 
def l2_normalize(v):
    norm = math.sqrt(sum(x * x for x in v)) or 1.0
    return [x / norm for x in v]
 
def cosine(a, b):
    # a, b は正規化済みベクトル → 内積がコサイン類似度
    return sum(x * y for x, y in zip(a, b))
 
def build_index(paths):
    index = {}
    for p in paths:
        index[str(p)] = l2_normalize(embed_image(p))
    return index

埋め込みは1枚ごとにAPIを叩くため、アセットが増えると素朴な実装では毎回コストがかかります。私の運用では、ベクトルをファイルのハッシュをキーにしてローカルに保存し、内容が変わっていない画像は再埋め込みしないようにしています。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
アセットが増えるたびに『これ前にも出した気がする』と迷っていた人が、公開前に近重複を自動で弾けるようになります
gemini-embedding-2 のマルチモーダル埋め込みで画像をベクトル化し、コサイン類似度としきい値クラスタリングで近重複だけを取り出す動くコードが手に入ります
しきい値をどう決め、トリミングや色違いをどう扱うかの落とし穴が分かり、複数サイトのOGP・壁紙アセットを破綻なく増やせるようになります
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Gemini Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

API / SDK2026-04-14
Gemini API Embedding × ベクトルDB完全比較: Pinecone・Qdrant・pgvector・Cloud Spannerを本番で使い分けるガイド
Gemini text-embedding-004でPinecone・Qdrant・pgvector・Cloud Spanner Vectorを実測比較。コスト・レイテンシ・実装難易度を完全網羅した本番ベクトルDB選択ガイド。
API / SDK2026-04-03
Gemini Embedding API × Pinecone でRAGシステムを本番構築する
Gemini Embedding APIとPineconeを組み合わせてRAGシステムを構築する手順を解説。インデックス設計からクエリ最適化、本番運用のコスト管理まで実践的なPythonコードで学べます。
API / SDK2026-03-29
Gemini Embeddings API で構築する本番環境セマンティック検索システム — 設計・実装・運用の全工程
Gemini Embeddings API を活用したセマンティック検索システムの設計から本番運用まで。ベクトルDB選定、リランキング、レコメンドエンジン、コスト最適化を実践コード付きで徹底解説。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →