movenet.pytorch
                                
                                 movenet.pytorch copied to clipboard
                                
                                    movenet.pytorch copied to clipboard
                            
                            
                            
                        The model for thunder
Hi Author,
我拜读了有关代码。看起来目前的版本只支持Lightning。所以基于目前的代码,我做了一些修改。使其可以训练thunder版本,重要的修改如下:
- 采用coco 2017, 用make_coco_data_17keypooints.py进行过滤产生新的dataset
- 修改movenet_mobilenetv2.py,根据width mult 1.75调整网络参数,以及相应的upsample参数
- 修改movenet_loss.py,加载thunder的权重矩阵。这个权重矩阵我自己写代码产生,核心算法如下: ft_size = 64 delta = 1.8 weight_to_center = torch.zeros((ft_size, ft_size)) y, x = np.ogrid[0:ft_size, 0:ft_size] center_y, center_x = ft_size / 2.0, ft_size/ 2.0 y = y - center_y x = x - center_x weight_to_center = 1 / (np.sqrt(y * y + x * x) + delta) weight_to_center = weight_to_center.astype(np.float32).reshape(ft_size, ft_size, 1)
- 修改其它有关代码,主要是hard code的for lightning的地方,比如48修改成64,192改成256.
目前训练没有结束,看起来loss在持续降低,epoch 27的时候,val精度达到72%,还在继续训练。
目前遇到的问题是,用上面的checkpoint进行预测,看起来一个关键点都找不到,kpt hm的值都很小。 想请教作者,是否还有什么关键的地方需要做调整?Thanks!!
是的,因为我是追求速度,就复现的Lightning版本。 关键点找不到的原因有很多,可能需要打印下输出值排查下。你是用的我的predict.py预测的吗?这个应该会同步生成相关的heatmap图,你可以看看是否正常。
我看了下,主要区别应该就是size192换成256,width1.0换成1.75 然后相应需要修改的也就是两个权重矩阵,你说的好像只有一个?一个是中心的权重矩阵,一个是每个关键点的权重矩阵。不过前者是提前生成好的类似高斯核的权重,后者是代码里生成的固定0,1,2等差数列,有可能你指的hardcode也修改了。
谢谢指点。我修改的只是center weight,算法就是上面贴出来的,我提前生成了这个档,并且在代码里面做了调整,比如: movenet_loss.py _center_weight_path = 'lib/data/thunder_weight_center.npy'
关键点的权重矩阵,我想你说的是这个: _range_weight_x = np.array([[x for x in range(64)] for _ in range(64)]) _range_weight_y = _range_weight_x.T 等差数列,我已经修改48为64了。
那可能要慢慢排查下了,你可以先不改变分辨率只修改宽度因子,对比下提升。确认没问题,再去尝试修改分辨率。
OK,我再查一下。按理训练正常收敛,推理不应该是这个样子,目前我训练到: e33_valacc0.73361.pth
epoch 33, val精度73%的样子。
Hi author,
请教一下,boneLoss里面,设定了bone_idx,看起来像是针对你自己数据集做的设置。如果按照原生coco 17个关键点的设定,这个bone_idx应该如何设置呢?Thanks.
Hi author,
请教一下,boneLoss里面,设定了bone_idx,看起来像是针对你自己数据集做的设置。如果按照原生coco 17个关键点的设定,这个bone_idx应该如何设置呢?Thanks.
这个就是骨架,你可以按骨架来连接关键点id。但是实际代码好像是所有点都连接了,因为实测这样会有提升。
是的,我是这样理解的。不过如果按照原生coco的关键点索引: _bone_idx = [[0,1],[1,2],[2,3],[3,4],[4,5],[5,6],[2,4]] 代码中的[2,3]表示右眼跟左耳的连接,这个似乎不太合理,所以我才有此一问,是不是这是适配你自己的数据集的关键点。
另外还有几个问题想请教一下:
- 之前我修改代码进行thunder model训练后,推理结果不正常,原因是forward里面做了mean/std的预处理,而由于我自己写了处理视频的代码,又做了一次同样处理,所以造成这个结果。修正后看起来结果就正常多了,不过效果一般。想请问一下,你的数据集除了有清洗后的coco,其它诸如yoga/fitness等标注,是自己从video中抽取图片进行标注,还是网上有现成的数据可用?
- 有什么可视化手段或者工具来观察数据集的关键点分布吗?
谢谢指点!!
是的,这个一开始是我自己的数据集,这个忘记改了估计。
数据我没找到现成的,我是自己爬的比站的相关视频,然后抽帧然后手动标注的;
关键点分布你是指分布区域还是标注是否正确?这个应该需要自己根据自己的需求写脚本吧。比如把标注的关键点画到原图上然后观察是否标注正确。
好的,了解了。我想观察的是分布区域。因为我看到之前你的那篇文章里提到:关键点区域面积分布。我想这应该是看样本的area指标,然后做直方图分析,这样理解对吗?
这个应该没有现成的工具吧,都是自己按需求编写python脚本,通过numpy数据分析或者plt、opencv可视化
好的,多谢指点,我再研究看看,有问题再跟你请教。
请教一下,我自己改写shufflenetv2作为backbone,采用width mult 1.0的输出channel,基于原生的coco(用你的make_coco_data_17keypooints.py做了过滤),看起来训练的时候,很快Loss就不再下降,val acc则开始下降。
直接使用代码中的movenet_mobilenetv3.py(看起来像shufflenetv2做了一点改动),训练也是同样现象。
请问有什么建议吗?
直接使用movenet_mobilenetv3.py可以训练,得到的模型文件就是output/mbv3_e81_valacc0.78953.pth
(有可能是shufflenetv2,我当时也改过很多版本可能弄混了...)
了解。不过我这边的实验看起来,直接使用movenet_mobilenetv3.py training会不收敛。我自己改写的shufflenetv2,也是同样现象。我再研究看看。