跨镜头目标融合__追踪之目标重识别研究(跨镜头目标追踪)

文章目录

      • 标题:
          • 跨镜头目标融合;目标重识别;跨镜头目标追踪;
      • 1 目的:
      • 2 实现方法/策略:
        • 2.1 目标类型+位置匹配(或考虑结合目标轨迹)
        • 2.2 目标重识别
        • 2.3 目标类型+位置匹配(轨迹)+目标重识别
      • 3 目标重识别方案
        • 3.1 facenetReID
          • 3.1.1 本地源码位置:
          • 3.1.2 训练方法:
          • 3.1.3 测试方法:
          • 3.1.4 转换为TRT模型
          • 3.1.5 部署:前处理
          • 3.1.6 部署:后处理
        • 3.2 deep-person-reid-master
          • 3.2.1 源码
          • 3.2.2 数据准备
          • 3.2.3 训练方法
          • 3.2.4 测试方法
          • 3.2.5 转换为TRT模型
          • 3.2.6 部署:前处理
          • 3.2.7 部署:后处理
        • 3.3 TransReID
        • 3.4 相关数据集
        • 3.5 其它 (Deepstream)
          • 3.5.1 官方模型
            • ResNet
          • 3.5.2 自定义模型
          • 3.5.2 自定义模型

标题:

跨镜头目标融合;目标重识别;跨镜头目标追踪;

​ 追踪之目标重识别 研究(SORT_ReID)

​ 跨镜头目标追踪(或可理解为跨镜头目标融合)

​ 采用“匈牙利”最优匹配方法,来进行多源同一目标的去重。

1 目的:

​ 为实现不同摄像机镜头下拍到的多个目标中,同一目标对应的ID相同。

2 实现方法/策略:

2.1 目标类型+位置匹配(或考虑结合目标轨迹)

​ 依据同一位置只可能存在一个目标。(缺点是由于目标位置不一定准确带来的目标错误融合)。

​ 此处难点主要有:① 不同相机源拍摄到同一目标的角度不同,根据不同源对应的经纬度标定计算目标位置存在差异。② 多辆车相邻比较近的时候,由于上述①导致的错位匹配。③ 可以考虑匈牙利最优匹配策略,理论上应该可以避免错误匹配。

2.2 目标重识别
2.3 目标类型+位置匹配(轨迹)+目标重识别

​ 考虑目标经纬度位置的时候,① 考虑目标连续多帧的经纬度轨迹。②考虑目标下边沿角点对应的经纬度值和目标中心点对应的经纬度值。

3 目标重识别方案

3.1 facenetReID

[ref: ] https://github.com/bubbliiiing/facenet-pytorch/tree/bilibili

3.1.1 本地源码位置:
D:\____SORT\_LL_facenet_pytorch_ReID
进入目录 _LL_facenet_pytorch_ReID 中
百度网盘链接:https://pan.baidu.com/s/1K_eVgT8yHrYhF48rQiigGA 

3.1.2 训练方法:
  1. 准备训练数据集,训练数据集格式如下:
|-datasets
    |-car0001
        |-0001.jpg
        |-0002.jpg
    |-car0002
        |-0005.jpg
        |-0006.jpg
    |-...
  1. 准备验证数据集,验证数据集存放在目录文件夹 lfw 中。

  2. 在训练前利用txt_annotation.py文件生成对应的cls_train.txt。

  3. 利用train.py训练facenet模型,训练前,根据自己的需要选择backbone,model_path和backbone一定要对应。

  4. 运行train.py即可开始训练。

  5. 评估模型

① 将评估用的数据集放在根目录文件夹 lfw 中。

② 在eval_LFW.py设置使用的主干特征提取网络和网络权值。

③ 运行eval_LFW.py来进行模型准确率评估。

3.1.3 测试方法:

​ 使用自己训练的权重测试,自己训练的权重存放在./model_path路径下。

  1. 先修改facenet.py中的内容,包括 model_path 和 backbone 使其对应训练好的文件。

  2. 运行predict.py,根据提示并输入示例如下:

Input image_1 filename: img\1_001.jpg
Input image_2 filename: img\1_002.jpg
  1. 然后会输出两张图片的相似度距离和效果对比图。源自facenet.py中如下源码:
#  图片传入网络进行预测
output1 = self.net(photo_1).cpu().numpy()
output2 = self.net(photo_2).cpu().numpy()
#   计算二者之间的距离
l1 = np.linalg.norm(output1 - output2, axis=1)
        
plt.subplot(1, 2, 1)
plt.imshow(np.array(image_1))

plt.subplot(1, 2, 2)
plt.imshow(np.array(image_2))
plt.text(-12, -12, 'Distance:%.3f' % l1, ha='center', va= 'bottom',fontsize=11)
plt.show()
3.1.4 转换为TRT模型

1 训练后生成的模型为 .pth 的文件。

2 pth 转为 onnx 模型。

3 onnx 转为 .trt 或 .engine 文件。

3.1.5 部署:前处理
3.1.6 部署:后处理
3.2 deep-person-reid-master
3.2.1 源码

如下内容来自源码:README.rst文件

​ Code: https://github.com/KaiyangZhou/deep-person-reid.

​ Documentation: https://kaiyangzhou.github.io/deep-person-reid/.

​ How-to instructions: https://kaiyangzhou.github.io/deep-person-reid/user_guide.

​ Model zoo: https://kaiyangzhou.github.io/deep-person-reid/MODEL_ZOO.

​ Tech report: https://arxiv.org/abs/1910.10093.

3.2.2 数据准备
  1. 准备训练数据集,数据仿照VeRI-Wild的数据格式,训练数据集格式如下:
|-VeRI-Wild
    |-iamges
        |-0000_c1_0000.jpg
        |-0000_c1_0002.jpg
        |-0000_c2_0003.jpg
        |-0000_c2_0004.jpg
        |-0001_c1_0005.jpg
        |-0001_c1_0006.jpg
        |-... ...
    |-train_test_split
        |-test_10000_id_query.txt
        |-test_10000_id.txt  
        |-train_list.txt
 

​ 上述数据集中,图片命名规则为:【类别ID _ 相机ID _ 图片ID.jpg】,这里的类别ID可以认为是同一时刻的同一辆车作为一个类别(作为同一时刻不同相机的目标检测融合来说)【或者将不同时刻同一辆车认为是一个类别(作为同一目标的重识别来讲)】。

  1. 准备好数据集,可以看出,上述数据集树包含【images】文件夹存放所有图片,包含【train_test_split】文件夹,其中包含的txt文件为对【images】文件夹中各个文件的划分。划分依据源码如下:

    def getimgpath2txt():
        import os
        path = '../VeRI-Wild/images/'
        pathtxt = '../VeRI-Wild/train_test_split/train_list.txt'
        files = os.listdir(path)
        vcls, vclsid = {}, 0  # videoCLS
        ccls, cclsid = {'211': 1, '216': 2, '203': 3, '207': 4}, 1  # CameraCLS
        txtPaths = []
        for fp in files:
            # if dir
            if os.path.isdir(os.path.join(path, fp)):
                pass
            # if file
            else:
                ffname = os.path.join(path, fp)
                # print(ffname, 'is a file')
                if fp[:9] not in vcls:  # fp[:9] is cls 
                    vcls[fp[:9]] = vclsid
                    vclsid += 1
                if fp[11:14] not in ccls:  # fp[11:14] is camera ip,for example 211, 216...
                    ccls[fp[11:14]] = cclsid
                    cclsid += 1
                    if fp[11:14] == '03_':
                        print(fp)
    
                # txtPath bao han [img path, img cls ID, camera cls ID]zu cheng de string
                txtPath = ffname + ' ' + str(vcls[fp[:9]]) + ' '+ str(ccls[fp[11:14]]) + '\n'
                txtPaths.append(txtPath)
        print(ccls)
        print(vcls)
            # break
    
        # xie wen jian
        txtPaths[-1] = txtPaths[-1].replace('\n', '')
        with open(pathtxt, 'w', encoding='utf-8') as wf:
            wf.writelines(txtPaths)
    
    if __name__ == '__main__':
        getimgpath2txt()
    
  2. 上述的图片也可以放到三个个文件夹【train】【test】【querry】区分。只要在【train_test_split】文件夹中的txt文件内容对应上述3个文件夹的文件即可

3.2.3 训练方法

train.sh

# train.sh
# MyTrain
python scripts/main.py --config-file configs/im_osnet_x1_0_softmax_256x128_amsgrad_cosine.yaml  -s VeRI-Wild -t VeRI-Wild --transforms random_flip random_erase  --root ../MyTrain/   data.save_dir log/osnet_x1_0_VeRI-Wild_softmax_cosinelr

【问题1】

​ 使用’‘sh train.sh’'运行程序的时候,由于保存的txt文件的图片路径是绝对路径,所以在源码遍历图片后,提示train的数据为[]。故需要修改源码读取train_list.txt文件后关于数据的部分。这个位置根据源码修改即可

sh train.sh
    上述修改源码: File "/home/user/anaconda3/envs/torchreid/lib/python3.7/site-packages/torchreid-1.4.0-py3.7-linux-x86_64.egg/torchreid/data/datasets/image/veriwild.py"中的内容。
    增加下图中框中的两行即可(上述问题是由于源码中get数据集的路径是相对路径造成的)

在这里插入图片描述

【训练记录】

由于我本地的数据比较少,所以没有【querry】的图片,而是将“test_10000_id_query.txt”和“test_10000_id.txt ”的内容是一样的。如下图可看出
在这里插入图片描述

​ 程序正常跑起来了,会打印一些配置相关的信息。程序结束会通过使用【querry】集测试:
在这里插入图片描述

3.2.4 测试方法
3.2.5 转换为TRT模型

1 训练后生成的模型为 .pth 的文件。

2 pth 转为 onnx 模型。

3 onnx 转为 .trt 或 .engine 文件。

3.2.6 部署:前处理
3.2.7 部署:后处理
3.3 TransReID

[ref: ] https://github.com/damo-cv/TransReID [ICCV-2021]

​ //

3.4 相关数据集

​ 如下两个数据集DOWNLOAD中提示,都是需要发邮件到某网址方可申请下载该数据集,不是很方便。

1 VeRidataset:https://github.com/JDAI-CV/VeRidataset

2 PKU VehicleID:https://www.pkuml.org/resources/pku-vehicleid.html)

3.5 其它 (Deepstream)

NvDeepSORT Tracker Re-ID模型

3.5.1 官方模型

​ Deepstream中NvDeepSORT Tracker模块里官方的Re-ID模型是在MARS数据集上训练的10层ResNet网络。

ref: https://zhuanlan.zhihu.com/p/518545684

ResNet

ref: https://blog.csdn.net/u013181595/article/details/80990930

ResNet模型简介:

ResNet源码涉及:

ResNet所得:

3.5.2 自定义模型

​ 也可以使用自定义的Re-ID模型。只要它是UFF格式,并且每个对象的网络输出是L2范数的单个向量。然后基于余弦度量计算Re-ID相似性得分,并以与官方模型相同的方式用于执行数据关联。步骤如下:

1. 使用TensorFlow或PyTorch等深度学习框架训练Re-ID网络。
2. 确保TensorRT支持网络层,并将模型转换为UFF格式。仍然支持混合精度推理,并且INT8模式需要校准缓存。
3. 根据自定义模型的属性,在跟踪器配置文件中指定以下参数。然后使用新的Re-ID模型运行DeepStream SDK。

esNet所得:

3.5.2 自定义模型

​ 也可以使用自定义的Re-ID模型。只要它是UFF格式,并且每个对象的网络输出是L2范数的单个向量。然后基于余弦度量计算Re-ID相似性得分,并以与官方模型相同的方式用于执行数据关联。步骤如下:

1. 使用TensorFlow或PyTorch等深度学习框架训练Re-ID网络。
2. 确保TensorRT支持网络层,并将模型转换为UFF格式。仍然支持混合精度推理,并且INT8模式需要校准缓存。
3. 根据自定义模型的属性,在跟踪器配置文件中指定以下参数。然后使用新的Re-ID模型运行DeepStream SDK。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/132235.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode【701】二叉搜索数的插入操作

题目: 思路: https://zhuanlan.zhihu.com/p/272781596 代码: class Solution {public TreeNode insertIntoBST(TreeNode root, int val) {return process(root,val); }//递归public TreeNode process(TreeNode root,int val){//base ca…

Hls学习(一)

1:CPU、DSP、GPU都算软件可编程的硬件 2:dsp在递归方面有所减弱,在递归方面有所增强,比如递归啊等,GPU可以同时处理多个进程,对于大块数据,流处理比较适用 3:为了提高运算量处理更多…

可视化 | 3D文字球状标签云

文章目录 📚改编点📚final 改编自echarts 3d词云(指向滑动、拖动、缩放、点击、自转 ) 📚改编点 背景透明:background:rgb(0,0,0,0);不用链接,用span,重点span标class"star&q…

文心耀乌镇,“大模型之光”展现了什么?

“乌镇的小桥流水,能照见全球科技的风起云涌。” 多年以来,伴随着中国科技的腾飞,以及世界互联网大会乌镇峰会的连续成功举办,这句话已经成为全球科技产业的共识。乌镇是科技与互联网的风向标、晴雨表,也是无数新故事开…

【ATTCK】MITRE Caldera 简介

一、什么是Caldera caldera是一个基于MITRE ATT&CK™构建的网络安全框架。其目标是创建一种工具,通过提供自动化安全评估来增强网络从业者的能力,从而节省用户的时间、金钱和精力。为此,需要几个关键组件才能使 Caldera 成为行业领先的平…

外接式网络隔离变压器/网络隔离滤波器/网口变压器/脉冲变压器/网络隔离变压器模块

Hqst华强盛(石门盈盛)电子导读:外接式网络隔离变压器/网络隔离滤波器/网口变压器/脉冲变压器/网络隔离变压器模块,后统称网络隔离变压器,它是一种安装在电路外部的隔离变压器,主要用于隔离网络中的干扰信号…

巨好用又实用的18款3dMax插件!

3dMax是一款功能强大的 3D 软件,具有建模、动画、粒子动力学等许多强大功能。但并不是每个人都能有效地利用max的每一个功能,例如,很多人发现3dmax粒子流太难使用,3ds max蒙皮工具也是如此。 这让我们一些专业的开发公司或个人和…

跨域:利用iframe实现跨域DOM互访的四种方式

注:跨域的知识点详见:跨域相关知识点 目录 实验验证环境配置: 1、利用document.domain降域 方法1: 方法2: 2、利用location.hash 3、利用window.name 4、利用postMessage(最推荐) 使用postmessage实现跨域访问…

视频剪辑助手:轻松实现视频随机分割并提取音频保存

随着社交媒体和视频平台的日益普及,视频制作和分享已成为人们日常生活的一部分。无论是分享个人生活,还是展示才艺,或是推广产品,视频都是一个非常有效的工具。但是,视频制作往往涉及到大量的视频剪辑工作,…

卡码网语言基础课 | 11. 句子缩写

目录 一、 字符串大小的比较 二、 ASCII码值 三、 基本框架代码 四、 解题思路 4.1 首字母问题 4.2 判定小写字母 4.3 小写字母转换为大写字母 五、空格判断 六、 代码模块化 6.1 满足的条件 6.2 代码完善 七、 题目解答 7.1 原始代码 7.2 改进代码 八、 拓展与…

Redis五种数据类型及命令操作(一)

🎈个人公众号:🎈 :✨✨✨ 可为编程✨ 🍟🍟 🔑个人信条:🔑 知足知不足 有为有不为 为与不为皆为可为🌵 🍉本篇简介:🍉 本篇记录Redis五种数据类型及命令操作,如…

[BJDCTF2020]Easy MD5 1

题目环境: 尝试了SQL注入、命令执行等都不行 点击提交并burp进行抓包Repeater进行重放这里看到了内置的SQL语句select * from admin where passwordmd5($pass,true) 发现传进去的值会进行md5加密 这里看了大佬们的解释 ffifdyop绕过,绕过原理是&#xff…

计算机网络期末复习-Part3

1、rdt1.0,rdt2.0,rdt3.0的底层信道模型 RDT 1.0: 完全可靠的底层信道,没有比特差错,也没有分组丢失。 RDT 2.0: 具有比特差错的底层信道,有比特差错,但没有分组丢失。 RDT 3.0: 具有差错和丢包的底层信道…

聊聊性能测试的左移右移

前面的文章中,分享过我对于测试左移右移的一些思考和实践方法。有同学在后台留言问我:常规的性能测试一般都是在测试阶段集成测试时候才开始介入,很容易测试时间不够,可不可以借鉴测试左移右移的思路,更早的介入和发现…

实战Leetcode(三)

Practice makes perfect! 实战一: 带环问题其实我们小学时就接触过,就比如在操场上比赛跑步的追击问题,这里也是一样,如果我们定义两个指针,一个快指针,一个慢指针,快指针走的快&…

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException:

错误描述如下所示: 我们将错误拉到最下面如下所示为导致异常的原因: Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type com.example.reviewmybatisplus.Service.UserService available: expec…

基于Mahony互补滤波的IMU数据优化_学习笔记整理

这周自己被安排进行优化软件 IMU 姿态解算项目,之前自己只简单了解四元数,对IMU数据处理从未接触,通过这一周的学习感觉收获颇丰,在今天光棍节之际,,,用大半天的时间对这一周的收获进行整理&…

SwiftUI 如何保证 Text 中字符数量相等的字符串显示宽度一定相同?

0. 问题现象 在 SwiftUI 中我们往往需要将内容相似的字符串展列出来给用户比较,这些字符串内容各有不同但字符数量始终是相等的,我们希望它们的显示宽度始终保持一致: 如上图所示:即使是等宽字符组成的字符串在字符数量相等时它们的显示宽度仍然可能不一致。但演示中最底部…

迷雾系统-人物驱散迷雾

使用linerRender,将人物移动数据动态添加进去,同样是特殊层级让FogCamera渲染 EndCapVertices的数量越多,矩形就变为一个椭圆形的形状,更适合圆形视野探索 当拐点的两个点距离太近,LineRender会发生扭曲,解决方案是在…

14 # 手写 debounce 防抖方法

什么是防抖 防抖: n 秒后再去执行该事件,若在 n 秒内被重复触发,则重新计时,这个效果跟英雄联盟里的回城技能差不多。 本质上是优化高频率执行代码的一种手段,目的就是降低回调执行频率、节省计算资源。 应用场景: …