当前位置:   article > 正文

行人重识别Person_reid_baseline_pytorch训练及数据集制作流程_train和gallery是什么集

train和gallery是什么集

目前基于Person_reid_baseline_pytorch的教程更多的是关于如何run起来这个工程,但如果想应用到其他细分项目上的教程比较少,数据集较为单一,且命令和格式复杂,所以本文将详细描述如何制作自建的数据集并选择不同的backbone进行训练(因为ResNet-50难以应用于落地)。

一、自建数据集的分类

 

1、训练集train+val,测试集query+gallery

以train为例,train文件夹下是各个类别图片存放的文件夹:

其中train+val是所有的训练图片,是全部图片的一部分,而另一部分图片则组成了测试集gallery+query,所以训练集和测试集加起来才是所有类别文件夹。val中各类别下是训练图片中每个分类下选取的一张图片,query中是测试图片中每个分类下,每个摄像机选取一张图片,但由于都是直播截图,所以只在每个类别文件夹下放置了一张图片,而其他的测试图片都放在gallery中。

2、命名规则

随便打开一张图片,其命名为

(1)0004代表其标签编号,属于第四个类

(2)c1代表这张图片来自第一个camera

(3)s6代表这张图片来自这个摄像头的非连续的第六个视频片段(自制数据集无区分)

(4)016996表示是c1s6的第16996帧

(5)02表示这是该帧中使用DPM得到的第2个检测框,若是手工标注的则为00

注意事项:即使是自制数据集没有那么多摄像头,摄像头数量c那里,也要给他随机random.randint(1,6)几个值,否则在test生成参数的时候,会得不到正确结果,反应如下

3、数据集制作 

(1)首先根据不同视频中的帧图片进行上半身检测,将得到的位置信息在图片中进行截取,获得每个视频中的上半身图片,当同个视频中存在不同的人物时,需要一一分成不同的文件夹。 

(2)将每个文件夹重命名为0001…0199等,每个文件夹中的图片进行重命名为上述命名规则。

这里放一个批量更改各类文件夹下的图片的脚本:

  1. # -*- coding: utf-8 -*-
  2. import os
  3. import random
  4. # 设定文件路径
  5. path1 = './20230306/'
  6. i = 3000
  7. # 对目录下的文件进行遍历
  8. for category in os.listdir(path1):
  9. # 设置新文件夹名
  10. folder_name = str(i)
  11. folder_path = os.path.join(path1, folder_name)
  12. # if not os.path.exists(folder_path):
  13. # 重命名
  14. Newdir = os.path.join(path1,folder_name.zfill(4))
  15. os.rename(os.path.join(path1, category), Newdir)
  16. #os.rename(folder_path,os.path.join(folder_path.zfill(4)))
  17. file_path = Newdir#os.path.join(path1,category)
  18. j = 1
  19. # 对目录下的文件进行遍历
  20. for file in os.listdir(file_path):
  21. # print(file)
  22. # 判断是否是文件
  23. # if os.path.isfile(os.path.join(file_path, file)):
  24. # 设置新文件名
  25. file_name = str(folder_name) + '_' + 'c'+str(random.randint(1,6))+'s1_' + str(j).zfill(6) + '.jpg'
  26. # 重命名
  27. new_file_name = os.path.join(file_path, file_name)
  28. os.rename(os.path.join(file_path, file), new_file_name)
  29. print(new_file_name)
  30. j += 1
  31. i += 1
  32. # 结束
  33. print("End")

(3)按比例将全部文件夹分成训练集(train+val)和测试集(query+gallery)

这里也附一个脚本:

  1. import cv2
  2. import os
  3. import glob
  4. import shutil
  5. import random
  6. #path = r"D:\xxx\32\*.jpg"
  7. def select_some_folder(filepath,target_filepath,filepath1,target_filepath1):
  8. path_dir = os.listdir(filepath)
  9. pick_number = 100 #这里的100就是你想从所有数据中(未抽取前所有数据都在train和val里)随机抽多少class进测试集(query和gallery)
  10. sample = random.sample(path_dir,pick_number)
  11. for name in sample:
  12. shutil.move(filepath+name,target_filepath+name)
  13. shutil.move(filepath1+name,target_filepath1+name)
  14. if __name__ =="__main__":
  15. fileDir = "./train/"
  16. tarDir = "./val/"
  17. query_dir = "./query/"
  18. gallery_dir = "./gallery/"
  19. select_some_folder(fileDir,gallery_dir,tarDir,query_dir)

(4)val的每个文件夹与train同名,从train中取一张图片置入;query的每个文件夹与gallery同名,从gallery中取一张图片置入。

 这里同样还附一个脚本:

  1. import cv2
  2. import os
  3. import glob
  4. import shutil
  5. import random
  6. #path = r"D:xxx\32\*.jpg"
  7. def select_one_image(filepath,target_filepath):
  8. path_dir = os.listdir(filepath)
  9. pick_number = 1
  10. sample = random.sample(path_dir,pick_number)
  11. for name in sample:
  12. shutil.move(filepath+name,target_filepath+name)
  13. if __name__ =="__main__":
  14. fileDir = "./train/"
  15. tarDir = "./val/"
  16. for oneDir in os.listdir(fileDir):
  17. onefileDir = fileDir+oneDir+"/"
  18. onetarDir = tarDir+oneDir+"/"
  19. if not os.path.exists(onetarDir):
  20. os.mkdir(onetarDir)
  21. select_one_image(onefileDir,onetarDir)

 二、训练

  1. python train.py
  2. --data_dir 数据集所在位置
  3. --name 训练结果所在文件夹名称
  4. --gpu_ids 使用哪几个gpu

在model.py中第75行

原文中说需要将class_num=751进行修改,这里的751使用的是market-1501数据集中的分类,但其实数据集名称做好的情况下,不需修改。

 

内置torch.utils.data.Dataloader将创建迭代器dataloader[‘train’]自动计算数据集中的类别数量。

训练结束后将获得一个.pth模型文件,存储了训练得到的特征数据,后续test将使用这个文件。

 

 三、测试

  1. Python test.py
  2. --name 注意这个name代表选择哪个训练结果,和train中的含义稍许不同
  3. --which_epoch 选择模型文件中的哪个epoch
  4. --test_dir 数据集path

(1)若训练正常的话,最后的torch.size[a,b]中的a是你测试集的类别数,如果不对的话需要进行检查哪里出错。

(2)如上图所示,如果rank后的值都为0的话,则是数据命名时的camera只设置了1,需要取更多camera值。

会生成一个result.mat文件,其中包含了query和gallery各图片的匹配信息,以字典的形式检索。

四、Demo.py

  1.        Python demo.py
  2.        --query_index 从第几个query队列中选择图片进行特征对比
  3.        --test_dir 数据集Path

运行后会从result.mat中调用特征信息,最后会生成一个show.png,第一张为你query_index给定的检索图片,后面10张是检索到的最匹配的图片,上标绿色的为同一类,上标红色的为不同类。

 相关资料:https://github.com/layumi/Person_reID_baseline_pytorch

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/136665
推荐阅读
相关标签
  

闽ICP备14008679号