精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

探索使用對(duì)比損失的孿生網(wǎng)絡(luò)進(jìn)行圖像相似性比較

人工智能
在這篇文章中,我們將深入了解Siamese網(wǎng)絡(luò)的細(xì)節(jié),探討對(duì)比損失的概念,并探討這兩個(gè)組件如何共同工作以創(chuàng)建一個(gè)有效的圖像相似性模型。

簡(jiǎn)介

在計(jì)算機(jī)視覺(jué)領(lǐng)域,準(zhǔn)確地測(cè)量圖像相似性是一項(xiàng)關(guān)鍵任務(wù),具有廣泛的實(shí)際應(yīng)用。從圖像搜索引擎到人臉識(shí)別系統(tǒng)和基于內(nèi)容的推薦系統(tǒng),有效比較和查找相似圖像的能力非常重要。Siamese網(wǎng)絡(luò)與對(duì)比損失結(jié)合,為以數(shù)據(jù)驅(qū)動(dòng)方式學(xué)習(xí)圖像相似性提供了強(qiáng)大的框架。在這篇博文中,我們將深入了解Siamese網(wǎng)絡(luò)的細(xì)節(jié),探討對(duì)比損失的概念,并探討這兩個(gè)組件如何共同工作以創(chuàng)建一個(gè)有效的圖像相似性模型。

Siamese神經(jīng)網(wǎng)絡(luò)是一類(lèi)旨在比較和測(cè)量輸入樣本對(duì)之間相似性的神經(jīng)網(wǎng)絡(luò)架構(gòu)。術(shù)語(yǔ)“Siamese”來(lái)源于網(wǎng)絡(luò)體系結(jié)構(gòu)包含兩個(gè)相同結(jié)構(gòu)且共享相同權(quán)重集的孿生神經(jīng)網(wǎng)絡(luò)的概念。每個(gè)網(wǎng)絡(luò)處理來(lái)自配對(duì)的輸入樣本之一,并通過(guò)比較它們的輸出來(lái)確定兩個(gè)輸入之間的相似性或不相似性。

什么是Siamese神經(jīng)網(wǎng)絡(luò)

Siamese網(wǎng)絡(luò)的主要?jiǎng)訖C(jī)是學(xué)習(xí)輸入樣本的有意義的表示,以捕捉它們的相似性比較所需的基本特征。這些網(wǎng)絡(luò)在直接使用標(biāo)記示例進(jìn)行訓(xùn)練有限或困難的任務(wù)中表現(xiàn)出色,因?yàn)樗鼈兛梢詫W(xué)會(huì)區(qū)分相似和不相似的實(shí)例,而無(wú)需顯式類(lèi)標(biāo)簽。Siamese網(wǎng)絡(luò)的架構(gòu)通常包括三個(gè)主要組件:共享網(wǎng)絡(luò)、相似度度量和對(duì)比損失函數(shù):

  • 共享網(wǎng)絡(luò):共享網(wǎng)絡(luò)是Siamese架構(gòu)的核心組件。它負(fù)責(zé)從輸入樣本中提取有意義的特征表示。共享網(wǎng)絡(luò)包含神經(jīng)單元的層,例如卷積層或全連接層,用于處理輸入數(shù)據(jù)并生成固定長(zhǎng)度的embedding向量。通過(guò)在孿生網(wǎng)絡(luò)之間共享相同的權(quán)重,模型學(xué)會(huì)為相似的輸入提取相似的特征,從而實(shí)現(xiàn)有效的比較。
  • 相似性度:一旦輸入由共享網(wǎng)絡(luò)處理,就會(huì)使用相似性度量來(lái)比較生成的embedding,并測(cè)量?jī)蓚€(gè)輸入之間的相似性或不相似性。相似度度量的選擇取決于特定任務(wù)和輸入數(shù)據(jù)的性質(zhì)。常見(jiàn)的相似性度量包括歐氏距離、余弦相似度或相關(guān)系數(shù)。相似性度量量化了embedding之間的距離或相關(guān)性,并提供了輸入樣本之間相似性的度量。
  • 對(duì)比損失函數(shù):為了訓(xùn)練Siamese網(wǎng)絡(luò),采用了對(duì)比損失函數(shù)。對(duì)比損失函數(shù)鼓勵(lì)網(wǎng)絡(luò)為相似的輸入生成距離更近的embedding,而為不相似的輸入生成距離更遠(yuǎn)的embedding。當(dāng)相似對(duì)之間的距離超過(guò)一定閾值或不相似對(duì)之間的距離低于另一個(gè)閾值時(shí),對(duì)比損失函數(shù)對(duì)模型進(jìn)行懲罰。對(duì)比損失函數(shù)的確切制定取決于所選的相似性度量和相似對(duì)與不相似對(duì)之間的期望邊際。

在訓(xùn)練過(guò)程中,Siamese網(wǎng)絡(luò)學(xué)會(huì)優(yōu)化其參數(shù)以最小化對(duì)比損失,并生成能夠有效捕捉輸入數(shù)據(jù)的相似性結(jié)構(gòu)的判別性embedding。

對(duì)比損失函數(shù)

對(duì)比損失是Siamese網(wǎng)絡(luò)中常用于學(xué)習(xí)輸入樣本對(duì)之間相似性或不相似性的損失函數(shù)。它旨在以這樣一種方式優(yōu)化網(wǎng)絡(luò)的參數(shù),即相似的輸入具有在特征空間中更接近的embedding,而不相似的輸入則被推到更遠(yuǎn)的位置。通過(guò)最小化對(duì)比損失,網(wǎng)絡(luò)學(xué)會(huì)生成能夠有效捕捉輸入數(shù)據(jù)的相似性結(jié)構(gòu)的embedding。

為了詳細(xì)了解對(duì)比損失函數(shù),讓我們將其分解為其關(guān)鍵組件和步驟:

  • 輸入對(duì):對(duì)比損失函數(shù)作用于輸入樣本對(duì),其中每對(duì)包含一個(gè)相似或正例和一個(gè)不相似或負(fù)例。這些對(duì)通常在訓(xùn)練過(guò)程中生成,其中正例對(duì)代表相似實(shí)例,而負(fù)例對(duì)代表不相似實(shí)例。
  • embedding:Siamese網(wǎng)絡(luò)通過(guò)共享網(wǎng)絡(luò)處理每個(gè)輸入樣本,為配對(duì)中的兩個(gè)樣本生成embedding向量。這些embedding是固定長(zhǎng)度的表示,捕捉輸入樣本的基本特征。
  • 距離度量:使用距離度量,如歐氏距離或余弦相似度,來(lái)衡量生成的embedding之間的不相似性或相似性。距離度量的選擇取決于輸入數(shù)據(jù)的性質(zhì)和任務(wù)的具體要求。
  • 對(duì)比損失計(jì)算:對(duì)比損失函數(shù)計(jì)算每對(duì)embedding的損失,鼓勵(lì)相似對(duì)具有更小的距離,而不相似對(duì)具有更大的距離。對(duì)比損失的一般公式如下:L = (1 — y) * D2 + y * max(0, m — D)

其中:

  •  L:對(duì)于一對(duì)的對(duì)比損失。
  •  D:embedding之間的距離或不相似性。
  •  y:標(biāo)簽,指示配對(duì)是否相似(相似為0,不相似為1)。
  • m:定義不相似性閾值的邊際參數(shù)。

損失項(xiàng) `(1 — y) * D2` 對(duì)相似對(duì)進(jìn)行懲罰,如果它們的距離超過(guò)邊際(m),則鼓勵(lì)網(wǎng)絡(luò)減小它們的距離。項(xiàng) `y * max(0, m — D)2` 對(duì)不相似對(duì)進(jìn)行懲罰,如果它們的距離低于邊際,則推動(dòng)網(wǎng)絡(luò)增加它們的距離。

  • 損失的匯總:為了獲得整個(gè)輸入對(duì)批次的整體對(duì)比損失,通常會(huì)對(duì)所有對(duì)之間的個(gè)體損失進(jìn)行平均或求和。匯總方法的選擇取決于特定的訓(xùn)練目標(biāo)和優(yōu)化策略。

通過(guò)通過(guò)梯度下降優(yōu)化方法(例如反向傳播和隨機(jī)梯度下降)最小化對(duì)比損失,Siamese網(wǎng)絡(luò)學(xué)會(huì)生成能夠有效捕捉輸入數(shù)據(jù)的相似性結(jié)構(gòu)的判別性embedding。對(duì)比損失函數(shù)在訓(xùn)練Siamese網(wǎng)絡(luò)中發(fā)揮著關(guān)鍵作用,使其能夠?qū)W習(xí)可用于各種任務(wù),如圖像相似性、人臉驗(yàn)證和文本相似性的有意義表示。對(duì)比損失函數(shù)的具體制定和參數(shù)可以根據(jù)數(shù)據(jù)的特性和任務(wù)的要求進(jìn)行調(diào)整。

在 PyTorch 中的孿生神經(jīng)網(wǎng)絡(luò)

1. 數(shù)據(jù)集創(chuàng)建

我們使用的數(shù)據(jù)集來(lái)自來(lái)自 :

http://vision.stanford.edu/aditya86/ImageNetDogs/ 

def copy_files(source_folder,files_list,des):
    for file in files_list:
        source_file=os.path.join(source_folder,file)
        
        des_file=os.path.join(des,file)
        shutil.copy2(source_file,des_file)
        
        print(f"Copied {file} to {des}")
    return 
    
def move_files(source_folder,des):
    files_list=os.listdir(source_folder)
    for file in files_list:
        source_file=os.path.join(source_folder,file)
        
        des_file=os.path.join(des,file)
        shutil.move(source_file,des_file)
        
        print(f"Copied {file} to {des}")
    return 
  
  def rename_file(file_path,new_name):
    directory=os.path.dirname(file_path)
    new_file_path=os.path.join(directory,new_name)
    
    os.rename(file_path,new_file_path)
    print(f"File renamed to {new_file_path}")
    return
  
folder_path=r"C:\Users\sri.karan\Downloads\images1\Images\*"
op_path_similar=r"C:\Users\sri.karan\Downloads\images1\Images\similar_all_images"
tmp=r"C:\Users\sri.karan\Downloads\images1\Images\tmp"


op_path_dissimilar=r"C:\Users\sri.karan\Downloads\images1\Images\dissimilar_all_images"
folders_list=glob.glob(folder_path)
folders_list=list(set(folders_list).difference(set(['C:\\Users\\sri.karan\\Downloads\\images1\\Images\\similar_all_images','C:\\Users\\sri.karan\\Downloads\\images1\\Images\\tmp','C:\\Users\\sri.karan\\Downloads\\images1\\Images\\dissimilar_all_images'])))

l,g=0,0

random.shuffle(folders_list)
for i in glob.glob(folder_path):
    if i in ['C:\\Users\\sri.karan\\Downloads\\images1\\Images\\similar_all_images','C:\\Users\\sri.karan\\Downloads\\images1\\Images\\tmp','C:\\Users\\sri.karan\\Downloads\\images1\\Images\\dissimilar_all_images']:
        continue
    
    file_name=i.split('\\')[-1].split("-")[1]
    picked_files=pick_random_files(i,6)
    
    copy_files(i,picked_files,tmp)
    
    for m in range(3):
        rename_file(os.path.join(tmp,picked_files[m*2]),"similar_"+str(g)+"_first.jpg")
        rename_file(os.path.join(tmp,picked_files[m*2+1]),"similar_"+str(g)+"_second.jpg")
        g+=1
    move_files(tmp,op_path_similar)
    choice_one,choice_two=random.choice(range(len(folders_list))),random.choice(range(len(folders_list)))
    picked_dissimilar_one=pick_random_files(folders_list[choice_one],3)
    picked_dissimilar_two=pick_random_files(folders_list[choice_two],3)
    copy_files(folders_list[choice_one],picked_dissimilar_one,tmp)
    copy_files(folders_list[choice_two],picked_dissimilar_two,tmp)
    picked_files_dissimilar=picked_dissimilar_one+picked_dissimilar_two

    for m in range(3):
        rename_file(os.path.join(tmp,picked_files_dissimilar[m]),"dissimilar_"+str(l)+"_first.jpg")
        rename_file(os.path.join(tmp,picked_files_dissimilar[m+3]),"dissimilar_"+str(l)+"_second.jpg")
        l+=1
    move_files(tmp,op_path_dissimilar)

我們挑選了3對(duì)相似圖像(狗品種)和3對(duì)不相似圖像(狗品種)來(lái)微調(diào)模型,為了使負(fù)樣本簡(jiǎn)單,對(duì)于給定的錨定圖像(狗品種),任何除地面實(shí)況狗品種以外的其他狗品種都被視為負(fù)標(biāo)簽。

注意: “相似圖像” 意味著來(lái)自相同狗品種的圖像被視為正對(duì),而“不相似圖像” 意味著來(lái)自不同狗品種的圖像被視為負(fù)對(duì)。

代碼解釋?zhuān)?/p>

  • 46行:從每個(gè)狗圖像文件夾中隨機(jī)挑選了6張圖像。
  • 47行:選擇的圖像被移動(dòng)到一個(gè)名為 “tmp” 的文件夾中,并且由于它們來(lái)自同一狗品種文件夾,因此被重命名為 “similar_images”。
  • 55行:完成所有這些后,它們被移動(dòng)到 “similar_all_images” 文件夾中。
  • 56、57行:類(lèi)似地,為了獲得不相似的圖像對(duì),從兩個(gè)不同的狗品種文件夾中選擇了3張圖像。
  • 然后重復(fù)上述流程,以獲得不相似的圖像對(duì)并將它們移動(dòng)到 “dissimilar_all_images” 文件夾中。

完成所有這些后,我們可以繼續(xù)創(chuàng)建數(shù)據(jù)集對(duì)象。

import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader
from PIL import Image
import numpy as np
import random


from torch.utils.data import DataLoader, Dataset
import torch
import torch.nn as nn
from torch import optim
import torch.nn.functional as F


class ImagePairDataset(torch.utils.data.Dataset):
    def __init__(self, root_dir):
        self.root_dir = root_dir

        self.transform = T.Compose(
    [
        # We first resize the input image to 256x256 and then we take center crop.
        
        transforms.Resize((256,256)),
         transforms.ToTensor()
                                    
    ]
)
        self.image_pairs = self.load_image_pairs()

    def __len__(self):
        return len(self.image_pairs)

    def __getitem__(self, idx):
        image1_path, image2_path, label = self.image_pairs[idx]
        image1 = Image.open(image1_path).convert("RGB")
        image2 = Image.open(image2_path).convert("RGB")
        
    
        # Convert the tensor to a PIL image
        # image1 = functional.to_pil_image(image1)
        # image2 = functional.to_pil_image(image2)
        
        image1 = self.transform(image1)
        image2 = self.transform(image2)
        # image1 = torch.clamp(image1, 0, 1)
        # image2 = torch.clamp(image2, 0, 1)
        return image1, image2, label

    def load_image_pairs(self):
        image_pairs = []
        # Assume the directory structure is as follows:
        # root_dir
        # ├── similar
        # │   ├── similar_image1.jpg
        # │   ├── similar_image2.jpg
        # │   └── ...
        # └── dissimilar
        #     ├── dissimilar_image1.jpg
        #     ├── dissimilar_image2.jpg
        #     └── ...
        similar_dir = os.path.join(self.root_dir, "similar_all_images")
        dissimilar_dir = os.path.join(self.root_dir, "dissimilar_all_images")

        # Load similar image pairs with label 1
        similar_images = os.listdir(similar_dir)
        for i in range(len(similar_images) // 2):
            image1_path = os.path.join(similar_dir, f"similar_{i}_first.jpg")
            image2_path = os.path.join(similar_dir, f"similar_{i}_second.jpg")
            image_pairs.append((image1_path, image2_path, 0))

        # Load dissimilar image pairs with label 0
        dissimilar_images = os.listdir(dissimilar_dir)
        for i in range(len(dissimilar_images) // 2):
            image1_path = os.path.join(dissimilar_dir, f"dissimilar_{i}_first.jpg")
            image2_path = os.path.join(dissimilar_dir, f"dissimilar_{i}_second.jpg")
            image_pairs.append((image1_path, image2_path, 1))

        return image_pairs
      
dataset = ImagePairDataset(r"/home/niq/hcsr2001/data/image_similarity")
train_size = int(0.8 * len(dataset))
test_size = len(dataset) - train_size
train_dataset, test_dataset = torch.utils.data.random_split(dataset, [train_size, test_size])

batch_size = 32
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)

在上述代碼的第8到10行:對(duì)圖像進(jìn)行預(yù)處理,包括將圖像調(diào)整大小為256。我們使用批量大小為32,這取決于您的計(jì)算能力和 GPU。


#create the Siamese Neural Network
class SiameseNetwork(nn.Module):

    def __init__(self):
        super(SiameseNetwork, self).__init__()

        # Setting up the Sequential of CNN Layers
        # self.cnn1 = nn.Sequential(
        #     nn.Conv2d(3, 256, kernel_size=11,stride=4),
        #     nn.ReLU(inplace=True),
        #     nn.MaxPool2d(3, stride=2),
            
        #     nn.Conv2d(256, 256, kernel_size=5, stride=1),
        #     nn.ReLU(inplace=True),
        #     nn.MaxPool2d(2, stride=2),

        #     nn.Conv2d(256, 384, kernel_size=3,stride=1),
        #     nn.ReLU(inplace=True)
        # )
        
        self.cnn1=nn.Conv2d(3, 256, kernel_size=11,stride=4)
        self.relu = nn.ReLU()
        self.maxpool1=nn.MaxPool2d(3, stride=2)
        self.cnn2=nn.Conv2d(256, 256, kernel_size=5,stride=1)
        self.maxpool2=nn.MaxPool2d(2, stride=2)
        self.cnn3=nn.Conv2d(256, 384, kernel_size=3,stride=1)
        self.fc1 =nn.Linear(46464, 1024)
        self.fc2=nn.Linear(1024, 256)
        self.fc3=nn.Linear(256, 1)
        # Setting up the Fully Connected Layers
        # self.fc1 = nn.Sequential(
        #     nn.Linear(384, 1024),
        #     nn.ReLU(inplace=True),
            
        #     nn.Linear(1024, 32*46464),
        #     nn.ReLU(inplace=True),
            
        #     nn.Linear(32*46464,1)
        # )
        
    def forward_once(self, x):
        # This function will be called for both images
        # Its output is used to determine the similiarity
        # output = self.cnn1(x)
        # print(output.view(output.size()[0], -1).shape)
        # output = output.view(output.size()[0], -1)
        # output = self.fc1(output)
        # print(x.shape)
        output= self.cnn1(x)
        # print(output.shape)
        output=self.relu(output)
        # print(output.shape)
        output=self.maxpool1(output)
        # print(output.shape)
        output= self.cnn2(output)
        # print(output.shape)
        output=self.relu(output)
        # print(output.shape)
        output=self.maxpool2(output)
        # print(output.shape)
        output= self.cnn3(output)
        output=self.relu(output)
        # print(output.shape)
        output=output.view(output.size()[0], -1)
        # print(output.shape)
        output=self.fc1(output)
        # print(output.shape)
        output=self.fc2(output)
        # print(output.shape)
        output=self.fc3(output)
        return output

    def forward(self, input1, input2):
        # In this function we pass in both images and obtain both vectors
        # which are returned
        output1 = self.forward_once(input1)
        output2 = self.forward_once(input2)

        return output1, output2

我們的網(wǎng)絡(luò)稱(chēng)為 SiameseNetwork,我們可以看到它幾乎與標(biāo)準(zhǔn) CNN 相同。唯一可以注意到的區(qū)別是我們有兩個(gè)前向函數(shù)(forward_once 和 forward)。為什么呢?

我們提到通過(guò)相同網(wǎng)絡(luò)傳遞兩個(gè)圖像。forward_once 函數(shù)在 forward 函數(shù)中調(diào)用,它將一個(gè)圖像作為輸入傳遞到網(wǎng)絡(luò)。輸出存儲(chǔ)在 output1 中,而來(lái)自第二個(gè)圖像的輸出存儲(chǔ)在 output2 中,正如我們?cè)?forward 函數(shù)中看到的那樣。通過(guò)這種方式,我們?cè)O(shè)法輸入了兩個(gè)圖像并從我們的模型獲得了兩個(gè)輸出。

我們已經(jīng)看到了損失函數(shù)應(yīng)該是什么樣子,現(xiàn)在讓我們來(lái)編碼它。我們創(chuàng)建了一個(gè)名為 ContrastiveLoss 的類(lèi),與模型類(lèi)一樣,我們將有一個(gè) forward 函數(shù)。

class ContrastiveLoss(torch.nn.Module):
    def __init__(self, margin=2.0):
        super(ContrastiveLoss, self).__init__()
        self.margin = margin

    def forward(self, output1, output2, label):
      # Calculate the euclidean distance and calculate the contrastive loss
      euclidean_distance = F.pairwise_distance(output1, output2, keepdim = True)

      loss_contrastive = torch.mean((1-label) * torch.pow(euclidean_distance, 2) +
                                    (label) * torch.pow(torch.clamp(self.margin - euclidean_distance, min=0.0), 2))


      return loss_contrastive
      
net = SiameseNetwork().cuda()
criterion = ContrastiveLoss()
optimizer = optim.Adam(net.parameters(), lr = 0.0005 )

按照頂部的流程圖,我們可以開(kāi)始創(chuàng)建訓(xùn)練循環(huán)。我們迭代100次并提取兩個(gè)圖像以及標(biāo)簽。我們將梯度歸零,將兩個(gè)圖像傳遞到網(wǎng)絡(luò)中,網(wǎng)絡(luò)輸出兩個(gè)向量。然后,將兩個(gè)向量和標(biāo)簽饋送到我們定義的 criterion(損失函數(shù))中。我們進(jìn)行反向傳播和優(yōu)化。出于一些可視化目的,并查看我們的模型在訓(xùn)練集上的性能,因此我們將每10批次打印一次損失。

counter = []
loss_history = [] 
iteration_number= 0

# Iterate throught the epochs
for epoch in range(100):

    # Iterate over batches
    for i, (img0, img1, label) in enumerate(train_loader, 0):

        # Send the images and labels to CUDA
        img0, img1, label = img0.cuda(), img1.cuda(), label.cuda()

        # Zero the gradients
        optimizer.zero_grad()

        # Pass in the two images into the network and obtain two outputs
        output1, output2 = net(img0, img1)

        # Pass the outputs of the networks and label into the loss function
        loss_contrastive = criterion(output1, output2, label)

        # Calculate the backpropagation
        loss_contrastive.backward()

        # Optimize
        optimizer.step()

        # Every 10 batches print out the loss
        if i % 10 == 0 :
            print(f"Epoch number {epoch}\n Current loss {loss_contrastive.item()}\n")
            iteration_number += 10

            counter.append(iteration_number)
            loss_history.append(loss_contrastive.item())

show_plot(counter, loss_history)

我們現(xiàn)在可以分析結(jié)果。我們能看到的第一件事是損失從1.6左右開(kāi)始,并以接近1的數(shù)字結(jié)束。看到模型的實(shí)際運(yùn)行情況將是有趣的。現(xiàn)在是我們?cè)谀P椭皼](méi)見(jiàn)過(guò)的圖像上測(cè)試我們的模型的部分。與之前一樣,我們使用我們的自定義數(shù)據(jù)集類(lèi)創(chuàng)建了一個(gè) Siamese Network 數(shù)據(jù)集,但現(xiàn)在我們將其指向測(cè)試文件夾。

作為接下來(lái)的步驟,我們從第一批中提取第一張圖像,并迭代5次以提取接下來(lái)5批中的5張圖像,因?yàn)槲覀冊(cè)O(shè)置每批包含一張圖像。然后,使用 torch.cat() 水平組合兩個(gè)圖像,我們可以清楚地可視化哪個(gè)圖像與哪個(gè)圖像進(jìn)行了比較。

我們將兩個(gè)圖像傳入模型并獲得兩個(gè)向量,然后將這兩個(gè)向量傳入 F.pairwise_distance() 函數(shù),這將計(jì)算兩個(gè)向量之間的歐氏距離。使用這個(gè)距離,我們可以作為衡量?jī)蓮埬樣卸嗖幌嗨频闹笜?biāo)。

test_loader_one = DataLoader(test_dataset, batch_size=1, shuffle=False)
dataiter = iter(test_loader_one)
x0, _, _ = next(dataiter)

for i in range(5):
    # Iterate over 5 images and test them with the first image (x0)
    _, x1, label2 = next(dataiter)

    # Concatenate the two images together
    concatenated = torch.cat((x0, x1), 0)
    
    output1, output2 = net(x0.cuda(), x1.cuda())
    euclidean_distance = F.pairwise_distance(output1, output2)
    imshow(torchvision.utils.make_grid(concatenated), f'Dissimilarity: {euclidean_distance.item():.2f}')
view raweval.py hosted with ? by GitHub

總結(jié)

Siamese 網(wǎng)絡(luò)與對(duì)比損失結(jié)合,為學(xué)習(xí)圖像相似性提供了一個(gè)強(qiáng)大而有效的框架。通過(guò)對(duì)相似和不相似圖像進(jìn)行訓(xùn)練,這些網(wǎng)絡(luò)可以學(xué)會(huì)提取能夠捕捉基本視覺(jué)特征的判別性embedding。對(duì)比損失函數(shù)通過(guò)優(yōu)化embedding空間進(jìn)一步增強(qiáng)

了模型準(zhǔn)確測(cè)量圖像相似性的能力。隨著深度學(xué)習(xí)和計(jì)算機(jī)視覺(jué)的進(jìn)步,Siamese 網(wǎng)絡(luò)在各個(gè)領(lǐng)域都有著巨大的潛力,包括圖像搜索、人臉驗(yàn)證和推薦系統(tǒng)。通過(guò)利用這些技術(shù),我們可以為基于內(nèi)容的圖像檢索、視覺(jué)理解以及視覺(jué)領(lǐng)域的智能決策開(kāi)啟令人興奮的可能性。

責(zé)任編輯:趙寧寧 來(lái)源: 小白玩轉(zhuǎn)Python
相關(guān)推薦

2024-06-24 13:06:04

2023-12-01 14:48:52

Python圖像

2022-01-13 19:25:44

Umay惡意軟件分析平臺(tái)

2020-09-27 10:38:48

網(wǎng)絡(luò)安全

2018-03-23 11:56:09

相似性推薦推薦算法推薦

2024-12-31 08:20:00

暹羅網(wǎng)絡(luò)機(jī)器學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)

2024-07-12 08:00:00

2025-02-18 16:00:00

代碼Python架構(gòu)

2023-11-13 15:01:28

機(jī)器學(xué)習(xí)

2024-05-23 08:48:21

2023-11-21 16:06:04

計(jì)算機(jī)視覺(jué)人工智能

2021-02-19 13:00:42

加密貨幣比特幣貨幣

2017-11-15 07:20:22

Facebook相似性搜索算法

2023-09-27 22:53:04

圖像處理是開(kāi)源Java

2024-09-09 15:02:52

2022-07-06 13:13:36

SWIL神經(jīng)網(wǎng)絡(luò)數(shù)據(jù)集

2022-07-04 18:33:40

深度學(xué)習(xí)人工智能科學(xué)

2025-03-12 10:10:21

AI 驅(qū)動(dòng)X-CLR視覺(jué)數(shù)據(jù)

2021-05-10 17:40:14

AI 數(shù)據(jù)人工智能

2023-03-26 00:15:43

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

欧美中文一区二区| 天堂中文在线资| 日本精品三区| 日韩精品一区二区三区swag | 91国内精品久久| 一区二区视频观看| www.26天天久久天堂| 亚洲欧美另类久久久精品| 99久久精品免费看国产一区二区三区| 日韩三级av在线| 人人狠狠综合久久亚洲婷婷| 欧美成人三级在线| 亚欧在线免费观看| 欧美hdxxx| 国产欧美一区二区精品仙草咪| 成人写真视频福利网| 日本熟妇毛耸耸xxxxxx| 欧美aaaa视频| 亚洲另类激情图| 中文字幕在线视频一区二区| jizz内谢中国亚洲jizz| 一区二区在线免费观看| 日本高清久久一区二区三区| 国产手机视频在线| 久久中文欧美| 欧美大胆在线视频| 农村老熟妇乱子伦视频| 老司机精品在线| 欧美一区二区三区在线视频| 成人小视频在线看| 国产理论电影在线| 亚洲欧美偷拍卡通变态| 亚洲a∨一区二区三区| 午夜福利理论片在线观看| 国产激情一区二区三区四区| 国产精品久久久久久搜索 | 91久久亚洲| 久久精品在线播放| 国产精品www爽爽爽| 欧美成人基地| 欧美videofree性高清杂交| 国产三级生活片| 欧美jizz18| 欧美三区在线观看| 青青青国产在线视频| 欧美裸体视频| 五月婷婷色综合| av女优在线播放| 人人超在线公开视频| 日韩美女视频一区| 一级黄色片播放| 黄网站在线免费| 1区2区3区欧美| 99精品视频网站| 亚洲天天影视| 日韩一区在线免费观看| 亚洲春色在线| 麻豆影视在线观看_| 亚洲欧洲一区二区三区| 99re99热| 天堂av资源在线观看| 一区二区三区久久久| av在线免费观看国产| 色黄网站在线观看| 亚洲成人动漫精品| 国产高清精品在线观看| 丝袜美腿一区| 欧美日韩一区二区三区在线 | 欧美高清你懂的| 欧美日韩一区二区三区高清| 在线观看国产一级片| 四虎地址8848精品| 日韩免费观看高清完整版 | 国产乱淫av片免费| 国产精品88av| 精品国产91亚洲一区二区三区www| 国产综合视频在线| 久久久久久久久免费| 亚洲不卡1区| 在线国产情侣| 一区二区三区精品| 国产无套内射久久久国产| 婷婷午夜社区一区| 91麻豆精品久久久久蜜臀| 第一页在线视频| 久久夜色电影| 日韩在线观看免费全集电视剧网站| 亚洲AV成人无码精电影在线| 欧美国产专区| 欧美亚洲激情在线| 91尤物国产福利在线观看| 国产精品99久| 日韩精品极品视频在线观看免费| 在线免费观看的av网站| 亚洲成人免费视| 在线视频日韩一区| 成人在线超碰| 中国人与牲禽动交精品| 精品午夜福利在线观看| 视频一区视频二区中文字幕| 95av在线视频| 国产一二三区在线| 亚洲专区一二三| 天天天干夜夜夜操| 国产精品网址| 久久久www成人免费精品| 狠狠躁夜夜躁人人爽天天高潮| 麻豆成人久久精品二区三区小说| 国产日韩精品推荐| 男人天堂久久久| 五月激情综合色| 91在线第一页| 欧美精品色图| 欧美成人一二三| 最近国语视频在线观看免费播放| 懂色一区二区三区免费观看| 亚洲精品在线视频观看| 日本三级一区| 日韩欧美在线1卡| 萌白酱视频在线| 裸体素人女欧美日韩| 成人av电影免费| 欧美成人性生活视频| 色妞www精品视频| 白嫩情侣偷拍呻吟刺激| 亚洲经典一区| 国产精品电影一区| 日韩欧美在线番号| 五月天一区二区三区| 国产黄色一区二区三区 | 视频在线观看一区二区| 男人午夜免费视频| 暴力调教一区二区三区| 九一免费在线观看| 国产精品**亚洲精品| 中文字幕亚洲欧美日韩在线不卡| 国产免费一级视频| 久久综合九色综合97_久久久| 欧妇女乱妇女乱视频| 精品中文在线| 美日韩丰满少妇在线观看| 97精品人妻一区二区三区香蕉| 久久婷婷综合激情| 成人免费观看毛片| 在线日韩网站| 国产v综合ⅴ日韩v欧美大片| 欧美孕妇孕交| 91国产视频在线观看| 丰腴饱满的极品熟妇| 新狼窝色av性久久久久久| 精品无码久久久久国产| 国模精品视频| 亚洲欧美一区二区精品久久久| 欧美一级特黄视频| 久久麻豆一区二区| 黄色一级二级三级| 久久中文字幕av| 成人网中文字幕| 女同一区二区免费aⅴ| 欧美变态tickle挠乳网站| 久久香蕉精品视频| 99久久久久久| 国产免费成人在线| 欧美丝袜一区| 91久久久在线| 美女网站视频在线| 精品无人区太爽高潮在线播放 | 欧美12av| 欧美性片在线观看| 久久躁狠狠躁夜夜爽| 精品人妻av一区二区三区| 亚洲最快最全在线视频| 国产一级伦理片| 日韩不卡在线观看日韩不卡视频| 亚洲精蜜桃久在线| 视频精品二区| 国产91精品视频在线观看| 成人在线播放视频| 欧美一级日韩免费不卡| 欧美福利视频一区二区| 欧美极品少妇xxxxⅹ高跟鞋 | 久久久91精品| 日本人妻熟妇久久久久久| 色妹子一区二区| 国产精品视频一区二区三| 成人av网在线| 日本新janpanese乱熟| 亚洲精品中文字幕乱码| 精品伦精品一区二区三区视频| 电影在线观看一区二区| 欧美日韩福利电影| 国产视频网站在线| 日韩美女一区二区三区四区| 亚洲国产av一区二区三区| 亚洲天堂av老司机| 一卡二卡三卡四卡| 国产乱理伦片在线观看夜一区| 日本wwww视频| 欧美国产高清| 性欧美大战久久久久久久免费观看| 综合欧美亚洲| 国产精品女主播视频| 高清在线视频不卡| www亚洲精品| 青青草在线免费观看| 制服丝袜成人动漫| 欧美日韩一级黄色片| 亚洲综合免费观看高清完整版在线| 男女黄床上色视频| 国产91精品露脸国语对白| 午夜免费福利在线| 香蕉国产精品偷在线观看不卡| 青少年xxxxx性开放hg| 国产一区毛片| 国产精品国产亚洲精品看不卡15| 成人免费毛片嘿嘿连载视频…| 久久久人成影片一区二区三区| 麻豆视频在线| 一区二区三区国产视频| 亚州精品国产精品乱码不99按摩| 91精品国产综合久久福利软件| 精品一区二区无码| 欧美日韩免费看| 日本少妇全体裸体洗澡| 亚洲综合精品自拍| 国产黄在线免费观看| 国产精品沙发午睡系列990531| 成年人网站免费看| 99re这里只有精品6| 日韩成人av影院| 国产成人免费视| 韩国一区二区在线播放| 久久国内精品自在自线400部| 激情网站五月天| 亚洲欧美日本国产专区一区| 九一国产精品视频| 亚洲午夜极品| a级黄色小视频| 亚洲午夜av| www.日本在线播放| 亚洲激情一区| 99热亚洲精品| 在线视频精品| 国产69精品久久久久久久| 亚洲国产网站| 青青青国产在线观看| 亚洲精品国产日韩| 黄色网页免费在线观看| av不卡在线看| 日本精品免费在线观看| 蜜桃伊人久久| 亚洲一区二区三区四区五区xx| 视频一区欧美精品| 成人免费在线观看视频网站| 青青草97国产精品免费观看无弹窗版 | 亚洲黄色一区| 国产资源在线视频| 久久国产高清| 黄色片在线免费| 久久国产剧场电影| av在线网站免费观看| 国产成人免费视频| 好吊色视频一区二区三区| 2024国产精品| 四虎成人免费影院| 亚洲少妇30p| 国产午夜小视频| 一本到一区二区三区| 亚洲视屏在线观看| 在线成人av网站| 黄色美女一级片| 亚洲欧美第一页| 秋霞午夜在线观看| 欧美高清在线观看| 伊人久久视频| 国产日韩欧美在线看| 一区二区精彩视频| 蜜桃狠狠色伊人亚洲综合网站| 成人高清电影网站| 在线观看17c| 久久精品人人| 激情久久综合网| 91香蕉视频污在线| 日日操免费视频| 亚洲国产日韩一区二区| 欧美brazzers| 欧美一级二级三级蜜桃| 91偷拍精品一区二区三区| 在线播放日本| 国内精品伊人久久| 国产精品久久久久久久久免费高清 | 91人妻一区二区三区蜜臀| 亚洲va欧美va人人爽午夜| 波多野结衣一区二区在线 | 国产精品久久久久免费a∨| 日本成人手机在线| 欧美黑人xxxxx| 你懂的网址国产 欧美| 久久人妻精品白浆国产| 国产馆精品极品| 一级黄色片网址| 亚洲成人综合网站| 国产色视频在线| 国产一区二区黄| 日韩电影免费看| 91精品国产一区二区三区动漫| 国产精选一区| 免费看黄在线看| 国产一区二区三区在线观看免费视频| 爱爱免费小视频| 亚洲一区二区三区四区在线 | 亚洲最新视频在线| √天堂8资源中文在线| 亚洲自拍欧美色图| 色欧美自拍视频| 蜜臀久久99精品久久久酒店新书| 国产精品亚洲专一区二区三区| 国产精品天天干| 红桃av永久久久| 亚洲精品18p| 欧美成人精品一区二区三区| 91精品韩国| 欧美伦理一区二区| 99精品99| 图片区偷拍区小说区| 亚洲欧美一区二区三区久本道91| 亚洲自拍一区在线观看| 亚洲精品久久久久国产| 黄页网站大全在线免费观看| 国产欧美日韩中文字幕在线| 深爱激情综合网| 欧美黄网站在线观看| 99免费精品在线观看| 精品少妇theporn| 日韩欧美一卡二卡| 制服丝袜在线播放| 亚洲free性xxxx护士hd| 五月激情久久久| 亚洲18在线看污www麻豆| 国产精品另类一区| 亚洲天堂avav| 精品国产一区二区三区久久| 久久亚洲国产精品尤物| 一区二区三区四区欧美| 麻豆极品一区二区三区| 国产精品18在线| 欧美精品日韩综合在线| 国产在线观看91| 97久草视频| 亚洲国产激情| 添女人荫蒂视频| 色婷婷av一区二区三区之一色屋| 久久这里精品| 国产精品主播视频| 国产精品久久久久9999赢消| а 天堂 在线| 伊人开心综合网| 神马午夜一区二区| 日本道色综合久久影院| 欧美另类69xxxxx| 免费av不卡在线| 一级做a爱片久久| 天天干天天舔天天射| 国产精品∨欧美精品v日韩精品| 欧美日韩国产传媒| 视频免费1区二区三区| 夜夜爽夜夜爽精品视频| 亚洲 欧美 自拍偷拍| 国产91在线视频| 国产精品麻豆久久| 久久久久久久人妻无码中文字幕爆| 五月激情综合网| 亚洲图片88| 国产免费一区二区| 日韩高清不卡一区二区| 永久免费看mv网站入口| 欧美精品一区二区三区蜜臀 | 91国在线观看| 国产福利在线播放麻豆| 国产日产精品一区二区三区四区| 巨乳诱惑日韩免费av| 神马久久精品综合| 亚洲激情成人网| 美女视频一区| 国产日韩亚洲欧美在线| 国产三级三级三级精品8ⅰ区| 91精品国产乱码久久久久| 久久久久久亚洲精品不卡| 国产成人1区| 久久黄色一级视频| 色悠悠亚洲一区二区| 99热国产在线| 日本精品国语自产拍在线观看| 韩国一区二区三区| 在线能看的av| 久久久国产一区二区| 亚洲人成精品久久久| 污视频在线观看免费网站| 欧美午夜精品伦理| 日韩电影免费观看|