pytorch孪生网络识别面部相似度代码解读

更新时间:2023-07-14 14:44:06 阅读: 评论:0

pytorch孪⽣⽹络识别⾯部相似度代码解读
本⽂章记录最近看的⼀个孪⽣⽹络实现⼈脸⾯部相似度的代码实例,关于孪⽣⽹络的定义,可以,该项⽬所使⽤的的⽹络架构为标准的卷积神经⽹络架构,在每个卷积层之后使⽤批量归⼀化(batch normolization),然后进⾏dropout。
春节福字图片大全
孪⽣⽹络架构的代码⽚段:
class SiameNetwork(nn.Module):
def __init__(lf):
super(SiameNetwork, lf).__init__()
lfn1 = nn.Sequential(
nn.ReflectionPad2d(1),
nn.Conv2d(1, 4, kernel_size=3),
nn.ReLU(inplace=True),
nn.BatchNorm2d(4),
#nn.BatchNorm2d(4)中参数4为通道数
nn.ReflectionPad2d(1),
nn.Conv2d(4, 8, kernel_size=3),
nn.ReLU(inplace=True),
nn.BatchNorm2d(8),
nn.ReflectionPad2d(1),
nn.Conv2d(8, 8, kernel_size=3),
nn.ReLU(inplace=True),
nn.BatchNorm2d(8),
)
lf.fc1 = nn.Sequential(
nn.Linear(8*100*100, 500),
nn.ReLU(inplace=True),
nn.Linear(500, 500),
发现作文600字nn.ReLU(inplace=True),
nn.Linear(500, 5))
def forward_once(lf, x):
output = lfn1(x)
output = output.view(output.size(0), -1)
output = lf.fc1(output)
return output
def forward(lf, input1, input2):
output1 = lf.forward_once(input1)
output2 = lf.forward_once(input2)
return output1, output2
在这个结构中,实际上就只有⼀个⽹络。因为孪⽣⽹络中两个⽹络的权重是相同的,所以我们使⽤⼀个模型并连续输⼊两张图像,并使⽤两个图像来计算损失值,然后反向传播,更新参数。
在使⽤pairwi_distance计算完两张图⽚的欧式距离后,使⽤对⽐损失作为⽬标损失函数
class Module):
def __init__(lf, margin=2.0):
super(ContrastiveLoss, lf).__init__()
lf.margin = margin
沥青灌缝def forward(lf, output1, output2, label):
euclidean_distance = F.pairwi_distance(output1, output2)
loss_contrastive = an((1-label) * torch.pow(euclidean_distance, 2) +
(label) * torch.pow(torch.clamp(lf.margin - euclidean_distance, min=0.0), 2))
return loss_contrastive
代码中对⽐损失⽤数学公式表⽰为
其中的DW是两张图⽚的欧式距离。观察上述的contrastive loss表达式可以发现,这种损失函数可以很好的表达成对样本的匹配程度。当
y=0(即样本相似)时,损失函数只剩下,此项越⼩越好。即原本相似的样本,如果在特征空间的欧式距离较⼤,则说明当
前的模型不好。当y=1(即样本不相似)时,损失函数剩下,此项越⼩越好,也就是说m-Dw越⼩越好,Dw越⼤越好。即当样本不相似时,两张图⽚在特征空间的的欧⽒距离反⽽⼩的话,则要加⼤损失。
数据加载
class SiameNetworkDatat(Datat):
def __init__(lf,imageFolderDatat,transform=None,should_invert=True):
lf.imageFolderDatat = imageFolderDatat
lf.should_invert = should_invert
臂字组词
def __getitem__(lf,index):
img0_tuple = random.choice(lf.imageFolderDatat.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(lf.imageFolderDatat.imgs)
if img0_tuple[1]==img1_tuple[1]:
break
el:
while True:
#keep looping till a different class image is found
img1_tuple = random.choice(lf.imageFolderDatat.imgs)
if img0_tuple[1] !=img1_tuple[1]:
break
img0 = Image.open(img0_tuple[0])
img1 = Image.open(img1_tuple[0])
img0 = vert("L")
img1 = vert("L")
if lf.should_invert:
img0 = PIL.ImageOps.invert(img0)
img1 = PIL.ImageOps.invert(img1)
ansform is not None:
什么时候中考img0 = lf.transform(img0)
给儿子的新年祝福语
img1 = lf.transform(img1)
return img0, img1 , torch.from_numpy(np.array([int(img1_tuple[1]!=img0_tuple[1])],dtype=np.float32))
def __len__(lf):
return len(lf.imageFolderDatat.imgs)
⽹络架构需要输⼊⼀对图⽚以及标签(相似/不相似)。该实例创建了⾃定义的数据加载器来达到这个⽬的。在SiameNetworkDatat 这个类中⽣成⼀对图像和相似度标签。如果图像来⾃同⼀个类,标签为0,否则为1.
⽹络训练过程
1.向⽹络传送第⼀张图⽚
2.向⽹络传送第⼆张图⽚
3.利⽤1.2中的输出特征值计算损失
4.反向传播计算梯度
5.使⽤Adam优化器来更新权重
net = SiameNetwork()
criterion = ContrastiveLoss()
optimizer = torch.optim.Adam(net.parameters(),0.001,betas=(0.9, 0.99))
counter = []
loss_history = []
iteration_number= 0
for epoch in range(ain_number_epochs):
for i, data in enumerate(train_dataloader,0):
img0, img1 , label = data
#img0, img1 , label = img0.cpu, img1.cpu, label.cpu
<_grad()
output1,output2 = net(img0,img1)
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.item()))                iteration_number +=10
counter.append(iteration_number)
loss_history.append(loss_contrastive.item())
show_plot(counter,loss_history)
torch.save(net.state_dict(),'net_params.pkl')
最后⽤测试集判断相似度
道路交通安全标志
以上就是本⼈对这个项⽬的理解,希望对你有帮助,如有不对,恳请指出。

本文发布于:2023-07-14 14:44:06,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1081265.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:相似   损失   样本   函数   架构   计算   希望   距离
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图