OMLは、高品質の埋め込みを生成するモデルをトレーニングおよび検証するためのPytorchベースのフレームワークです。
ㅤㅤ
オックスフォード大学とHSE大学の多くの人々が、自分の論文でOMLを使用しています。 [1] [2] [3]
アップデートは、いくつかのコンポーネントに焦点を当てています。
「公式」テキストサポートと対応するPythonの例を追加しました。 (パイプラインでのテキストのサポートはまだサポートされていません。)
RetrievalResults ( RR )クラスを導入しました。特定のクエリに対して取得されたギャラリーアイテムを保管するコンテナです。 RR 、予測を視覚化し、メトリックを計算する統一された方法を提供します(グラウンドトゥルースがわかっている場合)。また、 RRオブジェクトが入力として使用され、別のRR_updが出力として生成される後処理も簡素化されます。これらの2つのオブジェクトを使用すると、比較検索結果が視覚的またはメトリックによって結果を得ることができます。さらに、このような郵便配列のチェーンを簡単に作成できます。
RR 、バッチを使用しているため、メモリが最適化されています。つまり、クエリギャラリー距離の完全なマトリックスは保存されません。 (ただし、検索は概算しません)。 ModelとDatasetモダリティ固有のロジックの処理に責任のある唯一のクラスにしました。 Model 、入力寸法を解釈する責任があります。たとえば、画像のBxCxHxWまたはテキストのようなシーケンスのBxLxD 。 Datasetはアイテムの準備を担当します。画像にTransformsまたはテキストにTokenizer使用する場合があります。 calc_retrieval_metrics_rr 、 RetrievalResults 、 PairwiseReranker 、その他のクラスおよび機能などの関数コンピューティングメトリックは、あらゆるモダリティで動作するように統一されています。
.visaulize()を持つIVisualizableDataset追加しました。実装された場合、 RetrievalResults取得した結果のレイアウトを表示できます。 変更に追いつく最も簡単な方法は、例を読み直すことです!
推奨される検証方法は、 calc_retrieval_metrics_rr 、 calc_fnmr_at_fmr_rrなどのRetrievalResultsと関数を使用することです。 EmbeddingMetricsクラスは、Pytorch Lightningおよび内部パイプラインで使用するために保持されます。注意してください、 EmbeddingMetricsメソッドの署名はわずかに変更されています。そのための稲妻の例を参照してください。
モダリティ固有のロジックはDatasetに限定されているため、 PATHS_KEY 、 X1_KEY 、 X2_KEY 、 Y1_KEY 、 Y2_KEYを出力しません。 LABELS_KEY 、 IS_GALLERY 、 IS_QUERY_KEY 、 CATEGORIES_KEYなどのモダリティ固有ではないキーはまだ使用されています。
inference_on_images inferenceあり、任意のモダリティで動作します。
Datasets.たとえば、 IQueryGalleryDatasetとIQueryGalleryLabeledDatasetインターフェイスがあります。 1つ目は推論に使用する必要があります。2番目のものは検証に使用する必要があります。また、 IVisualizableDatasetインターフェイスも追加されました。
IMetricDDP 、 EmbeddingMetricsDDP 、 calc_distance_matrix 、 calc_gt_mask 、 calc_mask_to_ignore 、 apply_mask_to_ignoreなどの内部を削除しました。これらの変更はあなたに影響を与えません。また、事前に計算されたトリプレットを備えたパイプラインに関連するコードを削除しました。
機能の抽出:オプションの引数を追加することを除いて、変更はありません - mode_for_checkpointing = (min | max) 。より低い、より良く、より良いタイプのメトリックを切り替えることは有用かもしれません。
ペアワイズポストプロセスパイプライン: postprocessorサブ構成の名前と引数をわずかに変更しました - pairwise_imagesはpairwise_rerankerなり、変換は必要ありません。
「画像の埋め込みが必要な場合は、単にバニラ分類器を訓練して最後から2番目の層を取ることができる」と思うかもしれません。まあ、それは出発点として理にかなっています。しかし、いくつかの考えられる欠点があります:
埋め込みを使用して検索を実行する場合は、それらの間の距離を計算する必要があります(たとえば、CosineまたはL2)。通常、分類セットアップでのトレーニング中にこれらの距離を直接最適化することはありません。したがって、最終的な埋め込みが望ましい特性を持つことを期待することしかできません。
2番目の問題は、検証プロセスです。検索セットアップでは、通常、トップN出力がクエリにどのように関連しているかを気にします。モデルを評価する自然な方法は、参照セットへの検索要求をシミュレートし、検索メトリックのいずれかを適用することです。したがって、分類の精度がこれらのメトリックと相関するという保証はありません。
最後に、自分でメトリック学習パイプラインを実装することをお勧めします。多くの作業があります。トリプレットの損失を使用するには、特定の方法でバッチを形成する必要があります。さまざまな種類のトリプレットマイニング、追跡距離などを実装する必要があります。検証のために、エポック中の効果的な埋め込み蓄積、角のケースなどをカバーすることなどを実装する必要があります。また、良い検索結果と悪い検索結果を強調して、検索リクエストを視覚化することもできます。自分でそれを行う代わりに、OMLを自分の目的に使用するだけです。
PMLは、メトリック学習の人気ライブラリであり、損失、鉱夫、距離、および還元剤の豊富なコレクションが含まれています。そのため、OMLでそれらを使用する簡単な例を提供します。最初はPMLを使用しようとしましたが、最終的には、よりパイプライン /レシピ指向のライブラリを思いつきました。それがOMLがPMLと異なる方法です:
OMLには、必要な形式で構成とデータを準備することでトレーニングモデルを可能にするパイプラインがあります(データをCOCO形式に変換して、MMDETECTIONから検出器をトレーニングするようなものです)。
OMLは、エンドツーエンドのパイプラインと実際のユースケースに焦点を当てています。実生活に近い人気のあるベンチマークに構成ベースの例があります(数千IDの製品の写真など)。これらのデータセット、訓練および公開されたモデルとその構成にハイパーパラメーターのいくつかの良い組み合わせを見つけました。したがって、OMLはPMLよりも多くのレシピを志向にし、その著者は、彼のライブラリがレシピでむしろ一連のツールであるということを確認します。さらに、PMLの例は主にCIFARおよびMNISTデータセット向けです。
OMLには、 torchvision ( resnet50(pretrained=True)を入力するとき)と同じ方法でコードから簡単にアクセスできる前処理モデルの動物園があります。
OMLはPytorch Lightningと統合されているため、トレーナーのパワーを使用できます。これは、DDPを使用するときに特に役立つため、DDPの例とPMLSの例を比較します。ちなみに、PMLにはトレーナーもありますが、例では広く使用されておらず、代わりにカスタムtrain / test機能が使用されています。
パイプライン、ラコンな例、および前提型モデルの動物園を持つことで、エントリのしきい値が非常に低い値に設定されると考えています。
メトリック学習の問題(極端な分類問題とも呼ばれます)は、一部のエンティティの数千のIDを持っている状況を意味しますが、すべてのエンティティには少数のサンプルのみです。多くの場合、テスト段階(または生産)中に、バニラ分類パイプラインを直接適用することが不可能になる目に見えないエンティティを扱うと仮定します。多くの場合、取得した埋め込みは、検索または一致する手順を実行するために使用されます。
コンピュータービジョン圏からのこのようなタスクのいくつかの例を次に示します。
embedding - モデルの出力( features vectorまたはdescriptorとも呼ばれます)。query - 検索手順のリクエストとして使用されるサンプル。gallery set - queryに似たアイテムを検索するエンティティのセット( referenceまたはindexとも呼ばれます)。Sampler - バッチを形成するために使用されるDataLoaderの引数Miner - バッチがSamplerによって形成された後にペアまたはトリプレットを形成するオブジェクト。現在のバッチ内のサンプルの組み合わせを形成する必要はありません。したがって、メモリバンクはMinerの一部である可能性があります。Samples / Labels / Instances - 例として、DeepFashionデータセットを考えてみましょう。これには、数千のファッションアイテムID( labelsに名前を付けます)と各アイテムID(個々の写真にinstanceまたはsampleとして名前を付けます)の写真がいくつか含まれています。すべてのファッションアイテムIDには、「スカート」、「ジャケット」、「ショートパンツ」などのグループがあります( categoriesに名前を付けます)。誤解を避けるために、 classという用語を使用しないでください。training epoch - 組み合わせベースの損失に使用するバッチサンプラーは、通常[number of labels in training dataset] / [numbers of labels in one batch]に等しい長さを持っています。つまり、1つのエポックで利用可能なすべてのトレーニングサンプルを観察しないことを意味します(バニラ分類とは対照的に)、代わりに利用可能なすべてのラベルを観察します。たとえば、hyp-vitなど、現在の(2022年)SOTAメソッドに匹敵する場合があります。 (このアプローチについての言葉はほとんどありません:それは対照的な損失で訓練されたvitアーキテクチャですが、埋め込みは双曲線空間に投影されました。著者が主張したように、そのような空間は現実世界のデータのネストされた構造を記述することができます。
トリプレットの損失で同じアーキテクチャをトレーニングし、トレーニングとテストの変換、画像サイズ、オプティマイザーの残りのパラメーターを修正しました。モデル動物園の構成を参照してください。トリックは、鉱夫とサンプラーのヒューリスティックでした。
カテゴリバランスサンプラーは、カテゴリCの数を制限するバッチを形成します。たとえば、 C = 1の場合、ジャケットのみを1つのバッチに入れ、ジーンズのみを別のバッチに入れます(例です)。ネガティブペアを自動的に難しくします。モデルがジャケットとTシャツについて同じことを理解するのと2つのジャケットが異なる理由を実現する方が意味があります。
ハードトリプレットマイナーは、最も硬いトリプレットのみを維持するタスクをさらに難しくします(最大の正と最小限の負の距離)。
2つの人気のあるベンチマークのCMC@1スコアは次のとおりです。 SOPデータセット:hyp-vit - 85.9、私たち - 86.6。 Deepfashion Dataset:Hyp-vit - 92.5、私たち - 92.1。したがって、単純なヒューリスティックを利用して、重い数学を避けて、SOTAレベルで実行できます。
SSLの最近の研究では、間違いなく素晴らしい結果が得られました。問題は、これらのアプローチがモデルをトレーニングするために膨大な量のコンピューティングを必要とすることです。しかし、私たちのフレームワークでは、平均的なユーザーが少数のGPU以下を持っている場合、最も一般的なケースを検討します。
同時に、この分野での成功を無視することは賢明ではないので、2つの方法でそれを悪用します。
いいえ、あなたはしません。 OMLはフレームワークに依存しています。 Pytorch Lightningを実験のループランナーとして使用しているにもかかわらず、純粋なPytorchですべてを実行する可能性も維持しています。したがって、OMLの小さな部分のみが稲妻固有であり、このロジックは他のコードとは別に保持します( oml.lightningを参照)。稲妻を使用する場合でも、パイプラインを使用する準備ができているため、知る必要はありません。
純粋なPytorchとコードのモジュラー構造を使用する可能性は、必要なラッパーの実装後にお気に入りのフレームワークでOMLを利用するための部屋を残します。
はい。パイプラインで実験を実行するには、コンバーターをフォーマットに記述するだけです(いくつかの事前定義された列で.csvテーブルを準備することを意味します)。それでおしまい!
おそらく、モデル動物園では、ドメインに適した事前に訓練されたモデルを既に持っています。この場合、トレーニングする必要さえありません。
現在、モデルをONNXに直接エクスポートすることはサポートしていません。ただし、組み込みのPytorch機能を使用してこれを実現できます。詳細については、この問題を参照してください。
ドキュメント
開始するチュートリアル:英語|ロシア語|中国語
私たちの論文のデモ攪拌:画像検索後のシャムトランス
MarkTechPostのOpenMetricLearning(OML)に会います
ベルリンを拠点とするミートアップのレポート:「生産におけるコンピュータービジョン」。 2022年11月。リンク
pip install -U open-metric-learning ; # minimum dependencies
pip install -U open-metric-learning[nlp]
pip install -U open-metric-learning[audio]docker pull omlteam/oml:gpu
docker pull omlteam/oml:cpu損失|鉱夫 miner = AllTripletsMiner ()
miner = NHardTripletsMiner ()
miner = MinerWithBank ()
...
criterion = TripletLossWithMiner ( 0.1 , miner )
criterion = ArcFaceLoss ()
criterion = SurrogatePrecision () | サンプラー labels = train . get_labels ()
l2c = train . get_label2category ()
sampler = BalanceSampler ( labels )
sampler = CategoryBalanceSampler ( labels , l2c )
sampler = DistinctCategoryBalanceSampler ( labels , l2c ) |
サポートを構成します max_epochs : 10
sampler :
name : balance
args :
n_labels : 2
n_instances : 2 | 事前に訓練されたモデル model_hf = AutoModel . from_pretrained ( "roberta-base" )
tokenizer = AutoTokenizer . from_pretrained ( "roberta-base" )
extractor_txt = HFWrapper ( model_hf )
extractor_img = ViTExtractor . from_pretrained ( "vits16_dino" )
transforms , _ = get_transforms_for_pretrained ( "vits16_dino" ) |
後処理 emb = inference ( extractor , dataset )
rr = RetrievalResults . from_embeddings ( emb , dataset )
postprocessor = AdaptiveThresholding ()
rr_upd = postprocessor . process ( rr , dataset ) | nn |による後処理|紙 embeddings = inference ( extractor , dataset )
rr = RetrievalResults . from_embeddings ( embeddings , dataset )
postprocessor = PairwiseReranker ( ConcatSiamese (), top_n = 3 )
rr_upd = postprocessor . process ( rr , dataset ) |
ロギング logger = TensorBoardPipelineLogger ()
logger = NeptunePipelineLogger ()
logger = WandBPipelineLogger ()
logger = MLFlowPipelineLogger ()
logger = ClearMLPipelineLogger () | PML from pytorch_metric_learning import losses
criterion = losses . TripletMarginLoss ( 0.2 , "all" )
pred = ViTExtractor ()( data )
criterion ( pred , gts ) |
カテゴリのサポート # train
loader = DataLoader ( CategoryBalanceSampler ())
# validation
rr = RetrievalResults . from_embeddings ()
m . calc_retrieval_metrics_rr ( rr , query_categories ) | その他の指標 embeddigs = inference ( model , dataset )
rr = RetrievalResults . from_embeddings ( embeddings , dataset )
m . calc_retrieval_metrics_rr ( rr , precision_top_k = ( 5 ,))
m . calc_fnmr_at_fmr_rr ( rr , fmr_vals = ( 0.1 ,))
m . calc_topological_metrics ( embeddings , pcf_variance = ( 0.5 ,)) |
稲妻 import pytorch_lightning as pl
model = ViTExtractor . from_pretrained ( "vits16_dino" )
clb = MetricValCallback ( EmbeddingMetrics ( dataset ))
module = ExtractorModule ( model , criterion , optimizer )
trainer = pl . Trainer ( max_epochs = 3 , callbacks = [ clb ])
trainer . fit ( module , train_loader , val_loader ) | 稲妻DDP clb = MetricValCallback ( EmbeddingMetrics ( val ))
module = ExtractorModuleDDP (
model , criterion , optimizer , train , val
)
ddp = { "devices" : 2 , "strategy" : DDPStrategy ()}
trainer = pl . Trainer ( max_epochs = 3 , callbacks = [ clb ], ** ddp )
trainer . fit ( module ) |
画像やテキストの小さなデータセットでモデルをトレーニング、検証、および後処理する方法の例を次に示します。データセット形式の詳細を参照してください。
| 画像 | テキスト |
from torch . optim import Adam
from torch . utils . data import DataLoader
from oml import datasets as d
from oml . inference import inference
from oml . losses import TripletLossWithMiner
from oml . metrics import calc_retrieval_metrics_rr
from oml . miners import AllTripletsMiner
from oml . models import ViTExtractor
from oml . registry import get_transforms_for_pretrained
from oml . retrieval import RetrievalResults , AdaptiveThresholding
from oml . samplers import BalanceSampler
from oml . utils import get_mock_images_dataset
model = ViTExtractor . from_pretrained ( "vits16_dino" ). to ( "cpu" ). train ()
transform , _ = get_transforms_for_pretrained ( "vits16_dino" )
df_train , df_val = get_mock_images_dataset ( global_paths = True )
train = d . ImageLabeledDataset ( df_train , transform = transform )
val = d . ImageQueryGalleryLabeledDataset ( df_val , transform = transform )
optimizer = Adam ( model . parameters (), lr = 1e-4 )
criterion = TripletLossWithMiner ( 0.1 , AllTripletsMiner (), need_logs = True )
sampler = BalanceSampler ( train . get_labels (), n_labels = 2 , n_instances = 2 )
def training ():
for batch in DataLoader ( train , batch_sampler = sampler ):
embeddings = model ( batch [ "input_tensors" ])
loss = criterion ( embeddings , batch [ "labels" ])
loss . backward ()
optimizer . step ()
optimizer . zero_grad ()
print ( criterion . last_logs )
def validation ():
embeddings = inference ( model , val , batch_size = 4 , num_workers = 0 )
rr = RetrievalResults . from_embeddings ( embeddings , val , n_items = 3 )
rr = AdaptiveThresholding ( n_std = 2 ). process ( rr )
rr . visualize ( query_ids = [ 2 , 1 ], dataset = val , show = True )
print ( calc_retrieval_metrics_rr ( rr , map_top_k = ( 3 ,), cmc_top_k = ( 1 ,)))
training ()
validation () | from torch . optim import Adam
from torch . utils . data import DataLoader
from transformers import AutoModel , AutoTokenizer
from oml import datasets as d
from oml . inference import inference
from oml . losses import TripletLossWithMiner
from oml . metrics import calc_retrieval_metrics_rr
from oml . miners import AllTripletsMiner
from oml . models import HFWrapper
from oml . retrieval import RetrievalResults , AdaptiveThresholding
from oml . samplers import BalanceSampler
from oml . utils import get_mock_texts_dataset
model = HFWrapper ( AutoModel . from_pretrained ( "bert-base-uncased" ), 768 ). to ( "cpu" ). train ()
tokenizer = AutoTokenizer . from_pretrained ( "bert-base-uncased" )
df_train , df_val = get_mock_texts_dataset ()
train = d . TextLabeledDataset ( df_train , tokenizer = tokenizer )
val = d . TextQueryGalleryLabeledDataset ( df_val , tokenizer = tokenizer )
optimizer = Adam ( model . parameters (), lr = 1e-4 )
criterion = TripletLossWithMiner ( 0.1 , AllTripletsMiner (), need_logs = True )
sampler = BalanceSampler ( train . get_labels (), n_labels = 2 , n_instances = 2 )
def training ():
for batch in DataLoader ( train , batch_sampler = sampler ):
embeddings = model ( batch [ "input_tensors" ])
loss = criterion ( embeddings , batch [ "labels" ])
loss . backward ()
optimizer . step ()
optimizer . zero_grad ()
print ( criterion . last_logs )
def validation ():
embeddings = inference ( model , val , batch_size = 4 , num_workers = 0 )
rr = RetrievalResults . from_embeddings ( embeddings , val , n_items = 3 )
rr = AdaptiveThresholding ( n_std = 2 ). process ( rr )
rr . visualize ( query_ids = [ 2 , 1 ], dataset = val , show = True )
print ( calc_retrieval_metrics_rr ( rr , map_top_k = ( 3 ,), cmc_top_k = ( 1 ,)))
training ()
validation () |
出力{ 'active_tri' : 0.125 , 'pos_dist' : 82.5 , 'neg_dist' : 100.5 } # batch 1
{ 'active_tri' : 0.0 , 'pos_dist' : 36.3 , 'neg_dist' : 56.9 } # batch 2
{ 'cmc' : { 1 : 0.75 }, 'precision' : { 5 : 0.75 }, 'map' : { 3 : 0.8 }} | 出力{ 'active_tri' : 0.0 , 'pos_dist' : 8.5 , 'neg_dist' : 11.0 } # batch 1
{ 'active_tri' : 0.25 , 'pos_dist' : 8.9 , 'neg_dist' : 9.8 } # batch 2
{ 'cmc' : { 1 : 0.8 }, 'precision' : { 5 : 0.7 }, 'map' : { 3 : 0.9 }} |
上記のコードの追加の図、説明、ヒント。
推論の時間の例(つまり、テストセットで検索)を次に示します。以下のコードは、テキストと画像の両方で機能します。
from oml . datasets import ImageQueryGalleryDataset
from oml . inference import inference
from oml . models import ViTExtractor
from oml . registry import get_transforms_for_pretrained
from oml . utils import get_mock_images_dataset
from oml . retrieval import RetrievalResults , AdaptiveThresholding
_ , df_test = get_mock_images_dataset ( global_paths = True )
del df_test [ "label" ] # we don't need gt labels for doing predictions
extractor = ViTExtractor . from_pretrained ( "vits16_dino" ). to ( "cpu" )
transform , _ = get_transforms_for_pretrained ( "vits16_dino" )
dataset = ImageQueryGalleryDataset ( df_test , transform = transform )
embeddings = inference ( extractor , dataset , batch_size = 4 , num_workers = 0 )
rr = RetrievalResults . from_embeddings ( embeddings , dataset , n_items = 5 )
rr = AdaptiveThresholding ( n_std = 3.5 ). process ( rr )
rr . visualize ( query_ids = [ 0 , 1 ], dataset = dataset , show = True )
# you get the ids of retrieved items and the corresponding distances
print ( rr )クエリとギャラリーが個別に処理される例を以下に示します。
import pandas as pd
from oml . datasets import ImageBaseDataset
from oml . inference import inference
from oml . models import ViTExtractor
from oml . registry import get_transforms_for_pretrained
from oml . retrieval import RetrievalResults , ConstantThresholding
from oml . utils import get_mock_images_dataset
extractor = ViTExtractor . from_pretrained ( "vits16_dino" ). to ( "cpu" )
transform , _ = get_transforms_for_pretrained ( "vits16_dino" )
paths = pd . concat ( get_mock_images_dataset ( global_paths = True ))[ "path" ]
galleries , queries1 , queries2 = paths [: 20 ], paths [ 20 : 22 ], paths [ 22 : 24 ]
# gallery is huge and fixed, so we only process it once
dataset_gallery = ImageBaseDataset ( galleries , transform = transform )
embeddings_gallery = inference ( extractor , dataset_gallery , batch_size = 4 , num_workers = 0 )
# queries come "online" in stream
for queries in [ queries1 , queries2 ]:
dataset_query = ImageBaseDataset ( queries , transform = transform )
embeddings_query = inference ( extractor , dataset_query , batch_size = 4 , num_workers = 0 )
# for the operation below we are going to provide integrations with vector search DB like QDrant or Faiss
rr = RetrievalResults . from_embeddings_qg (
embeddings_query = embeddings_query , embeddings_gallery = embeddings_gallery ,
dataset_query = dataset_query , dataset_gallery = dataset_gallery
)
rr = ConstantThresholding ( th = 80 ). process ( rr )
rr . visualize_qg ([ 0 , 1 ], dataset_query = dataset_query , dataset_gallery = dataset_gallery , show = True )
print ( rr )パイプラインは、構成ファイルのみを変更することでメートル法の学習実験を実行する方法を提供します。必要なのは、データセットを必要な形式で準備することだけです。
詳細については、パイプラインフォルダーを参照してください。
これは、Huggingface Transformersモデルとの軽量統合です。 IExtractorから継承された他の任意のモデルに置き換えることができます。
現在、独自のテキストモデル動物園はありません。
pip install open-metric-learning[nlp] from transformers import AutoModel , AutoTokenizer
from oml . models import HFWrapper
model = AutoModel . from_pretrained ( 'bert-base-uncased' ). eval ()
tokenizer = AutoTokenizer . from_pretrained ( 'bert-base-uncased' )
extractor = HFWrapper ( model = model , feat_dim = 768 )
inp = tokenizer ( text = "Hello world" , return_tensors = "pt" , add_special_tokens = True )
embeddings = extractor ( inp )動物園の画像モデルを使用したり、Iextractorから継承した後、他の任意のモデルを使用したりできます。
from oml . const import CKPT_SAVE_ROOT as CKPT_DIR , MOCK_DATASET_PATH as DATA_DIR
from oml . models import ViTExtractor
from oml . registry import get_transforms_for_pretrained
model = ViTExtractor . from_pretrained ( "vits16_dino" ). eval ()
transforms , im_reader = get_transforms_for_pretrained ( "vits16_dino" )
img = im_reader ( DATA_DIR / "images" / "circle_1.jpg" ) # put path to your image here
img_tensor = transforms ( img )
# img_tensor = transforms(image=img)["image"] # for transforms from Albumentations
features = model ( img_tensor . unsqueeze ( 0 ))
# Check other available models:
print ( list ( ViTExtractor . pretrained_models . keys ()))
# Load checkpoint saved on a disk:
model_ = ViTExtractor ( weights = CKPT_DIR / "vits16_dino.ckpt" , arch = "vits16" , normalise_features = False )モデル、私たちによって訓練されています。以下のメトリックは、224 x 224の画像用です。
| モデル | CMC1 | データセット | ウェイト | 実験 |
|---|---|---|---|---|
ViTExtractor.from_pretrained("vits16_inshop") | 0.921 | Deepfashion Inshop | リンク | リンク |
ViTExtractor.from_pretrained("vits16_sop") | 0.866 | スタンフォードのオンライン製品 | リンク | リンク |
ViTExtractor.from_pretrained("vits16_cars") | 0.907 | 車196 | リンク | リンク |
ViTExtractor.from_pretrained("vits16_cub") | 0.837 | Cub 200 2011 | リンク | リンク |
他の研究者によって訓練されたモデル。特定のベンチマーク上の一部のメトリックは、トレーニングデータセット( unicomなど)の一部であったため、非常に高いことに注意してください。以下のメトリックは、224 x 224の画像用です。
| モデル | スタンフォードのオンライン製品 | Deepfashion Inshop | Cub 200 2011 | 車196 |
|---|---|---|---|---|
ViTUnicomExtractor.from_pretrained("vitb16_unicom") | 0.700 | 0.734 | 0.847 | 0.916 |
ViTUnicomExtractor.from_pretrained("vitb32_unicom") | 0.690 | 0.722 | 0.796 | 0.893 |
ViTUnicomExtractor.from_pretrained("vitl14_unicom") | 0.726 | 0.790 | 0.868 | 0.922 |
ViTUnicomExtractor.from_pretrained("vitl14_336px_unicom") | 0.745 | 0.810 | 0.875 | 0.924 |
ViTCLIPExtractor.from_pretrained("sber_vitb32_224") | 0.547 | 0.514 | 0.448 | 0.618 |
ViTCLIPExtractor.from_pretrained("sber_vitb16_224") | 0.565 | 0.565 | 0.524 | 0.648 |
ViTCLIPExtractor.from_pretrained("sber_vitl14_224") | 0.512 | 0.555 | 0.606 | 0.707 |
ViTCLIPExtractor.from_pretrained("openai_vitb32_224") | 0.612 | 0.491 | 0.560 | 0.693 |
ViTCLIPExtractor.from_pretrained("openai_vitb16_224") | 0.648 | 0.606 | 0.665 | 0.767 |
ViTCLIPExtractor.from_pretrained("openai_vitl14_224") | 0.670 | 0.675 | 0.745 | 0.844 |
ViTExtractor.from_pretrained("vits16_dino") | 0.648 | 0.509 | 0.627 | 0.265 |
ViTExtractor.from_pretrained("vits8_dino") | 0.651 | 0.524 | 0.661 | 0.315 |
ViTExtractor.from_pretrained("vitb16_dino") | 0.658 | 0.514 | 0.541 | 0.288 |
ViTExtractor.from_pretrained("vitb8_dino") | 0.689 | 0.599 | 0.506 | 0.313 |
ViTExtractor.from_pretrained("vits14_dinov2") | 0.566 | 0.334 | 0.797 | 0.503 |
ViTExtractor.from_pretrained("vits14_reg_dinov2") | 0.566 | 0.332 | 0.795 | 0.740 |
ViTExtractor.from_pretrained("vitb14_dinov2") | 0.565 | 0.342 | 0.842 | 0.644 |
ViTExtractor.from_pretrained("vitb14_reg_dinov2") | 0.557 | 0.324 | 0.833 | 0.828 |
ViTExtractor.from_pretrained("vitl14_dinov2") | 0.576 | 0.352 | 0.844 | 0.692 |
ViTExtractor.from_pretrained("vitl14_reg_dinov2") | 0.571 | 0.340 | 0.840 | 0.871 |
ResnetExtractor.from_pretrained("resnet50_moco_v2") | 0.493 | 0.267 | 0.264 | 0.149 |
ResnetExtractor.from_pretrained("resnet50_imagenet1k_v1") | 0.515 | 0.284 | 0.455 | 0.247 |
列車/valスプリットのバージョンと境界ボックスの使用法が異なる場合があるため、論文で報告されたメトリックとは異なる場合があります。
新しい貢献者を歓迎します!お願いします、私たちを参照してください:
このプロジェクトは、2020年にCatalyst Libraryのモジュールとして開始されました。そのモジュールで私と一緒に働いてくれた人々に感謝したいと思います:Julia Shenshina、Nikita Balagansky、Sergey Kolesnikovなど。
このパイプラインが別のプロジェクトになったときに、このパイプラインに取り組み続けている人々に感謝したいと思います:ジュリア・シェンシーナ、ミシャ・キンコロフ、アロン・ディク、アレクセイ・タラソフ、Verkhovtsev Leonid。
また、機能の一部が私が率いているコンピュータービジョンチームによって開発(および使用された)ため、NewYorkerにも感謝したいと思います。