【问题标题】:I've 2 folders.One image in 1 folder and another in another folder. I have to compare two images and find the dissimilarity我有 2 个文件夹。一个图像在 1 个文件夹中,另一个图像在另一个文件夹中。我必须比较两张图片并找出不同之处
【发布时间】:2021-03-14 15:32:09
【问题描述】:

我有 2 个文件夹。一个图像在 1 个文件夹中,另一个在另一个文件夹中。我必须比较两张图像并找到不同之处,但代码是随机文件夹编写的。

class InferenceSiameseNetworkDataset(Dataset):
    
    def __init__(self,imageFolderDataset,transform=None,should_invert=True):
        self.imageFolderDataset = imageFolderDataset    
        self.transform = transform
        self.should_invert = should_invert
        
    def __getitem__(self,index):
        img0_tuple = random.choice(self.imageFolderDataset.imgs)
        img1_tuple = random.choice(self.imageFolderDataset.imgs)
        #we need to make sure approx 50% of images are in the same class
        should_get_same_class = random.randint(0,1) 
        if should_get_same_class:
            while True:
                #keep looping till the same class image is found
                img1_tuple = random.choice(self.imageFolderDataset.imgs) 
                if img0_tuple[1]==img1_tuple[1]:
                    break
        else:
            while True:
                #keep looping till a different class image is found
                
                img1_tuple = random.choice(self.imageFolderDataset.imgs) 
                if img0_tuple[1] !=img1_tuple[1]:
                    break

        img0 = Image.open(img0_tuple[0])
        img1 = Image.open(img1_tuple[0])
        img0 = img0.convert("L")
        img1 = img1.convert("L")
        
        if self.should_invert:
            img0 = PIL.ImageOps.invert(img0)
            img1 = PIL.ImageOps.invert(img1)

        if self.transform is not None:
            img0 = self.transform(img0)
            img1 = self.transform(img1)
        
        return img0, img1 , torch.from_numpy(np.array([int(img1_tuple[1]!=img0_tuple[1])],dtype=np.float32))
    
    def __len__(self):
        return len(self.imageFolderDataset.imgs)

我从 GitHub 获取了这段代码,当我尝试比较两个图像的差异时,它会随机选择图像。输入文件夹是 2。一个图像应该在一个文件夹中,另一个图像应该在另一个文件夹中。当我尝试测试时,它有时会在同一张图像上进行测试,我的意思是它没有检查另一个文件夹中的另一个图像。

testing_dir1 = '/content/drive/My Drive/Signature Dissimilarity/Forged_Signature_Verification/processed_dataset/training1/'
folder_dataset_test = dset.ImageFolder(root=testing_dir1)
siamese_dataset = InferenceSiameseNetworkDataset(imageFolderDataset=folder_dataset_test,
                                        transform=transforms.Compose([transforms.Resize((100,100)),
                                                                      transforms.ToTensor()
                                                                      ])
                                       ,should_invert=False)

test_dataloader = DataLoader(siamese_dataset,num_workers=6,batch_size=1,shuffle=False)
dataiter = iter(test_dataloader)
x0,_,_ = next(dataiter)

for i in range(2):
  _,x1,label2 = next(dataiter)
  concatenated = torch.cat((x0,x1),0)
  
  output1,output2 = net(Variable(x0).cuda(),Variable(x1).cuda())
  euclidean_distance = F.pairwise_distance(output1, output2)
  imshow(torchvision.utils.make_grid(concatenated),'Dissimilarity: {:.2f}'.format(euclidean_distance.item()))
  dis = 'Dissimilarity: {:.2f}'.format(euclidean_distance.item())
  dis1 = dis
  dis1 = dis1.replace("Dissimilarity:", "").replace(" ", "")
  print(dis)
  if float(dis1) < 0.5:
    print("It's Same Signature")
  else:
    print("It's Forged Signature")

【问题讨论】:

    标签: machine-learning pytorch artificial-intelligence conv-neural-network siamese-network


    【解决方案1】:

    只需在自定义数据集类的__getitem__ 函数中分配should_get_same_class=0InferenceSiameseNetworkDataset 就可以确保两个图像属于不同的类/文件夹。

    其次,您不应连接可能不满足您条件的两批样品。您应该在循环范围内使用x0,x1,label2 = next(dataiter),然后进行连接。

    【讨论】:

    • 你的意思是添加 def __getitem__(self, index, should_get_same_class=0): ??
    • 你的意思是添加 def __getitem__(self, index, should_get_same_class=0): or if should_get_same_class= 0: while True: #keep循环直到找到同一个类图像 img1_tuple = random.choice(self. imageFolderDataset.imgs) if img0_tuple[1]==img1_tuple[1]: break
    • 你能告诉我在哪里更新代码吗?
    • 更新 should_get_same_class= random.randint(0,1) 与 should_get_same_class= 0
    • __getitem__ 函数肯定会返回一对属于不同类的图像。在 for 循环下迭代数据加载器时,您犯了第二个错误。您不应连接可能违反约束的两批样品。您应该在循环范围内使用x0,x1,label2 = next(dataiter),然后进行连接。
    猜你喜欢
    • 2021-06-02
    • 1970-01-01
    • 2014-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多