目录
前言
本文是博主小学期作业一部分,尚未对模型结构吃透,对于深度学习也只是看了看门槛,请多担待。
以下是本篇文章正文内容,提供对于GaitDatasetB数据集的GaitSet论文的复现,下面案例可供参考
PS:再次重申,博主并非研究GaitSet方向,该文章为小学期作业,因此探究并不深入,博主对模型理解也不深入,大家遇到问题可以在评论区提问,欢迎大家同博主一起讨论问题,也欢迎遇到相似问题的小伙伴们互相帮忙。
一、GaitSet模型简介
论文地址https://ieeexplore.ieee.org/document/9351667
github地址https://github.com/AbnerHqC/GaitSet
论文为复旦大学发表于 AAAI 2019 的工作。截至目前CASIA-B正确率最高的网络。
这是我参考的论文翻译https://blog.csdn.net/o0haidee0o/article/details/91381669
使用数据集:CASIA-B
数据集连接http://www.cbsr.ia.ac.cn/english/Gait%20Databases.asp
二、数据集介绍(原文链接:https://blog.csdn.net/qq_42191914/article/details/105473925)
CASIA-B是比较经典的步态识别数据集,包含124个目标(subjects),每个目标有3种步行情况(normal/‘NM’、bag/‘BG’、coat or jacket/‘CL’)和11个角度(0°、18°、…、180°)。其中每个目标有6段NM序列、2段BG序列、2段CL序列。因此,每个目标都有
11*(6+2+2)=110段序列。
另外,该数据集没有官方的划分训练集和验证集,一般的做法是使用三种划分方法:
(a)Small-sample training(ST):训练集24个目标,验证集100个目标;
(b)Medium-sample training(MT):训练集62个目标,验证集62个目标;
(c)Large-sample training(LT):训练集74个目标,验证集50个目标。
三.数据预处理
数据输入和输出路径:文件pretreatment.py
parser.add_argument('--input_path', default='E:\GaitSet-master\data\GaitDatasetB-silh\pretreatment', type=str,
help='Root path of raw dataset.') # 这是输入路径,按照自己解压路径自行修改
parser.add_argument('--output_path', default='E:\GaitSet-master\data\GaitDatasetB-silh\output', type=str,
help='Root path for output.') #这是预处理输出路径
线程数设置:这里我设置的线程数为10
parser.add_argument('--worker_num', default=10, type=int,
help='How many subprocesses to use for data pretreatment. '
'Default: 0') # 线程数设置
开多线程需要在main函数中才能运行,所以我采取的解决办法(比较原始粗暴)是将所有函数包含在main中(即在原码中在import后写main,并将所有后面全部缩进):
from multiprocessing import TimeoutError as MP_TimeoutError
if __name__ == '__main__':
START = "START"
在cut_pickle函数中保存图片是用:
scisc.imsave(save_path, img)
但是会出现错误,改正方法:将scisc.imsave改为cv2.imwrite
cv2.imwrite(save_path, img)
四、测试
1、config.py配置
conf = {
"WORK_PATH": "./work",
"CUDA_VISIBLE_DEVICES": "1", # 所用GPU编号
"data": {
'dataset_path': "/local/pre-output/", # 数据加载路径(预处理时的输出路径)
'resolution': '64', # 输出轮廓图的分辨率,不用更改
'dataset': 'CASIA-B', # 数据集名称
# In CASIA-B, data of subject #5 is incomplete.
# Thus, we ignore it in training.
# For more detail, please refer to
# function: utils.data_loader.load_data
'pid_num': 73, # 训练集人数,73用于训练,其余用于测试
'pid_shuffle': False, # 是否对数据集进行随机划分,如果为False,则直接选取1-74
},
"model": {
'hidden_dim': 256, # 最后一层全连接层的隐藏层数
'lr': 1e-4, # 学习率
'hard_or_full_trip': 'full', # 损失函数
'batch_size': (8, 16), # 批次p*k = 8*16,
'restore_iter': 0, # 第几步开始训练
'total_iter': 80000, # 训练次数
'margin': 0.2, # 损失函数的margin参数
'num_workers': 3, # 线程数
'frame_num': 30, # 每个批次的帧数
'model_name': 'GaitSet',
},
}
2、test.py运行
运行test.py会出现以下错误:
ValueError: Object arrays cannot be loaded when allow_pickle=False
报错原因:自Numpy 1.16.3版本发行之后,函数 numpy.load() 和 numpy.lib.format.read_array() 采用allow_pickle关键字,默认为False
解决方法:降级Numpy 或者在numpy.load()参数中加一个allow_pickle=True:
以下是第二种解决方法:文件更改位置model/utils/data_loader.py第42行:
pid_list = np.load(pid_fname)
改为:
pid_list = np.load(pid_fname, allow_pickle=True)
以下是test.py运行结果: