openpifpaf 的decode过程:
网络的输出:
-
pif, 原始的输出共有4个, 分别为:
- joint_intensity_fields, shape 为 [17, output_h, output_w]. 其实就是输出的每个位置上的confidence map, 17表示channel数, 在pose检测里面表示总共有多少个关键点需要检测.
- joint_offset_fields, shape 为[17, 2, output_h, output_w]. 为对应位置上的离其最近的关节点位置的偏移量. 这个是学习得到的, 2表示是两个方向(x, y)的偏移量. 所以关节点的真正位置需要把该位置的(x, y)和其两个方向的(x_offset, y_offset)相加起来得到.
- joint_b, shape为[17, output_h, output_w]. 论文里提到的
spread b
,是自适应并且经过网络学习得到的, 用来参与loss计算, 在decode的时候并没有用到. - joint_scale_fields. shape为[17, output_h, output_w]. 自适应的scale值, 用来表明该关键点的scale大小.不确定是否有用在loss计算里. decode的时候则是作为类似gaussian的sigma值参与decode过程.
-
paf, 原始的输出共有5个, 按照顺序为: (首先说明下, 论文提出的paf和之前OpenPose及PersonLab提出的连接方式都不一样. 该论文提出的paf连接为, 每个位置预测出哪两个点需要连接在一起, 因此不是单纯的两个关节点之间的直接连接, 而是经过了另外一个位置进行第三方连接)
-
joint_intensity_fields, shape为[19, output_h, output_w]. 19表明共有多少个连接需要学习, 对应的是每个输出位置上的paf的confidence值
-
joint1_fields, shape为[19, 2, output_h, output_w]. 这个位置表明的两个可以连接在一起的点中的第一个点的信息, 其实就是偏移值, (x_offset, y_offset).
-
joint2_fields, shape为[19, 2, output_h, output_w]. 同上, 表示的是一条线段上的第二个点的偏移值.
-
joint1_fields_logb, shape为[19, output_h, output_w]. 论文里提到的
spread b
,是joint1的, 用来参与loss计算和decode. 根据decode的过程来看, 网络输出的这个值是经过log计算后的, 所以叫做logb
,在decode的时候需要先exp还原. -
joint2_fields_logb, shape为[19, output_h, output_w]. 同上, 只不过变成是第二个点的b了.
-
decode过程:
-
normalize_pif. 就是把网络的pif 4个输出整合在一起, 首先是对
joint_intensity_fields
和joint_scale_fields
进行扩维, 把shape从[17, output_h, output_w]变