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,因为功能的一部分是由我的计算机视觉团队开发(并使用)的。