【DeepSORT系列之】模型训练pytorch版与模型部署操作

目录

          • 模型训练
            • 训练Mars行人数据集
            • 训练VeRi-776数据集
            • 混合训练Mars与VeRi数据集
          • 模型转换
          • 小结
          • 参考

模型训练

本篇属于模型训练与部署的操作性记录文档

训练代码链接ZQPei/deep_sort_pytorch

关于环境配置,你按照requirements.txt进行安装即可。

参数配置:

--data_dir # 数据路径
--gpu_id  # 使用gpu id
--lr # 学习率
--resume  # 是否读取之前模型继续训练
训练Mars行人数据集

关于训练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变化:

【DeepSORT系列之】模型训练pytorch版与模型部署操作_第1张图片

模型训练完成之后,尝试配置检测模型路径与参数。来对行人Re-ID跟踪进行运行看其效果:

# 1. 配置好输入视频参数路径
# 2. 对检测模型权重下载,demo默认是yolov3的权重
# 3. 运行时候会出现MMdet的依赖,如果没有安装的话建议先将其注释掉
python ped_det_server.py 
训练VeRi-776数据集

首先,你需要先下载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变化,可以发现车辆相比行人更容易收敛。

【DeepSORT系列之】模型训练pytorch版与模型部署操作_第2张图片

问题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 
混合训练Mars与VeRi数据集

我们知道行人ReID方式一般是找类内距离最大,并且它的任务属于单类别方式,不存在类间距离最大来进行分类。因此,对车辆与行人两种目标进行重识别是否可以一起训练看效果是否,我进行尝试。

【DeepSORT系列之】模型训练pytorch版与模型部署操作_第3张图片

模型训练完成之后,尝试配置检测模型路径与参数。来对车辆+行人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

你可能感兴趣的:(自动驾驶技术专栏,深度学习,deep,sort,reid)