HRNet

本文深入解析HRNet,一种用于单人姿态估计的深度学习模型,它在处理过程中始终保持高分辨率表示。HRNet从高分辨率子网开始,逐渐添加高低分辨率子网并行连接,实现多尺度融合,从而精确预测人体关键点。相关工作涉及回归关键点、热图估计、多尺度融合等技术。实验在COCO和MPII数据集上进行。
摘要由CSDN通过智能技术生成

【代码】

 

【论文】 

 

HRNet详解:翻译

人的姿态问题(human pose estimation problem)提出的网络能在整个过程中都保持高分辨率的表征,本文着力于研究single-person pose estimation.(分辨率越大看起来越清晰

高分辨率网络(HRNet):能够在整个过程中维护高分辨率的表示。我们从高分辨率子网作为第一阶段始,逐步增加高分辨率到低分辨率的子网(gradually add high-to-low resolution subnetworks),形成更多的阶段,并将多分辨率子网并行连接而不是像大多数现有解决方案那样串行连接。在整个过程中,我们通过在并行的多分辨率子网络上反复交换信息来进行多尺度的重复融合。我们通过网络输出的高分辨率表示来估计关键点。

Related Work: 

 1、单人体姿态估计: 目前,深度卷积神经网络提供了主流的解决方案有两种方法:

回归关键点位置regressing the position of keypoints

估算关键点热图estimating keypoint heatmaps,然后选择热值最高的位置作为关键点。

2、High-to-low and low-to-high

3、Multi-scale fusion:最直接的方法是将多分辨率图像分别送入多个网络,并聚合输出响应映射[64]。Hourglass[40]及其扩展[77,31]通过跳过连接,将high-to-low process中的低级别特征逐步组合为low-to-high process中的相同分辨率的高级别特性。在cascaded pyramid network[11]中,globalnet将high-to-low process中的低到高级别特征low-to-high level feature逐步组合到low-to-high process中,refinenet将通过卷积处理的低到高特征进行组合。我们的方法重复多尺度融合,部分灵感来自深度融合及其扩展[67,73,59,80,82]。

4、Intermediate supervision

COCO和MPII数据集

 网络结构图参考文献相关工作资源整理

机器学习pipline

【知识点补充】

 仿射变换:Affine Transformation是一种二维坐标到二维坐标之间的线性变换,保持二维图形的“平直性”(译注:straightness,即变换后直线还是直线不会打弯,圆弧还是圆弧)和“平行性”(译注:parallelness,其实是指保二维图形间的相对位置关系不变,平行线还是平行线,相交直线的交角不变。简单来说就是允许图片任意倾斜,并且允许图形在两个方向上任意伸缩的变换。

仿射变换可以保持原来的线共点、点共线的关系不变,保持原来相互平行的线仍然平行,保持原来的中点仍然是中点,保持原来在一直线上几段线段之间的比例关系不变。但是,仿射变换不能保持原来的线段长度不变,也不能保持原来的夹角角度不变

mpii.py

np.zero(数组维度、类型)python数组是几维的√查看:类型、尺寸、形状、维度

数组切片冒号与逗号☆:从左到右索引默认 0 开始,从右到左索引默认 -1 开始。

一维数组~冒号:通过冒号分隔切片参数 start:stop:step 来进行切片操作

一维数组~逗号arrange和reshape/

arange()用于生成一维数组:numpy.arange(start, stop, step, dtype = None)

reshape()将一维数组转换为多维数组;reshape常用三种方法四个参数

np.reshape(n,m)重新生成n*m维的数组、.reshape(2,3,3)二维数组,2个3x3;

print('默认一维为数组:', np.arange(5))
默认一维数组: [0 1 2 3 4]

print('自定义起点一维数组:',np.arange(1, 5))
自定义起点一维数组: [1 2 3 4]

print('自定义起点步长一维数组:',np.arange(2, 10, 2))
自定义起点步长一维数组: [2 4 6 8]

print('二维数组:', np.arange(8).reshape((2, 4)))
二维数组:
[[0 1 2 3]
 [4 5 6 7]]

print('三维数组:', np.arange(60).reshape((3, 4, 5)))
三维数组: 
[[[ 0  1  2  3  4]
  [ 5  6  7  8  9]
  [10 11 12 13 14]
  [15 16 17 18 19]]

 [[20 21 22 23 24]
  [25 26 27 28 29]
  [30 31 32 33 34]
  [35 36 37 38 39]]

 [[40 41 42 43 44]
  [45 46 47 48 49]
  [50 51 52 53 54]
  [55 56 57 58 59]]]
???
print('指定范围三维数组:',np.random.randint(1, 8, size=(3, 4, 5)))
指定范围三维数组: 
[[[2 3 2 1 5]
  [6 5 5 6 7]
  [4 4 6 5 3]
  [2 2 3 5 6]]

 [[2 1 2 4 4]
  [1 4 2 1 4]
  [4 4 3 4 2]
  [4 1 4 4 1]]

 [[6 2 2 7 6]
  [2 6 1 5 5]
  [2 6 7 2 1]
  [3 3 1 4 2]]]
[[[3 3 5 6]
  [2 1 6 6]
  [1 1 3 5]]

 [[7 6 5 3]
  [5 6 5 4]
  [6 5 7 1]]]

二维数组~逗号

np.reanspose:对于一维来说没有变化,对二维来说就是转置,对三维涉及轴变化

numpy.where()函数

 点乘、标量乘、矩阵乘:使用哪种方法都有其具体应用场景,根据需要计算的数组是标量还是向量来决定使用哪种方法。另外,根据numpy中源码的注释,官方更推荐下面的方式:
当进行向量的内积运算时,可以通过np.dot()
当进行矩阵的乘法运算时,可以通过np.matmul()或者@
当进行标量的乘法运算时,可以通过np.multiply()或者*
 

range函数:range(start,stop.step)参数说明:

  • start: 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0, 5);
  • stop: 计数到 stop 结束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5
  • step:步长,默认为1。例如:range(0, 5) 等价于 range(0, 5, 1)

assert断言:用于判断一个表达式,在表达式条件为 false 的时候触发异常。eg

 因为一个注释导致意外缩进和return在函数外部:\是在编写程序中句子太长,人为换行后加上\但print出来是一整行。python各种符号含义

编程中NotImplementedError的使用方法:raise可以实现报出错误的功能,而报错的条件可以由程序员自己去定制。在面向对象编程中,可以先预留一个方法接口不实现,在其子类中实现。如果要求其子类一定要实现,不实现的时候会导致问题,那么采用raise的方式就很好。而此时产生的问题分类是NotImplementedError。

关于pixel_std调整为200更换不同的数据集需要修改pixel_mean和pixel_std吗

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值