deepsort训练market1501数据集

这篇具有很好参考价值的文章主要介绍了deepsort训练market1501数据集。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.market1501数据集简介

Market-1501 数据集在清华大学校园中采集,夏天拍摄,在 2015 年构建并公开。它包括由6个摄像头(其中5个高清摄像头和1个低清摄像头)拍摄到的 1501 个行人、32668 个检测到的行人矩形框。每个行人至少由2个摄像头捕获到,并且在一个摄像头中可能具有多张图像。训练集有 751 人,包含 12,936 张图像,平均每个人有 17.2 张训练数据;测试集有 750 人,包含 19,732 张图像,平均每个人有 26.3 张测试数据。3368 张查询图像的行人检测矩形框是人工绘制的,而 gallery 中的行人检测矩形框则是使用DPM检测器检测得到的。该数据集提供的固定数量的训练集和测试集均可以在single-shot或multi-shot测试设置下使用。

1.1目录结构

deepsort训练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

1.2命名规则
以 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 表示手工标注框

2.数据集划分

由于有1501个行人,因此需要划分成1501个文件夹,每个文件夹下放同一个人的图片,用前751个行人的文件夹做训练集,后750个行人的文件夹做测试集。

2.1划分数据的代码

import os
from PIL import Image
from shutil import copyfile, copytree, rmtree, move
 
PATH_DATASET = '/home/zqy/Desktop/yolov5-master/nxm_data/crops'  # 需要处理的文件夹
PATH_NEW_DATASET = '/home/zqy/Desktop/yolov5-master/nxm_data/stitches'  # 处理后的文件夹
PATH_ALL_IMAGES = PATH_NEW_DATASET + '/all_images'
PATH_TRAIN = PATH_NEW_DATASET + '/train'
PATH_TEST = PATH_NEW_DATASET + '/test'
 
 
# 定义创建目录函数
def mymkdir(path):
    path = path.strip()  # 去除首位空格
    path = path.rstrip("\\")  # 去除尾部 \ 符号
    isExists = os.path.exists(path)  # 判断路径是否存在
    if not isExists:
        os.makedirs(path)  # 如果不存在则创建目录
        print(path + ' 创建成功')
        return True
    else:
        # 如果目录存在则不创建,并提示目录已存在
        print(path + ' 目录已存在')
        return False
 
 
class BatchRename():
    '''
    批量重命名文件夹中的图片文件
    '''
 
    def __init__(self):
        self.path = PATH_DATASET  # 表示需要命名处理的文件夹
 
    # 修改图像尺寸
    def resize(self):
        for aroot, dirs, files in os.walk(self.path):
            # aroot是self.path目录下的所有子目录(含self.path),dir是self.path下所有的文件夹的列表.
            filelist = files  # 注意此处仅是该路径下的其中一个列表
            # print('list', list)
 
            # filelist = os.listdir(self.path) #获取文件路径
            total_num = len(filelist)  # 获取文件长度(个数)
 
            for item in filelist:
                if item.endswith('.jpg'):  # 初始的图片的格式为jpg格式的(或者源文件是png格式及其他格式,后面的转换格式就可以调整为自己需要的格式即可)
                    src = os.path.join(os.path.abspath(aroot), item)
 
                    # 修改图片尺寸到128宽*256高
                    im = Image.open(src)
                    out = im.resize((128, 256), Image.ANTIALIAS)  # resize image with high-quality
                    out.save(src)  # 原路径保存
 
    def rename(self):
 
        for aroot, dirs, files in os.walk(self.path):
            # aroot是self.path目录下的所有子目录(含self.path),dir是self.path下所有的文件夹的列表.
            filelist = files  # 注意此处仅是该路径下的其中一个列表
            # print('list', list)
 
            # filelist = os.listdir(self.path) #获取文件路径
            total_num = len(filelist)  # 获取文件长度(个数)
 
            i = 1  # 表示文件的命名是从1开始的
            for item in filelist:
                if item.endswith('.jpg'):  # 初始的图片的格式为jpg格式的(或者源文件是png格式及其他格式,后面的转换格式就可以调整为自己需要的格式即可)
                    src = os.path.join(os.path.abspath(aroot), item)
 
                    # 根据图片名创建图片目录
                    dirname = str(item.split('_')[0])
                    # 为相同车辆创建目录
                    # new_dir = os.path.join(self.path, '..', 'bbox_all', dirname)
                    new_dir = os.path.join(PATH_ALL_IMAGES, dirname)
                    if not os.path.isdir(new_dir):
                        mymkdir(new_dir)
 
                    # 获得new_dir中的图片数
                    num_pic = len(os.listdir(new_dir))
 
                    dst = os.path.join(os.path.abspath(new_dir),
                                       dirname + 'C1T0001F' + str(num_pic + 1) + '.jpg')
                    # 处理后的格式也为jpg格式的,当然这里可以改成png格式    C1T0001F见mars.py filenames 相机ID,跟踪指数
                    # dst = os.path.join(os.path.abspath(self.path), '0000' + format(str(i), '0>3s') + '.jpg')    这种情况下的命名格式为0000000.jpg形式,可以自主定义想要的格式
                    try:
                        copyfile(src, dst)  # os.rename(src, dst)
                        print('converting %s to %s ...' % (src, dst))
                        i = i + 1
                    except:
                        continue
            print('total %d to rename & converted %d jpgs' % (total_num, i))
 
    def split(self):
        # ---------------------------------------
        # train_test
        images_path = PATH_ALL_IMAGES
        train_save_path = PATH_TRAIN
        test_save_path = PATH_TEST
        if not os.path.isdir(train_save_path):
            os.mkdir(train_save_path)
            os.mkdir(test_save_path)
 
        for _, dirs, _ in os.walk(images_path, topdown=True):
            for i, dir in enumerate(dirs):
                for root, _, files in os.walk(images_path + '/' + dir, topdown=True):
                    for j, file in enumerate(files):
                        if (j == 0):  # test dataset;每个车辆的第一幅图片
                            print("序号:%s  文件夹: %s  图片:%s 归为测试集" % (i + 1, root, file))
                            src_path = root + '/' + file
                            dst_dir = test_save_path + '/' + dir
                            if not os.path.isdir(dst_dir):
                                os.mkdir(dst_dir)
                            dst_path = dst_dir + '/' + file
                            move(src_path, dst_path)
                        else:
                            src_path = root + '/' + file
                            dst_dir = train_save_path + '/' + dir
                            if not os.path.isdir(dst_dir):
                                os.mkdir(dst_dir)
                            dst_path = dst_dir + '/' + file
                            move(src_path, dst_path)
        rmtree(PATH_ALL_IMAGES)
 
 
if __name__ == '__main__':
    demo = BatchRename()
    demo.resize()
    demo.rename()
    demo.split()
 

运行代码之后,在/home/zqy/Desktop/yolov5-master/nxm_data/stitches生成了train和test文件夹,每个文件夹中有1501个文件夹,每个test的子目录中的文件里都只有一张图片,因此我将所有test目录下的文件全部删除,将train子目录中的752-1501命名的文件夹放入test子目录中。

1.2修改train.py文件

transform_train = torchvision.transforms.Compose([
    torchvision.transforms.Resize((128, 64)),
    torchvision.transforms.RandomCrop((128, 64), padding=4),
    torchvision.transforms.RandomHorizontalFlip(),
    torchvision.transforms.ToTensor(),
    torchvision.transforms.Normalize(
        [0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])

修改149行的权值文件,以免覆盖原来的权值文件

        torch.save(checkpoint, './checkpoint/ckpt1.t7')

1.3修改model.py

训练集中有751个类别,因此需要修改类别个数为751

class Net(nn.Module):
    def __init__(self, num_classes= 751 ,reid=False): #将num_class修改为自己想要的类别数
        super(Net,self).__init__()
        # 3 128 64
        self.conv = nn.Sequential(
            nn.Conv2d(3,64,3,stride=1,padding=1),
            nn.BatchNorm2d(64),
            nn.ReLU(inplace=True),
            # nn.Conv2d(32,32,3,stride=1,padding=1),
            # nn.BatchNorm2d(32),
            # nn.ReLU(inplace=True),
            nn.MaxPool2d(3,2,padding=1),
        )

3.开始训练

3.1修改train.py下的数据集地址

其他参数可使用默认值

parser = argparse.ArgumentParser(description="Train on market1501")
parser.add_argument("--data-dir",default="D:/market1501/stitches",type=str) #修改此处的default  改为自己数据集保存的位置
parser.add_argument("--no-cuda",action="store_true")
parser.add_argument("--gpu-id",default=0,type=int)
parser.add_argument("--lr",default=0.1, type=float)
parser.add_argument("--interval",'-i',default=20,type=int)
parser.add_argument('--resume', '-r',action='store_true')
args = parser.parse_args()

3.2修改epoch数文章来源地址https://www.toymoban.com/news/detail-469406.html

def main():
    for epoch in range(start_epoch, start_epoch+40): # 代码默认为跑40个epoch,通过修改后面的数字,可以根据自己的需求控制epoch的数目
        train_loss, train_err = train(epoch)
        test_loss, test_err = test(epoch)
        draw_curve(epoch, train_loss, train_err, test_loss, test_err)
        if (epoch+1)%20==0:
            lr_decay()

到了这里,关于deepsort训练market1501数据集的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 创建数据库Market、Team,按要求完成指定操作

    创建数据库Market,在Market中创建数据表customers,customers表结构如表4.6所示,按要求进行操作。  代码如下: 在Market中创建数据表orders,orders表结构如表4.7所示,按要求进行操作。 代码如下: 在关联customers_info 表中的主键c_num时,orders表中的c_id和customers_info表中的c_num 的类型

    2024年02月13日
    浏览(50)
  • 【Deepsort】C++版本Deepsort编译(依赖opencv,eigen3)

    安装方法参考博客 当谈及线性代数计算库时,Eigen3是一个强大而受欢迎的选择。Eigen3是一个C++模板库,提供了许多用于线性代数运算的功能,如向量、矩阵、矩阵运算、线性方程组求解等。以下是Eigen3的一些主要特点和功能: 高性能:Eigen3使用了优化的算法和技术,具有出

    2024年02月06日
    浏览(39)
  • Private market:借助ZK实现的任意计算的trustless交易

    Private market,借助zk-SNARKs和以太坊来 隐私且trustlessly selling: 1)以太坊地址的私钥(ECDSA keypair) 2)EdDSA签名 3)Groth16 proof:借助递归性来匿名交易Groth16 proofs。 开源代码实现见: https://github.com/dmpierre/eth-private-market(Circom、TypeScript、Solidity) https://github.com/nulven/EthDataMarketp

    2024年02月10日
    浏览(42)
  • DLS MARKETS外汇 :外汇投资的关键知识——您的成功之路

    外汇市场,作为全球的金融市场,每天的成交量高达6万亿美元,吸引了无数投资者的目光。本文旨在为广大投资者提供一个全面的外汇投资指南,涵盖基础知识、交易策略、市场分析等多个方面,帮助您深入理解外汇市场的运作机制和成功交易的关键要素。  外汇市场的吸引

    2024年01月25日
    浏览(32)
  • 电力市场知识及市场出清电价(market clearing price)程序分享!

    ​Main-导览 一、电力市场概述 2000以前,国内并不存在电力市场,而是叫计划电力经济。发电侧为卖方,核算发电成本和利润上报国家,审核通过后就是上网电价。用户侧为买方,被动执行国家制定的分时电价。计划电力经济的优势为:电价相对稳定,企业用电成本核算相对

    2024年01月25日
    浏览(40)
  • Boost Your Strategy With The Content Marketing Tools

    Boost Your Strategy With The Content Marketing Tools In today’s digital landscape, content marketing tools have emerged as a crucial component of any successful online business. Delivering valuable and engaging content to your target audience drives traffic, builds brand awareness, and increases conversions. However, managing and optimizing content marketi

    2024年02月05日
    浏览(38)
  • Avellaneda & Stoikov’s market-making strategy 工程化处理

    前2篇文章详细介绍了AS存货模型的做市策略,这次对于这些公式里面一些希腊字母的取值是如何计算的,如何做工程化并应用到生产环境中做一些说明。 这个里面有一些重要参数: 很直观,可以直接取值的有: s = current market mid price (中间价,也就是【最佳卖价+最佳买价】

    2024年01月18日
    浏览(53)
  • g) Visa: How Blockchain Can Facilitate the IoT Market

    作者:禅与计算机程序设计艺术 物联网(IoT)正在成为当前世界上最具规模的新兴产业之一。近年来,全球各行各业都涌现了大量的互联网终端设备,它们将物联网技术引入到自己的生活中,并产生了巨大的商业价值。但是,相对于其它传统电信、信息化领域来说,构建可靠

    2024年02月07日
    浏览(40)
  • 目标追踪---deepsort原理讲解

    目录 一、多目标追踪的主要步骤 二、sort流程 三、Deepsort算法流程 获取原始视频帧 利用目标检测器对视频帧中的目标进行检测 将检测到的目标的框中的特征提取出来,该特征包括表观特征(方便特征对比避免ID switch)和运动特征(运动特征方便卡尔曼滤波对其进行预测)

    2023年04月18日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包