本篇属于模型训练与部署的操作性记录文档
训练代码链接ZQPei/deep_sort_pytorch
关于环境配置,你按照requirements.txt
进行安装即可。
参数配置:
--data_dir # 数据路径
--gpu_id # 使用gpu id
--lr # 学习率
--resume # 是否读取之前模型继续训练
关于训练Mars
数据集在测试ACC时候精度很低的情况问题high loss low test acc。主要问题在于Mars
数据集你需要将bbox_train
文件夹下面的数据进行拆分生成一个bbox_val
文件夹。用于做模型训练的验证集,要确保训练与验证的类别一致。脚本如下:
import os
import random
import shutil
def moveFile(fileDir, dstDir, rate):
pathDir = os.listdir(fileDir)
file_number = len(pathDir)
dstDir = dstDir + fileDir[-4:]
if not os.path.isdir(dstDir):
os.mkdir(dstDir)
pick_number = int(file_number*rate)
sample = random.sample(pathDir, pick_number)
for name in sample:
shutil.move(fileDir+'/'+name, dstDir+'/'+name)
return
def mars_train_val(train_path, dst_path, rate):
for root, dirs, files in os.walk(train_path, topdown=True):
if root == train_path:
continue
moveFile(root, dst_path, rate)
if __name__ == '__main__':
# 在bbox_train同级目录下新建一个bbox_val文件夹
train_path = "/home/ubuntu/Data/Mars/bbox_train/"
dst_path = "/home/ubuntu/Data/Mars/bbox_val/"
if not os.path.isdir(dst_path):
os.mkdir(dst_path)
mars_train_val(train_path, dst_path, 0.2)
数据集拆分好之后,你只需要将test_dir
的文件路径改成刚刚生成的bbox_val
即可开始训练。
我们看一下训练的loss
变化:
模型训练完成之后,尝试配置检测模型路径与参数。来对行人Re-ID跟踪进行运行看其效果:
# 1. 配置好输入视频参数路径
# 2. 对检测模型权重下载,demo默认是yolov3的权重
# 3. 运行时候会出现MMdet的依赖,如果没有安装的话建议先将其注释掉
python ped_det_server.py
首先,你需要先下载VeRi-776
数据集。由于未开源,需要你联系作者获取。
获取到VeRi-776
数据集后,需要简单写个脚本转换来进行将VeRi
转换成Mars
格式,方便训练。
import os
import random
import shutil
def moveSampleFile(fileDir, dstDir, rate):
pathDir = os.listdir(fileDir)
file_number = len(pathDir)
dstDir = dstDir + fileDir[-4:]
if not os.path.isdir(dstDir):
os.mkdir(dstDir)
pick_number = int(file_number*rate)
sample = random.sample(pathDir, pick_number)
for name in sample:
shutil.move(fileDir+'/'+name, dstDir+'/'+name)
return
'''
Check the train folders image will be even number.
'''
def totalCalcFileNumber(fileDir, dstDir):
pathDir = os.listdir(fileDir)
file_number = len(pathDir)
# print(dstDir)
if file_number % 2 == 1:
print("image_train fileDir : ", fileDir, "path_dir : ", pathDir, "dstDir : ", dstDir)
# shutil.move(fileDir+'/'+pathDir[0], dstDir+pathDir[0])
else:
return
# dstDir = os.listdir(dstDir)
# dst_file_number = len(dstDir)
# if dst_file_number%2 == 1:
# print("image_val : ", dstDir)
def veri_datasets_train_val(train_path, dst_path, rate):
for root, dirs, files in os.walk(train_path, topdown=True):
if root == train_path:
continue
# moveSampleFile(root, dst_path, rate)
totalCalcFileNumber(root, dst_path)
def veri_2_mars_datasets(data_path, dstDir):
fileDir = os.listdir(data_path)
file_number = len(fileDir)
for file in fileDir:
fileName = file.split('_')[0]
if not os.path.isdir(dstDir+fileName):
os.mkdir(dstDir+fileName)
shutil.move(data_path+'/'+file, dstDir+fileName+'/'+file)
if __name__ == '__main__':
# step1: transfer VeRi to Mars Dataset format
# data_path = '/home/ubuntu/Data/VeRi/image_train/'
# dstDir = '/home/ubuntu/Data/VeRi/veri2mars/image_train/'
#
# veri_2_mars_datasets(data_path, dstDir)
# step 2: split train & val dataset.
train_path = "/home/ubuntu/Data/VeRi/veri2mars/image_train/"
dst_path = "/home/ubuntu/Data/VeRi/veri2mars/image_val/"
# dst_path = "/home/ubuntu/Data/VeRi/veri2mars/image_train/"
if not os.path.isdir(dst_path):
os.mkdir(dst_path)
veri_datasets_train_val(train_path, dst_path, 0.2)
首先,就是将VeRi
数据集按照不同车辆划分成为不同文件夹,随后进行存储。然后进行划分训练集与验证集。
下面为车辆训练过程的loss
变化,可以发现车辆相比行人更容易收敛。
问题1:报错empty range【主要在于训练数据集时候随机crop出现问题,VeRi图片有的没有那么大尺寸】。解决方式是丢弃随机crop的方式。
ValueError: empty range for randrange() (0, -2, -2)
问题2:报错BN【主要是训练阶段图像为奇数导致训练BN时候可能为1,解决方式是将训练集里面每个文件夹下图片数量改为偶数,代码可见veri_prepare.py里面有对数据整理】
ValueError: Excepted more than 1 value per channel when training, got input size torch.Size([1, 256])
模型训练完成之后,尝试配置检测模型路径与参数。来对车辆Re-ID跟踪进行运行看其效果:【注意:需要改动一下检测输出的cls_id
对应是车辆类别】
# 1. 配置好输入视频参数路径
# 2. 对检测模型权重下载,demo默认是yolov3的权重
# 3. 运行时候会出现MMdet的依赖,如果没有安装的话建议先将其注释掉
python ped_det_server.py
我们知道行人ReID
方式一般是找类内距离最大,并且它的任务属于单类别方式,不存在类间距离最大来进行分类。因此,对车辆与行人两种目标进行重识别是否可以一起训练看效果是否,我进行尝试。
模型训练完成之后,尝试配置检测模型路径与参数。来对车辆+行人Re-ID跟踪进行运行看其效果:【注意:需要改动一下检测输出的cls_id
对应是车辆+行人类别都输出】
# 1. 配置好输入视频参数路径
# 2. 对检测模型权重下载,demo默认是yolov3的权重
# 3. 运行时候会出现MMdet的依赖,如果没有安装的话建议先将其注释掉
python ped_det_server.py
解决完下面的报错问题,一般直接执行即可将模型转换成为onnx
。
python exportOnnx.py
问题1:报错如下【主要原因在于类别不一致,训练时候读取类别是与数据集变化的。模型网络代码默认写的是751个类别,这里需要改变成训练数据集的类别数】
RuntimeError: Error(s) in loading state_dict for Net:
size mismatch for classifier.4.weight: copying a param with shape torch.Size([625, 256]) from checkpoint, the shape in current model is torch.Size([751, 256]).
size mismatch for classifier.4.bias: copying a param with shape torch.Size([625]) from checkpoint, the shape in current model is torch.Size([751]).
问题2:报错fastreid【需要对模型代码中所有关于FastID相关进行注释掉即可】
ModuleNotFoundError: No module named 'fastreid'
本篇对pytorch
版本的deep_sort
进行实战demo
操作过程。记录一下其中所遇到的问题,同时也将车辆与行人混合进行训练看其综合效果。当然,目标跟踪当下两阶段的方式(检测+Re-ID
),我们可以分别对检测更换更加的模型同时对其Re-ID
模型进行更换,来达到我们所需要的性能与应用场景。目前还存在几个方面优化:第一:车辆与行人的进行embeddings
操作输入大小存在区别,车辆一般输入长宽比接近1:1
而行人长宽比近似3:1
因此直接采取相同输入大小不太合适。第二:关于针对不同的类别选择训练损失函数也可以优化一下,车辆与行人属于类间距离,但是每一个车辆ID
或者行人ID
属于类内距离,如何进行多类别Re-ID
训练达到最优方式。
deep_sort_pytorch