OML은 고품질 임베딩을 생성하는 모델을 훈련시키고 검증하기위한 Pytorch 기반 프레임 워크입니다.
ㅤㅤ
옥스포드와 HSE 대학에서 온 많은 사람들이 OML을 사용하여 OML을 사용했습니다. [1] [2] [3]
업데이트는 여러 구성 요소에 중점을 둡니다.
"공식"텍스트 지원 및 해당 파이썬 예제를 추가했습니다. (참고, 파이프 라인의 텍스트 지원은 아직 지원되지 않습니다.)
RR ( RetrievalResults ) 클래스를 소개했습니다. 주어진 쿼리를 위해 검색된 갤러리 항목을 저장하는 컨테이너입니다. RR 예측을 시각화하고 메트릭을 계산하는 통일 된 방법을 제공합니다 (근거 진실이 알려진 경우). 또한 RR 객체가 입력으로 취하고 다른 RR_upd 출력으로 생성되는 사후 처리를 단순화합니다. 이 두 객체를 사용하면 시각적으로 또는 메트릭으로 비교 검색 결과가 발생할 수 있습니다. 또한, 그러한 사후 처리기의 체인을 쉽게 만들 수 있습니다.
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 와 마찬가지로 modality-specific이 아닌 키가 여전히 사용 중입니다.
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) . 하위, 더 높고 높을수록 더 잘 지정되는 메트릭을 더 잘 전환하는 것이 유용 할 수 있습니다.
Pairwise-Postprocessing Pipeline : postprocessor 하위 구성의 이름과 인수를 약간 변경했습니다.- pairwise_images 는 이제 pairwise_reranker 이며 변환이 필요하지 않습니다.
"이미지 임베딩이 필요한 경우 바닐라 분류기를 훈련시키고 두 번째 레이어를 가져갈 수 있습니다"라고 생각할 수 있습니다. 글쎄, 그것은 시작점으로 의미가 있습니다. 그러나 몇 가지 가능한 단점이 있습니다.
내장을 사용하여 검색을 수행하려면 그 사이의 거리를 계산해야합니다 (예 : 코사인 또는 L2). 일반적으로 분류 설정 훈련 중에 이러한 거리를 직접 최적화하지 않습니다 . 따라서 최종 임베드가 원하는 특성을 갖기를 바랍니다.
두 번째 문제는 검증 프로세스입니다 . 검색 설정에서 일반적으로 Top-N 출력이 쿼리와 얼마나 관련되어 있는지 신경 쓰십시오. 모델을 평가하는 자연스러운 방법은 검색 요청을 참조 세트로 시뮬레이션하고 검색 메트릭 중 하나를 적용하는 것입니다. 따라서 분류 정확도가 이러한 메트릭과 관련이 있다는 보장은 없습니다.
마지막으로, 스스로 메트릭 학습 파이프 라인을 구현할 수 있습니다. 트리플렛 손실을 사용하려면 특정 방식으로 배치를 형성하고 다양한 종류의 트리플렛 마이닝, 추적 거리 등을 구현해야합니다. 검증을 위해서는 검색 메트릭을 구현해야합니다. 여기 에는 에포크 동안의 효과적인 임베드 축적, 코너 케이스 커버 등이 더 어려워지고 DDP를 사용하는 경우 더 어려워집니다. 좋은 검색 결과와 나쁜 검색 결과를 강조하여 검색 요청을 시각화 할 수도 있습니다. 직접 수행하는 대신 목적으로 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] 와 같습니다. 그것은 우리가 바닐라 분류와 반대되는 한 에포크에서 사용 가능한 모든 훈련 샘플을 관찰하지 않으며 대신 사용 가능한 모든 레이블을 관찰합니다.예를 들어 현재 (2022 년) SOTA 방법, 예를 들어 Hyp-vit과 비교할 수 있습니다. (이 접근법에 대한 몇 마디 : 대조적 인 손실로 훈련 된 Vit Architecture이지만 임베딩은 일부 과장된 공간으로 투영되었습니다. 저자가 주장한 것처럼, 그러한 공간은 실제 데이터의 중첩 된 구조를 설명 할 수 있습니다. 따라서 논문은 과도한 공간에 대한 일반적인 작업을 조정하기 위해 약간의 수학이 필요합니다).
우리는 트리플렛 손실로 동일한 아키텍처를 훈련시켜 훈련 및 테스트 변환, 이미지 크기 및 최적화와 같은 나머지 매개 변수를 고정했습니다. 모델 동물원의 구성을 참조하십시오. 트릭은 광부와 샘플러의 휴리스틱에있었습니다.
카테고리 밸런스 샘플러는 카테고리 C 의 수를 제한하는 배치를 형성합니다. 예를 들어, C = 1 은 한 번의 배치에 재킷 만 넣고 청바지 만 다른 하나에 넣습니다 (예를 들어). 그것은 자동으로 음의 쌍을 더 단단하게 만듭니다. 모델이 두 자켓이 재킷과 티셔츠에 대해 동일하게 이해하는 것과 다른 이유를 깨닫는 것이 더 의미가 있습니다.
하드 트리플렛 광부는 과제를 가장 단단한 트리플렛 만 유지하기가 더 어려워집니다 (최대 양의 양성 및 최소 음의 거리).
다음은 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 및 모듈 식 구조를 사용할 가능성은 필요한 랩퍼를 구현 한 후에 좋아하는 프레임 워크와 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 모델과의 가벼운 통합입니다. ixtractor에서 상속 된 다른 임의의 모델로 교체 할 수 있습니다.
우리는 현재 우리 자신의 텍스트 모델 동물원이 없습니다.
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 |
Train/Val 분할 버전과 경계 박스 사용이 다를 수 있기 때문에 메트릭은 논문에 의해보고 된 것과 다를 수 있습니다.
우리는 새로운 기고자들을 환영합니다! 제발, 우리 :
이 프로젝트는 2020 년 Catalyst Library 모듈로 시작되었습니다. Julia Shenshina, Nikita Balagansky, Sergey Kolesnikov 등의 모듈에서 저와 함께 일한 사람들에게 감사드립니다.
Julia Shenshina, Misha Kindulov, Aron Dik, Aleksei Tarasov 및 Verkhovtsev Leonid 등 별도의 프로젝트가되었을 때이 파이프 라인 작업을 계속하는 사람들에게 감사의 말씀을 전합니다.
또한 기능의 일부가 저를 이끄는 컴퓨터 비전 팀에 의해 개발 (및 사용)되었으므로 Newyorker에게 감사의 말씀을 전합니다.