追踪行人和车辆,并使用deep-person-reid训练自定义追踪模型(行人和车辆两类)

news2025/3/1 7:00:44

deep-person-reid训练自定义模型

  • 1. 准备代码
  • 2. market1501格式
  • 3 转换格式代码
  • 4. 训练
  • 5 追踪测试

仅供参考,目前实现的格式转化还是存在一定的问题,导致训练后的模型精度很高,分配上还是没有完全符合market1501的格式。依照这样训练的模型,效果还可以,

1. 准备代码

  1. yolov5追踪代码
    在这里插入图片描述
  2. deep-person-reid代码
git clone https://github.com/KaiyangZhou/deep-person-reid.git

2. market1501格式

目录介绍
1) “bounding_box_test”——用于测试集的 750 人,包含 19,732 张图像,前缀为 0000 表示在提取这 750 人的过程中DPM检测错的图(可能与query是同一个人),-1 表示检测出来其他人的图(不在这 750 人中)
2) “bounding_box_train”——用于训练集的 751 人,包含 12,936 张图像
3) “query”——为 750 人在每个摄像头中随机选择一张图像作为query,因此一个人的query最多有 6 个,共有 3,368 张图像
4) “gt_query”——matlab格式,用于判断一个query的哪些图片是好的匹配(同一个人不同摄像头的图像)和不好的匹配(同一个人同一个摄像头的图像或非同一个人的图像)
5) “gt_bbox”——手工标注的bounding box,用于判断DPM检测的bounding box是不是一个好的box
命名规则
以 0001_c1s1_000151_01.jpg 为例
1) 0001 表示每个人的标签编号,从0001到1501;
2) c1 表示第一个摄像头(camera1),共有6个摄像头;
3) s1 表示第一个录像片段(sequece1),每个摄像机都有数个录像段;
4) 000151 表示 c1s1 的第000151帧图片,视频帧率25fps;
5) 01 表示 c1s1_001051 这一帧上的第1个检测框,由于采用DPM检测器,对于每一帧上的行人可能会框出好几个bbox。00 表示手工标注框

3 转换格式代码

import os
import shutil
import random

# 输入数据文件夹
input_pedestrian_folder = r"F:\sjh\code\deep-person-reid\reid-data\my_data\person"
input_vehicle_folder = r"F:\sjh\code\deep-person-reid\reid-data\my_data\car"

# 输出数据文件夹
output_root = r"F:\sjh\code\deep-person-reid\reid-data\my_data/Market1501"
bounding_box_train = os.path.join(output_root, "bounding_box_train")
bounding_box_test = os.path.join(output_root, "bounding_box_test")
query = os.path.join(output_root, "query")

if os.path.exists(bounding_box_train):

    shutil.rmtree(bounding_box_train)
    shutil.rmtree(bounding_box_test)
    shutil.rmtree(query)
os.makedirs(bounding_box_train, exist_ok=True)
os.makedirs(bounding_box_test, exist_ok=True)
os.makedirs(query, exist_ok=True)

def rename_and_split_images(input_folder, pid_start, camid, query_bool=False,classes=0):
    pid = pid_start
    image_files = os.listdir(input_folder)
    frame = 1
    for image_file in image_files:
        # 为每个行人/车辆分配一个唯一的pid
        # pid += 1
        # if classes == 1:
        #     pid = 1
        # elif classes == 2:
        #     pid = 2
        src_path = os.path.join(input_folder, image_file)

        # 在这里,我们假设每个输入文件夹只有一个摄像头和连续的帧

        frame += 1
        new_image_name = f"{pid:04d}_c{camid}s{camid}_{frame:06d}.jpg"
        dest_path = os.path.join(bounding_box_train, new_image_name)
        shutil.copyfile(src_path, dest_path)

        # 随机选择一些图像分配给bounding_box_test和query
        if random.random() < 0.1:
            frame += 1

            new_image_name = f"{pid:04d}_c{camid}s{camid}_{frame:06d}.jpg"
            dest_path = os.path.join(bounding_box_test, new_image_name)
            shutil.copyfile(src_path, dest_path)

            frame += 1
            if query_bool:
                camid=2
            new_image_name = f"{pid:04d}_c{camid}s{camid}_{frame:06d}.jpg"
            dest_path = os.path.join(query, new_image_name)
            shutil.copyfile(src_path, dest_path)

    return pid

# 处理行人数据
last_pid = rename_and_split_images(input_pedestrian_folder, 0, 1,query_bool=True,classes=1)

# 处理车辆数据
rename_and_split_images(input_vehicle_folder, 1, 2, query_bool=True,classes=2)

数据存放位置,最后会生成market1501,用于训练的三个文件train、test、query:
在这里插入图片描述
在这里插入图片描述
代码命名规则:
0000_c1s1_000002.jpg

  1. 0000 表示种类人,0001表示车辆种类
  2. c1s1表示摄像机和录像片段,全部为1即可,但是query里全部设为了c2s2。
  3. 000002表示帧数,每类的所有照片按照不同帧数划分

4. 训练

新建一个train.py文件

import torchreid
if __name__ == '__main__':
    datamanager = torchreid.data.ImageDataManager(
        root="reid-data",#/market1501
        sources="market1501",
        targets="market1501",
        height=256,
        width=128,
        batch_size_train=36,
        batch_size_test=1,
        transforms=["random_flip", "random_crop"]
    )
    model = torchreid.models.build_model(
        name="resnet50",
        num_classes=datamanager.num_train_pids,
        loss="softmax",
        pretrained=True
    )

    model = model.cuda()

    optimizer = torchreid.optim.build_optimizer(
        model,
        optim="adam",
        lr=0.0003
    )

    scheduler = torchreid.optim.build_lr_scheduler(
        optimizer,
        lr_scheduler="single_step",
        stepsize=20
    )
    engine = torchreid.engine.ImageSoftmaxEngine(
        datamanager,
        model,
        optimizer=optimizer,
        scheduler=scheduler,
        label_smooth=True
    )
    engine.run(
        save_dir="log/resnet50",
        max_epoch=20,
        eval_freq=1,
        print_freq=1,
        test_only=False
    )

训练后会得到一个追踪模型,基于resnet50
在这里插入图片描述

5 追踪测试

  1. 将训练后的追踪模型放到追踪代码目录下,并命名为weights/resnet50_market1501.pt
  2. 下载追踪代码后,修改参数如下
parser.add_argument('--yolo-weights', nargs='+', type=Path, default=WEIGHTS / 'yolov5s.pt', help='model.pt path(s)')
parser.add_argument('--reid-weights', type=Path, default=WEIGHTS / 'resnet50_market1501.pt')
parser.add_argument('--tracking-method', type=str, default='bytetrack', help='strongsort, ocsort, bytetrack')#bytetrack最快,效果也比较好

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UG NX二次开发(C#)-建模-求解两条样条曲线的最大距离

文章目录 1、前言2、最大距离示例3、NXOpen代码实现1、前言 在UG NX中计算两条样条曲线的最小距离是我们常用的,但是计算最大距离却很少用,但是UG NX二次开发为我们提供了这个计算方法,我们只需要调用即可。本小节是用于计算两条样条曲线的最大距离的二次开发讲解。 2、最…

封装通用el-form表单(2种方式)

1、序言 项目地址&#xff1a;git clone form-demo: 封装通用el-form 一个后台管理系统最常见的是表单&#xff0c;表单最常见的是输入框、下拉选择、日期选择、单选、复选框等等&#xff0c; 系统添加若干模块&#xff0c;就复制粘贴若干个el-form、el-form-item&#xff0c;有…

Ubuntu下好用的截图工具flameshot

在Linux环境下截图也是十分重要的东西&#xff0c;flameshot则是一款十分好用的工具 sudo apt-get install flameshot 即可安装 安装完成后打开设置(settings) -> 设备(Devices) -> 键盘快捷键(keyboard Shortcuts),滑到最底下&#xff0c;找到一个加号 点击加号填入以…

300块买什么蓝牙耳机好?无线蓝牙耳机300左右推荐

不管你的手机是否被保留3.5mm的音频接口&#xff0c;蓝牙耳机必定是可以入手的&#xff0c;无束缚的听歌方式对我们中的大多数人都有着很强的吸引力。大多数都定价在几十几百几千不等&#xff0c;但是在300左右的价位更受大众欢迎&#xff0c;说明了中端市场是该类产品竞争最激…

如何把Ai绘画工具放到我们的App中

Scribble Diffusion 是一个简单的在线服务&#xff0c;它使用 AI 将粗略的草图转换为精致的图像&#xff0c;每一张图像都是不同的&#xff08;而且没有版权困扰&#xff09;。简单来说&#xff0c;我们只需要「用画笔描绘一张草图&#xff0c;在输入描述后稍等片刻」&#xff…

【Linux】1、操作系统、计算机硬件和软件、Linux 介绍

目录 一、计算机的硬件和软件(1) 硬件(2) 软件 二、操作系统(1) OS 作用(2) OS 举例 三、Linux 内核(1) 介绍(2) Linux 发行版 四、虚拟机 一、计算机的硬件和软件 (1) 硬件 &#x1f5a5;️ 计算机由硬件和软件组成 &#x1f5a5;️ 硬件&#xff1a;计算机中由电子、机械和…

pandas汇总和描述性统计

本文介绍pandas中汇总和描述性统计中的基本内容&#xff0c;仅供参考。 目录 1描述和汇总统计 1.1sum方法 1.2idxmin和idxmax方法 1.3describe方法 1.4描述和汇总统计的常用方法 2相关系数和协方差 3唯一值、值计数以及成员资格 3.1唯一值 3.2值计数 3.3成员资格 1…

【区块链】走进web3的世界-获取Token价格

1、通过预言机获取Token价格&#xff08;需要部署合约&#xff09; 在以太坊区块链上&#xff0c;由于智能合约本身无法获取外部数据&#xff0c;因此需要使用预言机 (Oracle) 来获取外部数据。 以下是一个获取代币价格的示例&#xff1a; 选择预言机&#xff1a;首先需要选…

ThreadLocal小记

1、ThreadLocal介绍 1.1、官方介绍 /*** This class provides thread-local variables. These variables differ from* their normal counterparts in that each thread that accesses one (via its* {code get} or {code set} method) has its own, independently initiali…

PPOCR - 命令行训练模型基本流程和常用命令+visualdl可视化

前言 本文记录实践中用paddleocr训练自己的模型的基本步骤和常用命令&#xff0c;以detection为例 更详细内容请参考官方文档https://github.com/PaddlePaddle/PaddleOCR/tree/release/2.6/doc/doc_ch 〇、环境准备 0.1 paddlepaddle环境安装 paddle环境安装链接 根据自己的…

H.264 编码中, I 帧、B 帧、P 帧、IDR 帧的区别

在H.264协议里定义了三种帧&#xff0c;完整编码的帧叫 I 帧&#xff0c;参考之前的 I 帧生成的只包含差异部分编码的帧叫 P 帧&#xff0c;还有一种参考前后的帧编码的帧叫 B 帧。 H.264采用的核心算法是帧内压缩和帧间压缩&#xff0c;帧内压缩是生成 I 帧的算法&#xff0c…

【镜像取证篇】DD和E01镜像格式区别(简)

【镜像取证篇】DD和E01镜像格式区别&#xff08;简&#xff09; ​ 简单总结下—【蘇小沐】 文章目录 【镜像取证篇】DD和E01镜像格式区别&#xff08;简&#xff09;1、实验环境 &#xff08;一&#xff09;DD镜像-原始镜像&#xff08;和源盘大小一致&#xff09;&#xff0…

C#基础学习--事件

目录 发布者和订阅者 源代码组件概览 声明事件 事件是成员 订阅事件 触发事件 标准事件的用法 通过扩展EventArgs来传递数据 泛型委托 移除事件处理程序 - 事件访问器 发布者和订阅者 发布者/订阅者模式中&#xff0c;发布者类 定义了一系列程序的其他部分可能感兴趣的事件…

第12讲:ElementUI+Vue路由综合案例

本博文主要呈现一个NPM脚手架Vue路由ElementUI的综合案例&#xff0c;完成本案例需要有一定的Vue基础&#xff0c;请参考以下文章完成项目的构建 第08讲&#xff1a;使用脚手架创建vue项目 第09讲&#xff1a;路由开发 第10讲&#xff1a;vue脚手架集成axios 第11讲&#xff1a…

2023年mahorcupC题电商物流网络包裹应急调运与结构思路分析

C 题 电商物流网络包裹应急调运与结构优化问题 电商物流网络由物流场地(接货仓、分拣中心、营业部等)和物流场 地之间的运输线路组成&#xff0c; 如图 1 所示。受节假日和“双十一” 、“618”等促销 活动的影响&#xff0c;电商用户的下单量会发生显著波动&#xff0c;而疫情…

软件测试真的只能干到35岁吗?难道测试岗位真的只是青春饭吗?

一&#xff1a;前言&#xff1a;人生的十字路口静坐反思 入软件测试这一行至今已经10年多&#xff0c;承蒙领导们的照顾与重用&#xff0c;同事的支持与信任&#xff0c;我的职业发展算是相对较好&#xff0c;从入行到各类测试技术岗位&#xff0c;再到测试总监&#xff0c;再…

释放数据价值这道难题,数据科学基础平台有解

去年底&#xff0c;《中共中央、国务院关于构建数据基础制度更好发挥数据要素作用的意见》&#xff08;以下简称&#xff1a;" 数据二十条 "&#xff09;正式颁布&#xff0c;标志着数据基础制度的建设步入快车道&#xff0c;数据要素化有望全面提速。 " 数据二…

通过遍历结果构造二叉树

⭐️前言⭐️ 本篇文章主要总结通过前序遍历、中序遍历、后序遍历中的两个遍历结果&#xff0c;来构造二叉树的过程&#xff0c;通过本篇文章的总结&#xff0c;可以解决一下问题。 LeetCode难度654. 最大二叉树&#x1f7e0;105. 从前序与中序遍历序列构造二叉树&#x1f7e…

编程辅助插件BitoAI使用指南(以VSCode开发环境为例安装并使用BitoAI插件从而提高生产效率)

2023年是AI爆发元年&#xff0c;已经被各种AI工具、新闻轰炸了几个月&#xff0c;只有一种感觉&#xff1a;时间不够用&#xff01; 本文介绍编程辅助神器&#xff1a;Bito AI。 本插件使用与ChatGPT相同的模型&#xff01;目前免费&#xff0c;且拥有强大的辅助能力&#xff0…

高压放大器应用之无损检测

在高压放大器的应用中&#xff0c;很多电子工程师经常会进行无损检测实验&#xff0c;那么无损检测是什么&#xff0c;无损检测的知识又有哪些呢&#xff0c;就让安泰电子带大家来看看。 无损检测是什么&#xff1a; 无损检测是指不损害物品的情况下对产品进行检测的方法&#…