测试训练好的siamese网络

2023-12-24 19:48
文章标签 训练 网络 测试 siamese

本文主要是介绍测试训练好的siamese网络,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这篇博客中https://blog.csdn.net/sinat_33486980/article/details/91440461 新训练了单分支的siamese网络。

参考了论文:Online Multi-Object Tracking with Historical Appearance Matching and Scene Adaptive Detection Filtering

结构做了调整,防止过拟合,加入了batchnorm层,网络结构如下:

训练了100000次,最终的train loss 和testloss分别为:

 

生成的模型为:

目的:

在vs中调用训练好的siamese模型来判断任意两张图像是否相似,输出两个人是同一个人的概率。下面是几张测试用的图片(同一缩放为128x64x3):

               

 man1          man2            man3              man4

第一步:设置vs2013中的模型路径

然后在vs2013里面测试这个网络区分相同图片和不同图片的能力,修改加载网络函数中的网络模型文件路径和delpoy文件路径

这里的deploy文件是将网络定义文件做修改,要在vs中使用模型,输入的是读取的图像Mat格式,也就是“MemoryData”类型,而在训练的prototxt文件中的数据层是“Data”类型,输入数据是lmdb或者leveldb。因此这里首先要修改数据层:

      

上图,左边是训练时使用的数据层,右边是现在测试时的deploy文件中的数据层。这里的channels是6,而不是3,是因为这个网络结构采用的是单分支的孪生网络,输入是两张图像的堆叠(3+3=6)。

然后删掉卷积层和全连接层的权重和偏置项参数,将网络最后的softmaxWithLoss改成softmax,因为我想输出两张图像是否相似的概率。

修改前的输出层

修改后的输出层:

第二步:处理输入数据

接下来就是很重要的部分了,就是对输入数据进行处理。

首先加载这四张图片,缩放到64宽,128高的大小。

然后就是重点:将两张图片合并成一张6通道的图片

然后调用特征提取函数:

特征提取函数中设置要提取的网络层的名字,我这里要输出概率值,因此输出softmax层,这一层的名字叫loss

这里需要注意,softmax输出的是两个值:[负例的概率,正例的概率],我的正例指的是两张图片相似,所以只输出第二项的值就可以了:

最后输出这四张图片两两相似的概率:

再来看一下要对比的4张图片:

man1和man2相似度为0.999846,是同一个人,判断正确

man3和man4相似度为0.997171,是同一个人,判断正确,而且这两个人身体的朝向都是不一样的

其他的都是相似度很低的,因为不是同一张图片。

总结

这个孪生网络模型才759k,我用的其他的reid模型都是几M甚至更大,而且这个网络判断是否是同一目标的能力还挺强,速度还快(),可以考虑换掉提取单张图片特征向量再计算向量余弦距离,构建相似度矩阵的方法,而直接用siamese网络生成相似度矩阵,简化步骤,加快速度。(实际测试时,还是很有问题,因为虽然计算一次相似度耗时降低了很多,但是计算次数增加了更多,比如:有6个跟踪框,5个检测框,用原来的方法,只需要调用网络提取5个检测框的特征,计算与6个跟踪框的历史特征(已经保存,可直接读取)的余弦距离。但是用siamese的方法直接计算相似度,需要两两配对,调用网络计算6*5=30次,每增加一个框,就增加好几次的循环,如果框再多时,会达到上百ms,特别慢。)

另外两个网络的效果:

1、DeepSort中用到的cosinMetric外观特征提取网络

网络前向推理一次耗时:

特征向量长度:128

模型大小:11.4M

2、MOTDT中用到的part_reid外观特征提取网络

网络前向推理一次耗时:,虽然看起来比上面那个耗时少,但是在实际使用中耗时会多1ms左右。

特征向量长度512

模型大小:15.9M

这篇关于测试训练好的siamese网络的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/532928

相关文章

如何测试计算机的内存是否存在问题? 判断电脑内存故障的多种方法

《如何测试计算机的内存是否存在问题?判断电脑内存故障的多种方法》内存是电脑中非常重要的组件之一,如果内存出现故障,可能会导致电脑出现各种问题,如蓝屏、死机、程序崩溃等,如何判断内存是否出现故障呢?下... 如果你的电脑是崩溃、冻结还是不稳定,那么它的内存可能有问题。要进行检查,你可以使用Windows 11

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

poj 3181 网络流,建图。

题意: 农夫约翰为他的牛准备了F种食物和D种饮料。 每头牛都有各自喜欢的食物和饮料,而每种食物和饮料都只能分配给一头牛。 问最多能有多少头牛可以同时得到喜欢的食物和饮料。 解析: 由于要同时得到喜欢的食物和饮料,所以网络流建图的时候要把牛拆点了。 如下建图: s -> 食物 -> 牛1 -> 牛2 -> 饮料 -> t 所以分配一下点: s  =  0, 牛1= 1~

poj 3068 有流量限制的最小费用网络流

题意: m条有向边连接了n个仓库,每条边都有一定费用。 将两种危险品从0运到n-1,除了起点和终点外,危险品不能放在一起,也不能走相同的路径。 求最小的费用是多少。 解析: 抽象出一个源点s一个汇点t,源点与0相连,费用为0,容量为2。 汇点与n - 1相连,费用为0,容量为2。 每条边之间也相连,费用为每条边的费用,容量为1。 建图完毕之后,求一条流量为2的最小费用流就行了

poj 2112 网络流+二分

题意: k台挤奶机,c头牛,每台挤奶机可以挤m头牛。 现在给出每只牛到挤奶机的距离矩阵,求最小化牛的最大路程。 解析: 最大值最小化,最小值最大化,用二分来做。 先求出两点之间的最短距离。 然后二分匹配牛到挤奶机的最大路程,匹配中的判断是在这个最大路程下,是否牛的数量达到c只。 如何求牛的数量呢,用网络流来做。 从源点到牛引一条容量为1的边,然后挤奶机到汇点引一条容量为m的边