OML是一個基於Pytorch的框架,可訓練和驗證產生高質量嵌入的模型。
ㅤㅤ
牛津大學和HSE大學中有許多人在他們的論文中使用了OML。 [1] [2] [3]
該更新重點是幾個組件:
我們添加了“官方”文本支持和相應的Python示例。 (注意,尚不支持管道中的文本支持。)
我們介紹了RetrievalResults ( RR )類,這是一個用於存儲用於給定查詢的圖庫項目的容器。 RR提供了一種可視化預測和計算指標的統一方法(如果知道地面真相)。它還簡化了後處理,其中將RR對像作為輸入,而將另一個RR_upd作為輸出產生。擁有這兩個對象可以在視覺上或通過指標進行比較檢索結果。此外,您可以輕鬆地創建這樣的後處理器鏈。
RR是內存優化的:換句話說,它不會存儲查詢 - 助劑距離的完整矩陣。 (雖然它不會使搜索大約)。我們使Model和Dataset為負責處理特定於模式的邏輯的唯一類。 Model負責解釋其輸入尺寸:例如,用於圖像的BxCxHxW或諸如文本之類的序列的BxLxD 。 Dataset負責準備一個項目:它可以用於圖像或Tokenizer的文本Transforms 。函數計算指標,例如calc_retrieval_metrics_rr , RetrievalResults , PairwiseReranker和其他類和功能,統一使用任何模態。
.visaulize()的IVisualizableDataset ,顯示一個項目。如果實施, RetrievalResults可以顯示檢索結果的佈局。 趕上更改的最簡單方法是重新閱讀示例!
推薦的驗證方法是使用RetrievalResults和功能,例如calc_retrieval_metrics_rr , calc_fnmr_at_fmr_rr等。 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接口。第一個必須用於推論,第二個用於驗證。還添加了IVisualizableDataset接口。
刪除了一些內部設備,例如IMetricDDP , EmbeddingMetricsDDP , calc_distance_matrix , calc_gt_mask , calc_mask_to_ignore , apply_mask_to_ignore 。這些更改不應影響您。還刪除了與帶有預先計算的三重態管道有關的代碼。
功能提取:沒有更改,除了添加可選參數 - mode_for_checkpointing = (min | max) 。在較低之間切換越好,越大,指標類型越大可能很有用。
成對POSTPOSTROCESSING PIPELILE:稍微更改後postprocessor sub配置的名稱和參數 - pairwise_images現在是pairwise_reranker ,不需要轉換。
您可能會認為“如果我需要圖像嵌入,我可以簡單地訓練香草分類器並倒數第二層” 。好吧,這是起點是有道理的。但是有幾個可能的缺點:
如果您想使用嵌入來執行搜索,則需要計算它們之間的一定距離(例如餘弦或L2)。通常,在分類設置的培訓期間,您不會直接優化這些距離。因此,您只能希望最終的嵌入將具有所需的屬性。
第二個問題是驗證過程。在搜索設置中,您通常會關心Top-N輸出與查詢的關係。評估該模型的自然方法是將搜索請求模擬到參考集中並應用檢索指標之一。因此,不能保證分類準確性將與這些指標相關。
最後,您可能需要自己實施公制學習管道。有很多工作:要使用三胞胎損失,您需要以特定的方式形成批次,實施不同種類的三重態挖掘,跟踪距離等。為了進行驗證,您還需要實現檢索指標,包括在時期內有效的嵌入式嵌入式堆積,遮蓋角案例等。您可能還需要通過突出搜索結果來可視化搜索請求。您可以簡單地將OML用於自己的目的,而不是自己這樣做。
PML是公制學習的流行圖書館,其中包括大量損失,礦工,距離和還原器的集合;這就是為什麼我們提供與OML一起使用它們的直接示例的原因。最初,我們嘗試使用PML,但最後,我們提出了庫,這是面向管道 /食譜的更多。這就是OML與PML的不同之處:
OML具有管道,可以通過以所需格式準備配置和數據來允許培訓模型(就像將數據轉換為可可格式以從MMDetection訓練檢測器)。
OML專注於端到端管道和實際用例。它在接近現實生活的流行基準(例如數千個ID的產品的照片)上具有基於配置的示例。我們在這些數據集,經過訓練和發布的模型及其配置上發現了一些高參數組合。因此,它使OML比PML更為面向OML,其作者確認了這一說法,他的庫是一組工具,而不是配方,此外,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]長度。這意味著我們不觀察到一個時期中的所有可用訓練樣本(而不是香草分類),而是觀察到所有可用標籤。它可能與當前(2022年)的SOTA方法相媲美,例如催眠。 (關於這種方法的幾句話:這是一個經過對比損失的VIT建築,但是將嵌入投影到了一些雙曲線空間中。正如作者所聲稱的那樣,這樣的空間能夠描述現實世界數據的嵌套結構。因此,該論文需要一些繁重的數學來適應超級玻璃體空間的常規操作。
我們培訓了相同的體系結構,並固定了其餘參數:訓練和測試轉換,圖像大小和優化器。請參閱模型動物園中的配置。訣竅是在我們的礦工和採樣器中的啟發式方法中:
類別餘額採樣器形成批處理,以限制其中的類別C數。例如,當C = 1時,它僅將夾克放入一個批處理,而牛仔褲僅將牛仔褲放入另一批(只是一個示例)中。它會自動使負面對更加困難:模型要意識到為什麼兩件夾克與對夾克和T恤的理解相同,這更有意義。
硬三胞胎礦工使該任務變得更加困難,僅保留最困難的三胞胎(具有最大的正距離和最小的負距離)。
這是2個流行基準測試的CMC@1分。 SOP數據集:Hyp-Vit - 85.9,我們的-86.6。 DeepFashion數據集:Hyp-Vit - 92.5,我們的-92.1。因此,利用簡單的啟發式方法並避免了沉重的數學,我們能夠在SOTA級別上執行。
SSL的最新研究肯定取得了不錯的成果。問題在於這些方法需要大量計算來訓練模型。但是在我們的框架中,我們考慮了普通用戶不超過少數GPU的最常見情況。
同時,忽略這個領域的成功是不明智的,因此我們仍然以兩種方式利用它:
不,你不。 OML是一種框架 - 不可思議的。儘管我們將Pytorch Lightning用作實驗的循環跑步者,但我們還是可以在Pure Pytorch上運行所有內容的可能性。因此,只有OML的小部分是特定於閃電的,我們將此邏輯與其他代碼分開(請參見oml.lightning )。即使您使用閃電,也不需要知道它,因為我們準備使用管道。
在實施必要的包裝器後,使用純Pytorch和代碼模塊化結構為使用您喜歡的框架提供了一個空間。
是的。要使用管道運行實驗,您只需要將轉換器寫入我們的格式(這意味著用一些預定義的列準備.csv表)。就是這樣!
大概我們已經在模型動物園中擁有適合您域的適當訓練模型。在這種情況下,您甚至不需要訓練它。
目前,我們不支持直接向ONNX的導出模型。但是,您可以使用內置的Pytorch功能來實現這一目標。有關更多信息,請參閱此問題。
文件
首先以:英語|俄語|中國人
我們的紙攪拌的演示:圖像檢索後處理的暹羅變壓器
在Marktechpost上遇到敞開的度量學習(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 )管道提供了一種通過僅更改配置文件運行公制學習實驗的方法。您需要的只是以必需的格式準備數據集。
有關更多詳細信息,請參見管道文件夾:
這是與擁抱面變壓器模型的輕量級集成。您可以將其替換為從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 |
該指標可能與論文報告的指標不同,因為火車/瓦爾的拆分版本和邊界框使用可能會有所不同。
我們歡迎新貢獻者!請,看看我們:
該項目始於2020年,是催化劑庫的模塊。我要感謝與我一起在該模塊上合作的人:朱莉婭·申斯(Julia Shenshina),尼基塔·巴拉甘斯基(Nikita Balagansky),謝爾蓋·科萊斯尼科夫(Sergey Kolesnikov)等。
我要感謝那些成為一個單獨的項目時繼續在該管道上工作的人們:朱莉婭·申斯(Julia Shenshina),米莎·金洛夫(Misha Kindulov),阿隆·迪克(Aron Dik),阿萊克西·塔拉索夫(Aleksei Tarasov)和維克霍夫特塞夫·萊昂尼德(Verkhovtsev Leonid)。
我還要感謝Newyorker,因為功能的一部分是由我的計算機視覺團隊開發(並使用)的。