测试训练好的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

相关文章

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

SpringBoot使用OkHttp完成高效网络请求详解

《SpringBoot使用OkHttp完成高效网络请求详解》OkHttp是一个高效的HTTP客户端,支持同步和异步请求,且具备自动处理cookie、缓存和连接池等高级功能,下面我们来看看SpringB... 目录一、OkHttp 简介二、在 Spring Boot 中集成 OkHttp三、封装 OkHttp

Linux系统之主机网络配置方式

《Linux系统之主机网络配置方式》:本文主要介绍Linux系统之主机网络配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、查看主机的网络参数1、查看主机名2、查看IP地址3、查看网关4、查看DNS二、配置网卡1、修改网卡配置文件2、nmcli工具【通用

使用Python高效获取网络数据的操作指南

《使用Python高效获取网络数据的操作指南》网络爬虫是一种自动化程序,用于访问和提取网站上的数据,Python是进行网络爬虫开发的理想语言,拥有丰富的库和工具,使得编写和维护爬虫变得简单高效,本文将... 目录网络爬虫的基本概念常用库介绍安装库Requests和BeautifulSoup爬虫开发发送请求解

SpringBoot中整合RabbitMQ(测试+部署上线最新完整)的过程

《SpringBoot中整合RabbitMQ(测试+部署上线最新完整)的过程》本文详细介绍了如何在虚拟机和宝塔面板中安装RabbitMQ,并使用Java代码实现消息的发送和接收,通过异步通讯,可以优化... 目录一、RabbitMQ安装二、启动RabbitMQ三、javascript编写Java代码1、引入

Nginx设置连接超时并进行测试的方法步骤

《Nginx设置连接超时并进行测试的方法步骤》在高并发场景下,如果客户端与服务器的连接长时间未响应,会占用大量的系统资源,影响其他正常请求的处理效率,为了解决这个问题,可以通过设置Nginx的连接... 目录设置连接超时目的操作步骤测试连接超时测试方法:总结:设置连接超时目的设置客户端与服务器之间的连接

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

SSID究竟是什么? WiFi网络名称及工作方式解析

《SSID究竟是什么?WiFi网络名称及工作方式解析》SID可以看作是无线网络的名称,类似于有线网络中的网络名称或者路由器的名称,在无线网络中,设备通过SSID来识别和连接到特定的无线网络... 当提到 Wi-Fi 网络时,就避不开「SSID」这个术语。简单来说,SSID 就是 Wi-Fi 网络的名称。比如

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五