Simple Baselines for Human Pose Estimation代码阅读

simple baseline是coco2017人体关键点检测亚军,他的代码是微软提供的,在python没有类似于springboot等框架的时候,python的代码经常会写的五花八门。作为一个刚入门的小白,通过学习这种规范化的代码可以很好地提升自己对于框架的认知能力。并且微软的代码可以给我提供一个很好的参考。

代码的总体结构如上图所示

  1. data中有coco的ann,images,后一个person_detect_result是MS自己测试出来的框图结果。
  2. experiment是网络训练中保存的参数,一般以yaml格式进行存储。针对不同的resnet,设置了不同的超参数数值。
  3. lib内包含所有工程代码,
    1. core中包含config,evaluate,function,inference,loss四个函数。
    2. dataset包含继承nn.DataSet的JointsDataset,用于实现getitem方法,coco和mpii为从不同数据集获取图像的方法。用于解耦。
    3. models包含pose_resnet,为模型的核心代码,继承了resnet非全连接层写法,并在后方添加了反卷积直接输出。nms方法,用于提升结果精度。
    4. utils方法中包含transform,utils->create_logger, get_optimizer, save_checkpoint,vis保存图像,zipreader.
  4. log记录按时间打的代码
  5. models按不同的数据集,不同的backbone和inputsize记录了不同的ckpt
  6. otuput按数据集->backbone->inputsize打log
  7. pose_estimation包含train和valid两个算法,train的过程也执行了valid算法。

代码的总体逻辑:

  1. 使用JointDataSet进行获取数据后的处理,从coco数据集获取的图像仅仅是一个左上右下的框,如何将原始的框整合为统一尺度输入网络?其策略是:首先,当然不能resize,这样形状转变容易影响对于一个人的判断。它将尺度不一致的框,若w:h不是256:192,那么将w或者h进行扩充,直到框的比例达到256:192。其次,将图像的w,h与200做比,计算出图像的scale。第三步,已经确定了一个点center,center的位置就是进行仿射变换的256*192的图像中点。框图左上角的坐标就是输入图像的0,0坐标点,两点再确定一个中点,得到三个点就可以进行仿射变换了。图像仿射变换后需要记录原始图像的center和scale,以便之后逆变换回来。
  2. 图像输入网络时,网络使用的结构为resnet+反卷积网络结构。论文中说明,当heatmap为原图的1/4的时候,acc最高,所以没有恢复到原图的整体大小直接输出。输出之后将图像进行反转后再检测一次,融合两次的检测结果达到最高的精度。该网络使用常规的heatmap输出网络的结果,输出17张特征图,每张特征图的weight最大的时候,就是关键点的位置。使用debug模式将图像映射到torchvision.grids上,然后将grid转为numpy,将每个坐标乘以4之后(因为输出的heatmap是原始输入图片的1/4),显示到图片上。
  3. 使用dataset.evaluate将图像的结果还原到整张大图上。该方法为,已知output的尺寸和output上的各个点,并且知道center和scale,也就是框图在原始图像中的位置,那么可以利用center和scale计算出三个点,仿射变换到output上。求出仿射矩阵。但是这时候需要反向映射到原图上,所以输入的三个点是output的三个点,映射的三个点是center上的三个点,也就相当于是一个逆仿射变换。
  4. 然后使用nms算法重定向?这一块还需要仔细查看一下具体做法,然后映射得坐标和框和图片整合成一个json保存下来作为最终得结果。

感受:第一次接触关键点检测感觉很神奇,首先关键点得映射我一直认为是一个回归问题,但是实际做法项目做成了分类问题。而且本文是个up-bottom得方法,先检测出框,然后将整个框缩放之后进行训练,也就解释了多人效果为啥那么好。还有就是映射得问题我一直没有看懂,为啥center与scale就能确定一个框,scale不是尺度吗?其实这个scale是基于200得比值结果,是个框得大小的意思。另外输出结果后,在debug模式我都没有搞明白为什么pred*4,跑去看model,看了半天才发现前面就是个纯resnet101,输出为7*7,后面为反卷积,反卷积了三次,也就是热图是原图的1/4,看论文才意识到热图为原图1/4时效果最好。所以pred*4之后的点才是输入图的关键点位置。最后一个evalute方法中output映射到原图的时候我一直在纠结output是原图的1/4,映射到output上不应该结果的关键点应该变为原图的1/4了吗?后来发现output的尺寸是输入,关键点的映射目标位置为center和scale,想反了。最后到现在nms也没太明白,今天先写到这里吧。

  • 9
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值