Siamese网络(孪生网络)

article/2025/9/30 23:02:24

1. Why Siamese

在人脸识别中,存在所谓的one-shot问题。举例来说,就是对公司员工进行人脸识别,每个员工只有一张照片(因为每个类别训练样本少),并且员工会离职、入职(每次变动都要重新训练模型是不现实的)。如果当成分类问题,直接训练模型进行人脸识别在实际应用中是不可行。

为了解决one-shot问题,我们会训练一个模型来输出给定两张图像的相似度,所以模型学习得到的是similarity函数,通过对相似度设定一个阈值判断是否属于同一个人。

哪些模型能通过学习得到similarity函数呢?Siamese网络就是这样的一种模型。

2. What is Siamese network

 (Siamese网络是一种模型设计框架,这里举人脸验证为例,用的是CNN模型,其他任务中可以是LSTM等模型,最早应该是[1]这篇论文)

上图中上下两个CNN模型的模型参数值完全相同。Siamese网络输出一个向量(比如上图中是128个数值组成的一维特征向量,用于face embedding):

  • 若输入的图像X1和X2为同一个人,则上下两个模型输出的一维特征向量欧氏距离较小
  • 若输入的图像X1和X2不是同一个人,则上下两个模型输出的一维特征向量欧氏距离较大

所以通过对上下两个模型输出的向量做欧氏距离计算,就能得到输入两幅图像的相似度。

3. How to train Siamese network

对图中的一幅照片A,如果给定了同一个人的另一幅照片P,则模型的输出向量f(A)和f(P)应该是距离比较小的。如果给定了另一个人的照片N,则模型的输出向量f(A)和f(N)之间的距离就比较大。所以d(A,P)<d(A,N)。

目标函数:(这里叫triple loss[2])

这个loss function 的三元组(A,P,N),表示A和P是相同类别的样本,A和N是不同样本的类别,最终通过梯度下降学习使得f(A)与f(P)的距离最小化,f(A)与f(N)的距离最大化。α是个超参数,用于做margin。

 

【pytorch教程】PyTorch 实现孪生网络识别面部相似度

https://www.pytorchtutorial.com/pytorch-one-shot-learning/ 

【代码】https://github.com/harveyslash/Facial-Similarity-with-Siamese-Networks-in-Pytorch/tree/master

【代码片段】

孪生网络模型:

class SiameseNetwork(nn.Module):def __init__(self):super(SiameseNetwork, self).__init__()self.cnn1 = nn.Sequential(nn.ReflectionPad2d(1),nn.Conv2d(1, 4, kernel_size=3),nn.ReLU(inplace=True),nn.BatchNorm2d(4),nn.Dropout2d(p=.2),nn.ReflectionPad2d(1),nn.Conv2d(4, 8, kernel_size=3),nn.ReLU(inplace=True),nn.BatchNorm2d(8),nn.Dropout2d(p=.2),nn.ReflectionPad2d(1),nn.Conv2d(8, 8, kernel_size=3),nn.ReLU(inplace=True),nn.BatchNorm2d(8),nn.Dropout2d(p=.2),)self.fc1 = nn.Sequential(nn.Linear(8*100*100, 500),nn.ReLU(inplace=True),nn.Linear(500, 500),nn.ReLU(inplace=True),nn.Linear(500, 5))def forward_once(self, x):output = self.cnn1(x)output = output.view(output.size()[0], -1)output = self.fc1(output)return outputdef forward(self, input1, input2):output1 = self.forward_once(input1)output2 = self.forward_once(input2)return output1, output2

 默认边际价值为2的对比损失:

class ContrastiveLoss(torch.nn.Module):"""Contrastive loss function.Based on: http://yann.lecun.com/exdb/publis/pdf/hadsell-chopra-lecun-06.pdf"""def __init__(self, margin=2.0):super(ContrastiveLoss, self).__init__()self.margin = margindef forward(self, output1, output2, label):euclidean_distance = F.pairwise_distance(output1, output2)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)counter = []
loss_history = []
iteration_number = 0for epoch in range(0, Config.train_number_epochs):for i, data in enumerate(train_dataloader, 0):img0, img1, label = dataimg0, img1, label = Variable(img0).cuda(), Variable(img1).cuda(), Variable(label).cuda()output1, output2 = net(img0, img1)optimizer.zero_grad()loss_contrastive = criterion(output1, output2, label)loss_contrastive.backward()optimizer.step()if i % 10 == 0:print("Epoch number {}\n Current loss {}\n".format(epoch, loss_contrastive.data[0]))iteration_number = 10counter.append(iteration_number)loss_history.append(loss_contrastive.data[0])
show_plot(counter,loss_history)

 

4. Face verification supervised learning

通过孪生网络得到人脸特征向量之后,通过监督学习(同一个人标签为1,不是同一个人标签为0),学习人脸特征向量每一维的权重w_i和偏置项b。

5. RankIQA

Xialei Liu等人[4]提出RankIQA模型来评估无参考图像的质量。之前的模型主要都是从提取特征和网络方面做改进,并没有考虑数据集图像少的问题。而RankIQA正是从数据预处理出发,取得了NR-IQA最好效果。 为了解决IQA数据集不足的问题,通过已知质量的图片使用图像处理变换生成不同级别不同类型的排序的失真图像。这些排序的图像集是自动生成的,而不用人工标注。这样就得到一个大数据集,然后就可以选择一个更宽更深的网络来训练。作者首先选择Siamese网络学习出生成数据排序关系的表示特征,然后将训练好的Siamese网络中表示的知识迁移到传统的CNN中,从而估算出单个图像的绝对图像质量。作者还改进了一个比传统Siamese网络更高效的反向传播算法:以前Siamese网络使用成对的样本训练网络,这样有大量样本有重复计算,现在所有样本只前向传播一次,统计出loss,然后计算梯度进行反向传播,这样得到更快的训练速度和更低的损失。作者实验了三个从浅到深的网络:Shallow,Alexnet,VGG16。Shallow包含4个卷积层和一个fc层,最后VGG16的结果最好。我们还可以训练测试一些更深的网络或者设计一些新网络。作者测试TID2013表明,RankIQA超过state-of-the-art 5%,并且在LIVE测试中,RankIQA优于现有的NR-IQA技术,甚至超越了FR-IQA方法的最新技术,从而无需参考图像就可以推断IQA。

preview

 

 

参考资料:

[1] Learning a similarity metric discriminatively, with application to face verification

[2] Hamming Distance Metric Learning

[3] FaceNet: A Unified Embedding for Face Recognition and Clustering

[4] RankIQA: Learning from Rankings for No-reference Image Quality Assessment

[5] Siamese Network理解(附代码)

[6] 详解Siamese网络

[7] 图像质量评估综述

[8] [CVPR2019]我对Siamese网络的一点思考(SiamMask)

 

学习资源:

1、https://mooc.study.163.com/course/2001281004?tid=2001392030&_trace_c_p_k2_=31afb2dc55f54ae6a5fe7e180c85f01b#/info

2、https://www.bilibili.com/video/av73508741?p=33


http://chatgpt.dhexx.cn/article/9rkTyf6M.shtml

相关文章

Siamese网络(孪生神经网络)详解

SiameseFC Siamese网络&#xff08;孪生神经网络&#xff09;本文参考文章&#xff1a;Siamese背景 Siamese网络解决的问题要解决什么问题&#xff1f;用了什么方法解决&#xff1f;应用的场景&#xff1a; Siamese的创新Siamese的理论Siamese的损失函数——Contrastive Loss损…

8.HttpEntity,ResponseEntity

RequestBody请求体&#xff0c;获取一个请求的请求体内容就不用RequestParam RequestMapping("/testRequestBody")public String testRequestBody(RequestBody String body){System.out.println("请求体: "body);return "success";}只有表单才有…

使用restTemplate进行feign调用new HttpEntity<>报错解决方案

使用restTemplate进行feign调用new HttpEntity<>报错解决方案 问题背景HttpEntity<>标红解决方案心得Lyric&#xff1a; 沙漠之中怎么会有泥鳅 问题背景 今天才知道restTemplate可以直接调用feign&#xff0c;高级用法呀&#xff0c;但使用restTemplate进行feign调…

HttpClient 源码详解之HttpEntity

HttpClient 源码详解 之HttpEntity 1. 类释义 An entity that can be sent or received with an HTTP message. Entities can be found in some requests and in responses, where they are optional. There are three distinct types of entities in HttpCore, depending on …

System.Net.Http.HttpClient

本文主要是介绍如何用HttpClient请求带参数的服务&#xff0c;请求服务为某翻译API 直接上源码 1.添加using System.Net;的引用 using System.Net; 2.使用HttpClient发送请求 public static async void Fanyin_HttpClient(string fromString) {Console.WriteLine($"F…

ResponseEntity类和HttpEntity及跨平台路径问题

1. 简介 使用spring时&#xff0c;达到同一目的通常有很多方法&#xff0c;对处理http响应也是一样。本文我们学习如何通过ResponseEntity设置http相应内容、状态以及头信息。 ResponseEntity是HttpEntity的扩展&#xff0c;添加一个HttpStatus状态代码。在RestTemplate和Con…

RestTemplate发送HTTP、HTTPS请求

前面我们介绍了如何使用Apache的HttpClient发送HTTP请求,这里我们介绍Spring的Rest客户端(即:RestTemplate) 如何发送HTTP、HTTPS请求。注:HttpClient如何发送HTTPS请求,有机会的话也会再给出示例。 声明:本人一些内容摘录自其他朋友的博客&#xff0c;链接在本文末给出&#…

HttpEntity的用法

关于HttpEntity的用法 HttpEntity表示http的request和resposne实体&#xff0c;它由消息头和消息体组成。 从HttpEntity中可以获取http请求头和回应头&#xff0c;也可以获取http请求体和回应体信息。HttpEntity的使用&#xff0c;与RequestBody 、ResponseBody类似。 HttpEnti…

关于HttpEntity的用法

关于HttpEntity的用法 HttpEntity表示http的request和resposne实体&#xff0c;它由消息头和消息体组成。从HttpEntity中可以获取http请求头和回应头&#xff0c;也可以获取http请求体和回应体信息。 HttpEntity的使用&#xff0c;与RequestBody 、ResponseBody类似。HttpEntit…

查询MySQL数据库中表结构的几种方法

mySQL: 方法一、二、三&#xff1a;是在本数据库中查询。 /** 方法一 **/ show columns from activity_station; /** 方法二 **/ desc activity_station; describe activity_station;/** 方法三 **/ show create table activity_station;方法四是在统计数据库中查询。 informa…

mysql 表结构查询的SQL语句

1、查看表结构 desc student;2、查看表的DDL语句 show create table student;3、查看列的结构信息 select column_name,data_type,column_comment,column_key,extra,character_maximum_length,is_nullable,column_default from information_schema.columns where table_sch…

mysql查看表结构 desc 表名;

查看表结构 语法&#xff1a;desc 表名;

MySQL之表结构

1.添加、删除字段 查看表结构 desc blog;show columns from blog;新增字段 alter table 表名 add 字段名 字段数据类型;alter table blog add age tinyint;删除字段 alter table 表名 drop 字段名;alter table blog drop age;重新添加age alter table blog add age tinyin…

mysql查看表结构和编码

show full columns from XXXXX

查看修改MySQL表结构命令

查看修改MySQL表结构命令 简述 小编经常会遇到一些数据库编码不对得问题&#xff0c;好TM头疼&#xff0c;这里做一个记录&#xff0c;供大家参考。 修改数据库字符集&#xff1a; ALTER DATABASE db_name DEFAULT CHARACTER SET character_name [COLLATE …]; 把表默认的字…

Mysql数据库常用表结构操作语句

目录 一、准备工作二、常用表结构操作语句1.在数据库表中新增 字段、约束1.1 新增字段1.2 新增约束 2.在数据库表中修改 表、字段2.1 修改表的名字2.2 修改字段名、数据类型、默认值、注释、自增属性 3.在数据库表中删除表、字段3.1 删除表3.2删除字段、字段约束 3.在数据库表中…

mysql 查询所有表结构_mysql数据库查看表结构

Mysql技术知识点 Mysql技术知识点,首先来讲一下Mysql语句精进安装数据库,然后导入tigerfive.sql。 sql见文档结尾部分MySQL示例数据库模式由以下表组成: customers: 存储客户的数据。 products: 存储汽车的数据。 productLines: 存储产品类别数据。 orde... 文章 好程序员 2…

linux mysql 结构_linux查看mysql数据表结构

展开全部 一、简单描述表结构&#xff0c;字段类型 desc tabl_name; 显示32313133353236313431303231363533e78988e69d8331333365636133表结构&#xff0c;字段类型&#xff0c;主键&#xff0c;是否为空等属性&#xff0c;但不显示外键。 例如&#xff1a;desc table_name 二、…

mysql查看表结构修改记录表_MySQL 表结构查看以及表结构修改

使用MySql数据库时&#xff0c;如果对表字典不够熟悉&#xff0c;我们就需要查看表结构。如果数据库是在远程linux上部署&#xff0c;很多时候我们只能通过mysql的命令来查看表结构。同样&#xff0c;如果我们想要修改表结构&#xff0c;添加、删除、修改列时&#xff0c;也只能…

mysql查看表描述_MySQL 查看表结构简单命令

一、简单描述表结构,字段类型 desc tabl_name; 显示表结构,字段类型,主键,是否为空等属性,但不显示外键。 例如:desc table_name 二、查询表中列的注释信息 select * from information_schema.columns where table_schema = db #表所在数据库 and table_name = tablename…