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

文章目录

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

  2. 准备验证数据集,验证数据集存放在目录文件夹 lfw 中。

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

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

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

  6. 评估模型

① 将评估用的数据集放在根目录文件夹 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

  3. 然后会输出两张图片的相似度距离和效果对比图。源自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。
相关推荐
兆。3 分钟前
掌握 PyQt5:从零开始的桌面应用开发
开发语言·爬虫·python·qt
杰说新技术4 分钟前
Meta AI最新推出的长视频语言理解多模态模型LongVU分享
人工智能·aigc
说私域7 分钟前
基于开源 AI 智能名片、S2B2C 商城小程序的用户获取成本优化分析
人工智能·小程序
东胜物联27 分钟前
探寻5G工业网关市场,5G工业网关品牌解析
人工智能·嵌入式硬件·5g
南宫理的日知录36 分钟前
99、Python并发编程:多线程的问题、临界资源以及同步机制
开发语言·python·学习·编程学习
皓74138 分钟前
服饰电商行业知识管理的创新实践与知识中台的重要性
大数据·人工智能·科技·数据分析·零售
coberup1 小时前
django Forbidden (403)错误解决方法
python·django·403错误
985小水博一枚呀1 小时前
【深度学习滑坡制图|论文解读3】基于融合CNN-Transformer网络和深度迁移学习的遥感影像滑坡制图方法
人工智能·深度学习·神经网络·cnn·transformer
龙哥说跨境1 小时前
如何利用指纹浏览器爬虫绕过Cloudflare的防护?
服务器·网络·python·网络爬虫
AltmanChan1 小时前
大语言模型安全威胁
人工智能·安全·语言模型