deepsort训练market1501数据集

deepsort训练market1501数据集1 market1501 数据集简介 Market 1501 数据集在清华大学校园中采集 夏天拍摄 在 2015 年构建并公开 它包括由 6 个摄像头 其中 5 个高清摄像头和 1 个低清摄像头 拍摄到的 1501 个行人 32668 个检测到的行人矩形框 每个行人至少由 2 个摄像头捕获到 并且在一个摄像头中可能具有多张图像 训练集有

大家好,我是讯享网,很高兴认识大家。

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目录结构


讯享网

 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数

讯享网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()

小讯
上一篇 2025-02-22 07:11
下一篇 2025-02-24 10:17

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/34381.html