0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

DINOv2で作る“なんでも似てる画像検索”──Colabで超カンタン実装

Posted at

はじめに

最近話題の自己教師あり学習モデル DINOv2 を使って、画像から似ている画像を探す検索システムをGoogle Colab上で動かしてみました。
文字で検索するのではなく、1枚の画像を入力(クエリ画像)すると、その特徴に近い画像を自動で見つけてくれる仕組みです。


DINOv2とは?

Meta(旧Facebook)が開発したビジョン基盤モデルで、自己教師あり学習によって事前学習されています。大きな特徴は次の通りです。
・汎用的な画像特徴量を抽出できる
ファインチューニングなしでも高品質な特徴ベクトルを生成可能。分類・検索・セグメンテーションなど幅広いタスクに使えます。
・ラベルなしデータでも学習できる
自己教師あり学習なので、大量の未ラベル画像を活かせます。
・マルチスケールでの利用が可能
軽量モデルから巨大モデルまで揃っており、Colabのような環境でも試せます。
・密な特徴(dense features)に強い
画像の部分ごとの表現が得られるので、単なる分類だけでなく、領域分割や類似領域探索にも応用可能です。

おすすめの用途

画像検索(類似度検索)
・今回実装した通り、1枚の画像を基準に似ている画像を探せます。
・商品検索(類似アイテム)、写真コレクション整理などに活用できます。
画像分類(小規模データでも高精度)
・特徴量を抽出して、k-NNやロジスティック回帰を組み合わせれば簡単に分類器を構築可能。
・少量のラベル付きデータでも精度が出やすいです。
セマンティックセグメンテーション
・部分ごとの特徴ベクトルをクラスタリングすることで、画像内の領域を分けることができます。
・人物と背景、動物と環境などを自動で切り分けられる可能性があります。
研究・応用分野
・医療画像の分析(異常部位検出)
・衛星画像解析(地形や森林の変化の自動検出)
・セキュリティカメラ映像の解析(異常検知や追跡)

手順

1. 環境準備
Colabに必要なライブラリをインストールします。
PyTorchやtimm、FAISSなどをまとめて入れることで、環境競合のエラーを避けました。

!pip install -U torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
!pip install -U timm faiss-cpu pillow tqdm

2. 画像のアップロード
ローカルから好きな画像を複数枚選んでColabにアップロードします。

from google.colab import files
import os

IMG_DIR = "/content/images"
os.makedirs(IMG_DIR, exist_ok=True)

uploaded = files.upload()
for filename, data in uploaded.items():
    with open(os.path.join(IMG_DIR, filename), "wb") as f:
        f.write(data)

3. DINOv2モデルをロード
Colabでも扱いやすい vit_base_patch14_dinov2 を利用しました。これで画像をベクトル(特徴量)に変換できます。

import timm, torch
device = "cuda" if torch.cuda.is_available() else "cpu"

model = timm.create_model("vit_base_patch14_dinov2.lvd142m", pretrained=True, num_classes=0).to(device).eval()

4. 画像をベクトル化
アップロードした全画像をまとめて埋め込み(特徴ベクトル)に変換しました。

from PIL import Image
from torch.utils.data import Dataset, DataLoader
import torch

class ImgDS(Dataset):
    def __init__(self, paths): self.paths = paths
    def __len__(self): return len(self.paths)
    def __getitem__(self, i):
        return transforms(Image.open(self.paths[i]).convert("RGB")), i

ここで得られたベクトルをFAISSに登録します。

5. FAISSで検索インデックスを作成

import faiss
vecs = embs.numpy().astype("float32")
index = faiss.IndexFlatIP(vecs.shape[1])
index.add(vecs)

6. クエリ画像で検索!
ここが一番面白いところです。
1枚の画像(クエリ画像)を入力すると、似ている画像がランキング形式で表示されます。

search_by_image("query.jpg", topk=5)

実際の結果

クエリに猫のイラストを入れると、猫の写真が上位にヒット!
今回のクエリ画像↓
クエリ.png
【上位ヒット】↓

  1. score=0.066
    1a.jpg
  2. score=0.038
    3a.jpg

感想

・Colab上で数十行のコードで画像検索が完成するのは驚き。
・DINOv2はファインチューニングなしでも「人間の直感に近い」特徴をうまく捉えてくれます。
・商品検索やデータ整理にすぐ応用できそう。
・さらに発展させるなら、CLIPのようなテキスト検索を組み合わせるのも面白いです。

まとめ

・DINOv2は自己教師あり学習で学習した強力なビジョン基盤モデル。
・特徴抽出が強力で、分類・検索・領域分割などマルチに使える。
・Colabでも簡単に試せて、画像検索システムを作るのに最適。


フリーランスエンジニアです。
AIについて色々記事を書いていますのでよかったらプロフィールを見てみてください。

もし以下のようなご要望をお持ちでしたらお気軽にご相談ください。
AIサービスを開発したい、ビジネスにAIを組み込んで効率化したい、AIを使ったスマホアプリを開発したい、
ARを使ったアプリケーションを作りたい、スマホアプリを作りたいけどどこに相談したらいいかわからない…

いずれも中間コストを省いたリーズナブルな価格でお請けできます。

お仕事のご相談はこちらまで
rockyshikoku@gmail.com

機械学習やAR技術を使ったアプリケーションを作っています。
機械学習/AR関連の情報を発信しています。

X
Medium
GitHub

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?