画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15

S
Shuyo NakataniSoftware Engineer at Cybozu Labs Inc.
画像をテキストで検索したい!
(OpenAI CLIP)
VRC-LT #15
2022/11/26 @shuyo
物体検出ベースの画像検索
 Google Photos の検索機能
 キーワードで絞り込み
 画像からあらかじめ物体検出
 今回対象外
 顔認識して同一人物をグルーピング。
ラベルを付けておくと名前で検索できる
 画像内のテキストで検索(一部の写真?)
困るところ
 想定外のキーワードに対応できない
 「とんこつラーメン」「シャトルバス」では検索できない
 キーワードでしか検索できない
 「青いバス」「夜の教会」では検索できない
 ちょっとでも写っていたらヒットしてしまう
「バス」で検索→
CLIP ってのを使ったら
いい感じの画像検索できるよ!
Python 70行 (webサーバ込)
import os, io, base64, glob, tqdm
from PIL import Image
import tornado.ioloop, tornado.web
import torch
import japanese_clip as ja_clip
device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = ja_clip.load("rinna/japanese-clip-vit-b-16",
device=device)
tokenizer = ja_clip.load_tokenizer()
DATASETS = [
"/media/hdd/dataset/imagenette2-320/train/**/*.JPEG",
"/media/hdd/dataset/imagenette2-320/test/**/*.JPEG",
"/media/hdd/dataset/coco/val2017/*.jpg",
"/media/hdd/dataset/coco/test2017/*.jpg",
]
imglist = []
for path in DATASETS:
imglist.extend(glob.glob(path))
features = []
for path in tqdm.tqdm(imglist):
img = Image.open(path)
image = preprocess(img).unsqueeze(0).to(device)
with torch.no_grad():
features.append(model.get_image_features(image))
features = torch.cat(features)
norm = features / torch.sqrt((features**2).sum(axis=1)).unsqueeze(1)
def read(path):
with open(path, "rb") as f:
return base64.b64encode(f.read()).decode("utf-8")
def search(query):
encodings = ja_clip.tokenize(query, tokenizer=tokenizer)
with torch.no_grad():
text_features = model.get_text_features(**encodings)
textnorm = text_features / torch.sqrt((text_features**2).sum())
sim = norm.matmul(textnorm.squeeze(0))
topk = torch.topk(sim, 5)
return [{"image_base64":read(imglist[topk.indices[i]]),
"score":topk.values[i].item()} for i in range(5)]
class MainHandler(tornado.web.RequestHandler):
def get(self):
query = self.get_argument("query", "").strip()
if query!="":
topk = search(query)
else:
topk = []
self.render("main.html", query=query, topk=topk)
if __name__ == "__main__":
dir = os.path.dirname(__file__)
app = tornado.web.Application([("/", MainHandler)],
template_path=os.path.join(dir, "template"),
static_path=os.path.join(dir, "static"),
)
app.listen(8000)
tornado.ioloop.IOLoop.current().start()
あとは CSS と
HTML テンプレートだけ
約5万枚の画像から
テキストにあう画像を表示
(COCO & ImageNette データセットより
抜粋)
検索テキストを入力
結果は瞬時に表示(<100ms)
画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15
画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15
画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15
画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15
画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15
画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15
画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15
画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15
画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15
画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15
画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15
画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15
画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15
画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15
画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15
画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15
OpenAI CLIP (Contrastive Language-Image Pre-training)
 画像・テキストの組からそれぞれの
ベクトル表現を事前学習
 正しい組のベクトル表現のコサイン類
似度が大きく、異なる組のが小さくな
るように対照学習
 Encoder はなんでもいい
 text: transformer 系
 image: ResNet か ViT
Radford, Alec, et al. "Learning transferable visual models from natural language supervision."
International Conference on Machine Learning. PMLR, 2021.
CLIP で画像検索サービス
 CLIP の学習済みモデルを使う
 今回利用したのは rinna 社の日本語 CLIP モデル(商用利用可能)
 https://huggingface.co/rinna/japanese-clip-vit-b-16
 画像を固定長ベクトル(512次元)にエンコード&長さ1に正規化
 5万枚のベクトル化に約 8分(RTX3060)
 クエリーテキストをベクトル化し、画像ベクトルと比較
 コサイン類似度が大きい画像を検索結果として出力
 画像が多ければ SimHash などでコサイン類似度探索を高速化
画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15
1 of 25

Recommended

動作認識の最前線:手法,タスク,データセット by
動作認識の最前線:手法,タスク,データセット動作認識の最前線:手法,タスク,データセット
動作認識の最前線:手法,タスク,データセットToru Tamaki
3.3K views128 slides
Swin Transformer (ICCV'21 Best Paper) を完璧に理解する資料 by
Swin Transformer (ICCV'21 Best Paper) を完璧に理解する資料Swin Transformer (ICCV'21 Best Paper) を完璧に理解する資料
Swin Transformer (ICCV'21 Best Paper) を完璧に理解する資料Yusuke Uchida
16K views38 slides
【DL輪読会】Segment Anything by
【DL輪読会】Segment Anything【DL輪読会】Segment Anything
【DL輪読会】Segment AnythingDeep Learning JP
4K views24 slides
【DL輪読会】An Image is Worth One Word: Personalizing Text-to-Image Generation usi... by
【DL輪読会】An Image is Worth One Word: Personalizing Text-to-Image Generation usi...【DL輪読会】An Image is Worth One Word: Personalizing Text-to-Image Generation usi...
【DL輪読会】An Image is Worth One Word: Personalizing Text-to-Image Generation usi...Deep Learning JP
973 views22 slides
Lucas kanade法について by
Lucas kanade法についてLucas kanade法について
Lucas kanade法についてHitoshi Nishimura
20.8K views15 slides
backbone としての timm 入門 by
backbone としての timm 入門backbone としての timm 入門
backbone としての timm 入門Takuji Tahara
7.4K views19 slides

More Related Content

What's hot

[DL輪読会]画像を使ったSim2Realの現況 by
[DL輪読会]画像を使ったSim2Realの現況[DL輪読会]画像を使ったSim2Realの現況
[DL輪読会]画像を使ったSim2Realの現況Deep Learning JP
2.3K views15 slides
【DL輪読会】How Much Can CLIP Benefit Vision-and-Language Tasks? by
【DL輪読会】How Much Can CLIP Benefit Vision-and-Language Tasks? 【DL輪読会】How Much Can CLIP Benefit Vision-and-Language Tasks?
【DL輪読会】How Much Can CLIP Benefit Vision-and-Language Tasks? Deep Learning JP
1.1K views27 slides
SfM Learner系単眼深度推定手法について by
SfM Learner系単眼深度推定手法についてSfM Learner系単眼深度推定手法について
SfM Learner系単眼深度推定手法についてRyutaro Yamauchi
10.6K views33 slides
Domain Adaptation 発展と動向まとめ(サーベイ資料) by
Domain Adaptation 発展と動向まとめ(サーベイ資料)Domain Adaptation 発展と動向まとめ(サーベイ資料)
Domain Adaptation 発展と動向まとめ(サーベイ資料)Yamato OKAMOTO
8.5K views22 slides
画像認識の初歩、SIFT,SURF特徴量 by
画像認識の初歩、SIFT,SURF特徴量画像認識の初歩、SIFT,SURF特徴量
画像認識の初歩、SIFT,SURF特徴量takaya imai
228.6K views22 slides
[DL輪読会]Focal Loss for Dense Object Detection by
[DL輪読会]Focal Loss for Dense Object Detection[DL輪読会]Focal Loss for Dense Object Detection
[DL輪読会]Focal Loss for Dense Object DetectionDeep Learning JP
14.3K views19 slides

What's hot(20)

[DL輪読会]画像を使ったSim2Realの現況 by Deep Learning JP
[DL輪読会]画像を使ったSim2Realの現況[DL輪読会]画像を使ったSim2Realの現況
[DL輪読会]画像を使ったSim2Realの現況
Deep Learning JP2.3K views
【DL輪読会】How Much Can CLIP Benefit Vision-and-Language Tasks? by Deep Learning JP
【DL輪読会】How Much Can CLIP Benefit Vision-and-Language Tasks? 【DL輪読会】How Much Can CLIP Benefit Vision-and-Language Tasks?
【DL輪読会】How Much Can CLIP Benefit Vision-and-Language Tasks?
Deep Learning JP1.1K views
SfM Learner系単眼深度推定手法について by Ryutaro Yamauchi
SfM Learner系単眼深度推定手法についてSfM Learner系単眼深度推定手法について
SfM Learner系単眼深度推定手法について
Ryutaro Yamauchi10.6K views
Domain Adaptation 発展と動向まとめ(サーベイ資料) by Yamato OKAMOTO
Domain Adaptation 発展と動向まとめ(サーベイ資料)Domain Adaptation 発展と動向まとめ(サーベイ資料)
Domain Adaptation 発展と動向まとめ(サーベイ資料)
Yamato OKAMOTO8.5K views
画像認識の初歩、SIFT,SURF特徴量 by takaya imai
画像認識の初歩、SIFT,SURF特徴量画像認識の初歩、SIFT,SURF特徴量
画像認識の初歩、SIFT,SURF特徴量
takaya imai228.6K views
[DL輪読会]Focal Loss for Dense Object Detection by Deep Learning JP
[DL輪読会]Focal Loss for Dense Object Detection[DL輪読会]Focal Loss for Dense Object Detection
[DL輪読会]Focal Loss for Dense Object Detection
Deep Learning JP14.3K views
【DL輪読会】Perceiver io a general architecture for structured inputs &amp; outputs by Deep Learning JP
【DL輪読会】Perceiver io  a general architecture for structured inputs &amp; outputs 【DL輪読会】Perceiver io  a general architecture for structured inputs &amp; outputs
【DL輪読会】Perceiver io a general architecture for structured inputs &amp; outputs
Deep Learning JP1.5K views
【メタサーベイ】Video Transformer by cvpaper. challenge
 【メタサーベイ】Video Transformer 【メタサーベイ】Video Transformer
【メタサーベイ】Video Transformer
cvpaper. challenge2.2K views
【メタサーベイ】数式ドリブン教師あり学習 by cvpaper. challenge
【メタサーベイ】数式ドリブン教師あり学習【メタサーベイ】数式ドリブン教師あり学習
【メタサーベイ】数式ドリブン教師あり学習
cvpaper. challenge5.9K views
全力解説!Transformer by Arithmer Inc.
全力解説!Transformer全力解説!Transformer
全力解説!Transformer
Arithmer Inc.9.6K views
SSII2021 [SS1] Transformer x Computer Visionの 実活用可能性と展望 〜 TransformerのCompute... by SSII
SSII2021 [SS1] Transformer x Computer Visionの 実活用可能性と展望 〜 TransformerのCompute...SSII2021 [SS1] Transformer x Computer Visionの 実活用可能性と展望 〜 TransformerのCompute...
SSII2021 [SS1] Transformer x Computer Visionの 実活用可能性と展望 〜 TransformerのCompute...
SSII2.8K views
【DL輪読会】DreamBooth: Fine Tuning Text-to-Image Diffusion Models for Subject-Dri... by Deep Learning JP
【DL輪読会】DreamBooth: Fine Tuning Text-to-Image Diffusion Models for Subject-Dri...【DL輪読会】DreamBooth: Fine Tuning Text-to-Image Diffusion Models for Subject-Dri...
【DL輪読会】DreamBooth: Fine Tuning Text-to-Image Diffusion Models for Subject-Dri...
Deep Learning JP1.4K views
12. Diffusion Model の数学的基礎.pdf by 幸太朗 岩澤
12. Diffusion Model の数学的基礎.pdf12. Diffusion Model の数学的基礎.pdf
12. Diffusion Model の数学的基礎.pdf
幸太朗 岩澤796 views
【DL輪読会】ViT + Self Supervised Learningまとめ by Deep Learning JP
【DL輪読会】ViT + Self Supervised Learningまとめ【DL輪読会】ViT + Self Supervised Learningまとめ
【DL輪読会】ViT + Self Supervised Learningまとめ
Deep Learning JP4K views
[DL輪読会]NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis by Deep Learning JP
[DL輪読会]NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis[DL輪読会]NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis
[DL輪読会]NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis
Deep Learning JP4.6K views
【メタサーベイ】Vision and Language のトップ研究室/研究者 by cvpaper. challenge
【メタサーベイ】Vision and Language のトップ研究室/研究者【メタサーベイ】Vision and Language のトップ研究室/研究者
【メタサーベイ】Vision and Language のトップ研究室/研究者
cvpaper. challenge1.8K views
自己教師学習(Self-Supervised Learning) by cvpaper. challenge
自己教師学習(Self-Supervised Learning)自己教師学習(Self-Supervised Learning)
自己教師学習(Self-Supervised Learning)
cvpaper. challenge12.8K views

More from Shuyo Nakatani

Generative adversarial networks by
Generative adversarial networksGenerative adversarial networks
Generative adversarial networksShuyo Nakatani
5.2K views20 slides
無限関係モデル (続・わかりやすいパターン認識 13章) by
無限関係モデル (続・わかりやすいパターン認識 13章)無限関係モデル (続・わかりやすいパターン認識 13章)
無限関係モデル (続・わかりやすいパターン認識 13章)Shuyo Nakatani
12.6K views23 slides
Memory Networks (End-to-End Memory Networks の Chainer 実装) by
Memory Networks (End-to-End Memory Networks の Chainer 実装)Memory Networks (End-to-End Memory Networks の Chainer 実装)
Memory Networks (End-to-End Memory Networks の Chainer 実装)Shuyo Nakatani
9.5K views25 slides
人工知能と機械学習の違いって? by
人工知能と機械学習の違いって?人工知能と機械学習の違いって?
人工知能と機械学習の違いって?Shuyo Nakatani
20.9K views20 slides
RとStanでクラウドセットアップ時間を分析してみたら #TokyoR by
RとStanでクラウドセットアップ時間を分析してみたら #TokyoRRとStanでクラウドセットアップ時間を分析してみたら #TokyoR
RとStanでクラウドセットアップ時間を分析してみたら #TokyoRShuyo Nakatani
3.5K views43 slides
ドラえもんでわかる統計的因果推論 #TokyoR by
ドラえもんでわかる統計的因果推論 #TokyoRドラえもんでわかる統計的因果推論 #TokyoR
ドラえもんでわかる統計的因果推論 #TokyoRShuyo Nakatani
10.8K views16 slides

More from Shuyo Nakatani(20)

Generative adversarial networks by Shuyo Nakatani
Generative adversarial networksGenerative adversarial networks
Generative adversarial networks
Shuyo Nakatani5.2K views
無限関係モデル (続・わかりやすいパターン認識 13章) by Shuyo Nakatani
無限関係モデル (続・わかりやすいパターン認識 13章)無限関係モデル (続・わかりやすいパターン認識 13章)
無限関係モデル (続・わかりやすいパターン認識 13章)
Shuyo Nakatani12.6K views
Memory Networks (End-to-End Memory Networks の Chainer 実装) by Shuyo Nakatani
Memory Networks (End-to-End Memory Networks の Chainer 実装)Memory Networks (End-to-End Memory Networks の Chainer 実装)
Memory Networks (End-to-End Memory Networks の Chainer 実装)
Shuyo Nakatani9.5K views
人工知能と機械学習の違いって? by Shuyo Nakatani
人工知能と機械学習の違いって?人工知能と機械学習の違いって?
人工知能と機械学習の違いって?
Shuyo Nakatani20.9K views
RとStanでクラウドセットアップ時間を分析してみたら #TokyoR by Shuyo Nakatani
RとStanでクラウドセットアップ時間を分析してみたら #TokyoRRとStanでクラウドセットアップ時間を分析してみたら #TokyoR
RとStanでクラウドセットアップ時間を分析してみたら #TokyoR
Shuyo Nakatani3.5K views
ドラえもんでわかる統計的因果推論 #TokyoR by Shuyo Nakatani
ドラえもんでわかる統計的因果推論 #TokyoRドラえもんでわかる統計的因果推論 #TokyoR
ドラえもんでわかる統計的因果推論 #TokyoR
Shuyo Nakatani10.8K views
[Yang, Downey and Boyd-Graber 2015] Efficient Methods for Incorporating Knowl... by Shuyo Nakatani
[Yang, Downey and Boyd-Graber 2015] Efficient Methods for Incorporating Knowl...[Yang, Downey and Boyd-Graber 2015] Efficient Methods for Incorporating Knowl...
[Yang, Downey and Boyd-Graber 2015] Efficient Methods for Incorporating Knowl...
Shuyo Nakatani13.4K views
星野「調査観察データの統計科学」第3章 by Shuyo Nakatani
星野「調査観察データの統計科学」第3章星野「調査観察データの統計科学」第3章
星野「調査観察データの統計科学」第3章
Shuyo Nakatani33.2K views
星野「調査観察データの統計科学」第1&2章 by Shuyo Nakatani
星野「調査観察データの統計科学」第1&2章星野「調査観察データの統計科学」第1&2章
星野「調査観察データの統計科学」第1&2章
Shuyo Nakatani28.7K views
言語処理するのに Python でいいの? #PyDataTokyo by Shuyo Nakatani
言語処理するのに Python でいいの? #PyDataTokyo言語処理するのに Python でいいの? #PyDataTokyo
言語処理するのに Python でいいの? #PyDataTokyo
Shuyo Nakatani21.2K views
Zipf? (ジップ則のひみつ?) #DSIRNLP by Shuyo Nakatani
Zipf? (ジップ則のひみつ?) #DSIRNLPZipf? (ジップ則のひみつ?) #DSIRNLP
Zipf? (ジップ則のひみつ?) #DSIRNLP
Shuyo Nakatani4.6K views
ACL2014 Reading: [Zhang+] "Kneser-Ney Smoothing on Expected Count" and [Pickh... by Shuyo Nakatani
ACL2014 Reading: [Zhang+] "Kneser-Ney Smoothing on Expected Count" and [Pickh...ACL2014 Reading: [Zhang+] "Kneser-Ney Smoothing on Expected Count" and [Pickh...
ACL2014 Reading: [Zhang+] "Kneser-Ney Smoothing on Expected Count" and [Pickh...
Shuyo Nakatani5.8K views
ソーシャルメディアの多言語判定 #SoC2014 by Shuyo Nakatani
ソーシャルメディアの多言語判定 #SoC2014ソーシャルメディアの多言語判定 #SoC2014
ソーシャルメディアの多言語判定 #SoC2014
Shuyo Nakatani5K views
猫に教えてもらうルベーグ可測 by Shuyo Nakatani
猫に教えてもらうルベーグ可測猫に教えてもらうルベーグ可測
猫に教えてもらうルベーグ可測
Shuyo Nakatani28.2K views
アラビア語とペルシャ語の見分け方 #DSIRNLP 5 by Shuyo Nakatani
アラビア語とペルシャ語の見分け方 #DSIRNLP 5アラビア語とペルシャ語の見分け方 #DSIRNLP 5
アラビア語とペルシャ語の見分け方 #DSIRNLP 5
Shuyo Nakatani23.2K views
どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013 by Shuyo Nakatani
どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013
どの言語でつぶやかれたのか、機械が知る方法 #WebDBf2013
Shuyo Nakatani11.4K views
Active Learning 入門 by Shuyo Nakatani
Active Learning 入門Active Learning 入門
Active Learning 入門
Shuyo Nakatani51.8K views
数式を綺麗にプログラミングするコツ #spro2013 by Shuyo Nakatani
数式を綺麗にプログラミングするコツ #spro2013数式を綺麗にプログラミングするコツ #spro2013
数式を綺麗にプログラミングするコツ #spro2013
Shuyo Nakatani50.5K views
ノンパラベイズ入門の入門 by Shuyo Nakatani
ノンパラベイズ入門の入門ノンパラベイズ入門の入門
ノンパラベイズ入門の入門
Shuyo Nakatani27.4K views
[Kim+ ICML2012] Dirichlet Process with Mixed Random Measures : A Nonparametri... by Shuyo Nakatani
[Kim+ ICML2012] Dirichlet Process with Mixed Random Measures : A Nonparametri...[Kim+ ICML2012] Dirichlet Process with Mixed Random Measures : A Nonparametri...
[Kim+ ICML2012] Dirichlet Process with Mixed Random Measures : A Nonparametri...
Shuyo Nakatani87.4K views

Recently uploaded

PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」 by
PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」
PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」PC Cluster Consortium
68 views12 slides
Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向 by
Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向
Keycloakの全体像: 基本概念、ユースケース、そして最新の開発動向Hitachi, Ltd. OSS Solution Center.
110 views26 slides
PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」 by
PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」
PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」PC Cluster Consortium
29 views36 slides
光コラボは契約してはいけない by
光コラボは契約してはいけない光コラボは契約してはいけない
光コラボは契約してはいけないTakuya Matsunaga
30 views17 slides
パスキーでリードする: NGINXとKeycloakによる効率的な認証・認可 by
パスキーでリードする: NGINXとKeycloakによる効率的な認証・認可パスキーでリードする: NGINXとKeycloakによる効率的な認証・認可
パスキーでリードする: NGINXとKeycloakによる効率的な認証・認可Hitachi, Ltd. OSS Solution Center.
13 views22 slides

Recently uploaded(7)

PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」 by PC Cluster Consortium
PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」
PCCC23:富士通株式会社 テーマ1「次世代高性能・省電力プロセッサ『FUJITSU-MONAKA』」
PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」 by PC Cluster Consortium
PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」
PCCC23:東京大学情報基盤センター 「Society5.0の実現を目指す『計算・データ・学習』の融合による革新的スーパーコンピューティング」
光コラボは契約してはいけない by Takuya Matsunaga
光コラボは契約してはいけない光コラボは契約してはいけない
光コラボは契約してはいけない
Takuya Matsunaga30 views

画像をテキストで検索したい!(OpenAI CLIP) - VRC-LT #15

  • 2. 物体検出ベースの画像検索  Google Photos の検索機能  キーワードで絞り込み  画像からあらかじめ物体検出  今回対象外  顔認識して同一人物をグルーピング。 ラベルを付けておくと名前で検索できる  画像内のテキストで検索(一部の写真?)
  • 3. 困るところ  想定外のキーワードに対応できない  「とんこつラーメン」「シャトルバス」では検索できない  キーワードでしか検索できない  「青いバス」「夜の教会」では検索できない  ちょっとでも写っていたらヒットしてしまう 「バス」で検索→
  • 5. Python 70行 (webサーバ込) import os, io, base64, glob, tqdm from PIL import Image import tornado.ioloop, tornado.web import torch import japanese_clip as ja_clip device = "cuda" if torch.cuda.is_available() else "cpu" model, preprocess = ja_clip.load("rinna/japanese-clip-vit-b-16", device=device) tokenizer = ja_clip.load_tokenizer() DATASETS = [ "/media/hdd/dataset/imagenette2-320/train/**/*.JPEG", "/media/hdd/dataset/imagenette2-320/test/**/*.JPEG", "/media/hdd/dataset/coco/val2017/*.jpg", "/media/hdd/dataset/coco/test2017/*.jpg", ] imglist = [] for path in DATASETS: imglist.extend(glob.glob(path)) features = [] for path in tqdm.tqdm(imglist): img = Image.open(path) image = preprocess(img).unsqueeze(0).to(device) with torch.no_grad(): features.append(model.get_image_features(image)) features = torch.cat(features) norm = features / torch.sqrt((features**2).sum(axis=1)).unsqueeze(1) def read(path): with open(path, "rb") as f: return base64.b64encode(f.read()).decode("utf-8") def search(query): encodings = ja_clip.tokenize(query, tokenizer=tokenizer) with torch.no_grad(): text_features = model.get_text_features(**encodings) textnorm = text_features / torch.sqrt((text_features**2).sum()) sim = norm.matmul(textnorm.squeeze(0)) topk = torch.topk(sim, 5) return [{"image_base64":read(imglist[topk.indices[i]]), "score":topk.values[i].item()} for i in range(5)] class MainHandler(tornado.web.RequestHandler): def get(self): query = self.get_argument("query", "").strip() if query!="": topk = search(query) else: topk = [] self.render("main.html", query=query, topk=topk) if __name__ == "__main__": dir = os.path.dirname(__file__) app = tornado.web.Application([("/", MainHandler)], template_path=os.path.join(dir, "template"), static_path=os.path.join(dir, "static"), ) app.listen(8000) tornado.ioloop.IOLoop.current().start() あとは CSS と HTML テンプレートだけ
  • 6. 約5万枚の画像から テキストにあう画像を表示 (COCO & ImageNette データセットより 抜粋) 検索テキストを入力 結果は瞬時に表示(<100ms)
  • 23. OpenAI CLIP (Contrastive Language-Image Pre-training)  画像・テキストの組からそれぞれの ベクトル表現を事前学習  正しい組のベクトル表現のコサイン類 似度が大きく、異なる組のが小さくな るように対照学習  Encoder はなんでもいい  text: transformer 系  image: ResNet か ViT Radford, Alec, et al. "Learning transferable visual models from natural language supervision." International Conference on Machine Learning. PMLR, 2021.
  • 24. CLIP で画像検索サービス  CLIP の学習済みモデルを使う  今回利用したのは rinna 社の日本語 CLIP モデル(商用利用可能)  https://huggingface.co/rinna/japanese-clip-vit-b-16  画像を固定長ベクトル(512次元)にエンコード&長さ1に正規化  5万枚のベクトル化に約 8分(RTX3060)  クエリーテキストをベクトル化し、画像ベクトルと比較  コサイン類似度が大きい画像を検索結果として出力  画像が多ければ SimHash などでコサイン類似度探索を高速化