行人重识别Person_reid_baseline_pytorch训练及数据集制作流程

目前基于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等,每个文件夹中的图片进行重命名为上述命名规则。

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

# -*- coding: utf-8 -*-
import os
import random
# 设定文件路径
path1 = './20230306/'

i = 3000
# 对目录下的文件进行遍历
for category in os.listdir(path1):
    # 设置新文件夹名
    folder_name = str(i)
    folder_path = os.path.join(path1, folder_name)
    # if not os.path.exists(folder_path):
    # 重命名
    Newdir = os.path.join(path1,folder_name.zfill(4))
    os.rename(os.path.join(path1, category), Newdir)
    #os.rename(folder_path,os.path.join(folder_path.zfill(4)))
    file_path = Newdir#os.path.join(path1,category)
    j = 1
    # 对目录下的文件进行遍历
    for file in os.listdir(file_path):
        # print(file)
        # 判断是否是文件
        # if os.path.isfile(os.path.join(file_path, file)):
        # 设置新文件名
        file_name = str(folder_name) + '_' + 'c'+str(random.randint(1,6))+'s1_' + str(j).zfill(6) + '.jpg'
        # 重命名
        new_file_name = os.path.join(file_path, file_name)
        os.rename(os.path.join(file_path, file), new_file_name)
        print(new_file_name)
        j += 1

    i += 1
# 结束
print("End")

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

这里也附一个脚本:

import cv2
import os
import glob
import shutil
import random
#path = r"D:\xxx\32\*.jpg"

def select_some_folder(filepath,target_filepath,filepath1,target_filepath1):
    path_dir = os.listdir(filepath)
    pick_number = 100 #这里的100就是你想从所有数据中(未抽取前所有数据都在train和val里)随机抽多少class进测试集(query和gallery)
    sample = random.sample(path_dir,pick_number)
    
    for name in sample:
        shutil.move(filepath+name,target_filepath+name)
        shutil.move(filepath1+name,target_filepath1+name)
        

if __name__ =="__main__":
    fileDir = "./train/"
    tarDir = "./val/"
    query_dir = "./query/"
    gallery_dir = "./gallery/"
    
    select_some_folder(fileDir,gallery_dir,tarDir,query_dir)

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

 这里同样还附一个脚本:

import cv2
import os
import glob
import shutil
import random
#path = r"D:xxx\32\*.jpg"

def select_one_image(filepath,target_filepath):
    path_dir = os.listdir(filepath)
    pick_number = 1
    sample = random.sample(path_dir,pick_number)
    
    for name in sample:
        shutil.move(filepath+name,target_filepath+name)
        

if __name__ =="__main__":
    fileDir = "./train/"
    tarDir = "./val/"
    
    
    for oneDir in os.listdir(fileDir):
        onefileDir = fileDir+oneDir+"/"
        onetarDir = tarDir+oneDir+"/"
        
        if not os.path.exists(onetarDir):
            os.mkdir(onetarDir)
            
        select_one_image(onefileDir,onetarDir)

 二、训练

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

在model.py中第75行

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

 

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

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

 

 三、测试

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

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

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

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

四、Demo.py

       Python demo.py

       --query_index 从第几个query队列中选择图片进行特征对比

       --test_dir 数据集Path

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

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

 

  • 5
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
### 回答1: person_reid_baseline_pytorch是一个基于PyTorch框架的人员识别基线模型。它可以用于训练和测试人员识别模型,以识别不同人员之间的差异和相似之处。该模型提供了一些基本的功能,如数据加载、模型训练、模型测试等,可以帮助用户快速搭建和测试自己的人员识别模型。 ### 回答2: person_reid_baseline_pytorch是一个基于PyTorch框架的人体重识别模型。该模型采用卷积神经网络(Convolutional Neural Network,简称CNN)架构,采用多个卷积层和池化层进行特征提取,最后经过全连接层得到人物特征向量,实现了对人体进行识别。 该模型的训练数据集一般采用Market1501数据集,它包含超过1501个不同身份的超过32000张图片,是一个非常大且具有代表性的数据集训练出的模型能够具有很好的泛化能力。 在训练过程中,除了使用标准的交叉熵损失作为损失函数外,还使用Triplet Loss作为损失函数的一种变形。该损失函数能够比较好地处理重识别中的最大间隔问题,并且能够实现对同一身份的多张图片之间的特征相似度比较。 对于测试的预测部分,该模型采用的是余弦相似度进行特征向量相似度计算,相似度越高则说明两个图片中的人物越有可能是同一个人,可以实现良好的识别结果。 总的来说,person_reid_baseline_pytorch基于PyTorch框架实现的人体重识别模型,通过CNN架构进行特征提取,使用Triplet Loss进行训练,使用余弦相似度进行特征向量相似度计算,能够实现对人体进行高效准确的识别。 ### 回答3: person_reid_baseline_pytorch 是一个基于 PyTorch 框架的行人重识别算法基线模型,它实现了一个简单但功能齐全的行人重识别框架,可以训练和测试基于清晰照片的行人重识别任务。 该模型包含了基本卷积神经网络(CNN)的搭建和训练,其中包括几个关键部分:数据加载、模型定义、训练和测试。它使用数据增强技术和三元损失函数来训练模型,目的是使相同人的图像对与不同人的图像对之间的距离最大化。 person_reid_baseline_pytorch 采用 Market-1501 数据集进行测试,并在该数据集上取得了不错的结果。该数据集包含 1501 个行人,共有 12936 张图像,其中包括 6 种视角和多种行为。该算法读取图像数据并将之前处理后的行人图像输入神经网络,以便为每个图像计算行人的特征向量。然后,使用相关算法来比较图像对的距离,并确定它们是否属于同一人。该算法的性能指标包括准确度、精度和召回率等。 总之,person_reid_baseline_pytorch 提供了一个简单但完整的框架和基线模型,可以作为进一步解决行人重识别问题的基础。无论是学术界还是商业界,这种算法都有广泛的应用前景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值