前言

上一期 DEKR 解构式人体关键点回归(一):算法思想与原理 解析了DEKR的算法与工作原理,这期本文将聚焦于标签分配。当然,首先得了解标签是什么,明确模型的学习目标,然后再进一步看看如何制作与分配标签。

https://leetcode-cn.com/problems/distinct-subsequences/

目录

I. 定义标签

II. 标签分配

定义标签

通过上一期,我们了解到DEKR会针对每类关键点解构式地回归出它们的位置,因此容易想到标签必须含有关键点的位置。于是,这就是回归任务对应的标签。但是回归位置并非是直接预测关键点的坐标,而是基于偏移(offset)的形式。

除此之外,既然我们利用网络提取了关键点特征,那么这些特征就应该利用起来对关键点进行识别。因此,还需要设置一个分类标签,而对关键点进行识别通常基于热度图(heatmap)的形式。

综上,训练的标签包含两种:

一种对应于分类任务,是heatmap的形式,在其中只有关键点所在位置才有非0值,这种是最直观的hard形式,而在实际操作中通常会采用soft形式:以关键点位置为中心,中心值为1向四周逐渐衰减,最经典的莫过于高斯核;

而另一种则对应于回归任务,是offset的形式,即:每个特征点位置都计算当前位置与各关键点的距离(坐标差值)。但是,直接这样做是会出问题的,因为一幅图像中往往有多个人,那么如果一个特征点去回归所有人的关键点位置那明显模型会不好学习,而且计算量也大。因此,一种更合理的方式应当是:特征点选择距离其最近的人的关键点进行回归。然而,DEKR实际是如何实现的呢?CW在下一节为大家揭晓。

标签分配

Heatmap

其实在上一节已经大致揭晓答案了,就是采用高斯核的方式:在每个关键点位置 ,以其为中心向四周扩散,只有处于核半径范围内的位置 (x,y) 才属于正样本,对应的标签值根据高斯函数计算:

至于负样本嘛,它们的标签值当然就是0啦,你是不是这样想?这里还真不是,DEKR“宽宏大量”——给了它们值为0.1的权重。

那么问题来了,如果一个正样本 (x,y) 处于多个关键点的高斯核半径范围内,那么它应该负责预测哪个关键点?标签值该如何设置?

最直接拍脑袋的做法——选择最近的那个关键点去预测。那么,对应的标签值就是最大的那个。因为由高斯函数的公式可知,距离中心越近函数值越大。

另外,还有个重点需要说明下,就是DEKR不仅为各类关键点(COCO是17类)制作了heatmap,而且还为一种被称为中心点的虚拟关键点(后简称虚拟中心点)制作了heatmap。这种虚拟中心点与人一一对应,其坐标值就是每个人所有关键点的坐标均值。

这个虚拟中心点很关键,因为接下来的offset标签主要是基于它进行分配的。

这样,heatmap的shape最终将是 (b,num\_joints+1,h,w) ,其中 num\_joints 指的是有几种关键点(COCO的话就是17种),+1就是加上了虚拟中心点, h,w 即输出特征图的高和宽。

Offset

其实这部分的思想和以上Heatmap那里的差不多,只不过不是基于高斯核的方式,而是直接设定一个距离 r ,以虚拟中心点为中心, 横、纵坐标与虚拟中心点的距离都不超过 r 的位置 (x,y) 则为正样本,其标签值由该位置坐标与各个关键点 (COCO的话就是17个)的坐标作差计算得出:

这时,问题又来了(CW是问题少年/女吗..):如果一个正样本 (x,y) 处于多个虚拟中心点(也就是对应多个人)的有效范围内,那么它该回归哪个人的关键点位置呢?

DEKR的做法是:选择面积最小的人去回归。至于每个人的面积,则是根据其中关键点之间的最远距离来计算。

可能有靓仔靓女们会问:为何这里不能像上述Heatmap部分那样选择最近的关键点进行回归呢?如果那样的话,一个正样本就可能回归多个人的关键点位置,而正样本是要被模型看作(学习)虚拟中心点的位置,其与人是一一对应的,也是就说,在宏观意义上,它被视作一个人。

因此,DEKR的做法,就能保证正样本回归的关键点都是属于同一个人的。

另外,由于在图像中,远近高低各人的尺度不一,因此直接回归绝对坐标的差值是不理智的,易造成模型倾向于大(尺度)人物(大尺度容易有大差值,大差值产生大loss,大大大..)。

于是,上述提到的人物面积就该“出场”(寂寞了吧)了!面积大小即尺度大小,于是可以使用面积对坐标差值进行归一化,这样就消除了尺度带来的影响。当然,由于面积是距离的二次方,因此还需要先对它开个根号。


Preview

下一期,CW将携手损失函数与大家见面。

DEKR 解构式人体关键点回归(二):标签分配(Label Assignment)相关推荐

  1. DEKR 解构式人体关键点回归(三):损失函数

    前言 损失函数是一项工作里很重要的部分,它意在每个训练阶段告诉模型有多"犯傻".离"正确答案"还有多远,然后基于损失反向传播回去使得各模型参数获得相应的梯度,于 ...

  2. DEKR 解构式关键点回归(一):算法思想与原理

    前言 CW前阵子玩了下人体姿态估计,用上了微软新鲜出炉的算法--DEKR: Bottom-Up Human Pose Estimation Via Disentangled Keypoint Regr ...

  3. CVPR 2021 | 微软提出“解构式关键点回归“, 刷新COCO自底向上多人姿态检测记录!

    随着深度学习的发展,运用计算机视觉中的人体姿态估计技术已经能够高精度地从人体的图片中检测出人体关键点,并恢复人体位姿.在应用端,此技术也已经在人机交互.影视制作.运动分析.游戏娱乐等各领域大放异彩. ...

  4. CVPR 2021 | 微软提出解构式关键点回归, 刷新COCO自底向上多人姿态检测记录!...

    本文转载自微软研究院AI头条. 编者按:在拥挤的人群的场景下,由于人群过于密集,重合程度太高,所以每个人的位置难以用人体检测框表示,而传统的一些自下而上的人体姿态估计算法也很难检测到人物的关键点.因此 ...

  5. 展开运算符解构赋值_解构式展开式搜索栏

    展开运算符解构赋值 View demo 查看演示Download Source 下载源 Maybe you have noticed the little adjustments that we di ...

  6. Kotlin 解构声明

    一.什么是解构声明 在 Koltin 中可以把一个对象赋值给多个变量,这种操作叫做解构声明(Destructuring declaration),先看个例子: data class Book(var ...

  7. 如何充分利用JavaScript(ES6)中的解构功能

    by Joanna Gaudyn 乔安娜·高登(Joanna Gaudyn) Destructuring was a new addition to ES6. It took inspiration ...

  8. es6中数组的解构_ES6中的数组解构简介

    es6中数组的解构 by Kevwe Ochuko 通过Kevwe Ochuko Destructuring in JavaScript is a simplified method of extra ...

  9. 不容错过的ES6知识点(一):变量、函数、扩展操作符、解构赋值

    首先给大家介绍一个网站: freeCodeCamp. ES6 变量 var可以重复声明同一个变量 Object.freeze:禁止对对象进行增删改操作 函数 使用箭头函数编写简洁的匿名函数 设置函数的 ...

最新文章

  1. 题目1251:序列分割(DFS+剪枝)
  2. Spring Boot 2.0(七):Spring Boot 如何解决项目启动时初始化资源
  3. Chrome浏览器插件Json浏览与编辑神器
  4. android 发送重启广播,Android实现关机重启的方法分享
  5. node工程默认url_node.js处理url常用方法
  6. python科学计算笔记(十一)pandas中date_range生成指定日期
  7. 利用Flutter写一个跨平台的果核APP(3)——网络请求
  8. disruptor模拟高速处理大规模订单类业务场景
  9. c语言双链表从右向左遍历,有没有大佬在的,我这双向链表怎么没办法遍历
  10. 腾讯 WeGame 被迫下架《怪物猎人:世界》究竟该怪谁?| 畅言
  11. html日历框架,日历.html
  12. 终端服务器配置未启用rdp安全层,终端服务配置RDP-Tcp连接属性.PPT
  13. 车险赔付率分析报告_汽车保险理赔案例分析报告.ppt
  14. 微信小程序 | 实现活动报名登记
  15. 树莓派使用指令集驱动TSC打印机
  16. revit2016对应lumion版本_revit如何导入lumion?revit文件转化成lumion文件有诀窍!
  17. SAP 特殊字符的处理CL_ABAP_CHAR_UTILITIES(去除多余的换行符、换页符、Tab符)
  18. 笔记本计算机的清洁保养知识,笔记本电脑怎么维护 笔记本电脑维护保养技巧【详解】...
  19. SDN之旅—mininet(在Windows系统上)安装
  20. Java实现信用卡校验

热门文章

  1. matlab inline feval,matlab中关于函数句柄、feval函数以及inline函数的解析
  2. docker启动mysql容器后又退出_docker容器刚运行就自动退出了
  3. ansible免密登录和账号登录方式
  4. CAPS BHCA
  5. [Swift]扩展String类:实现find()查找子字符串在父字符串中的位置
  6. JavaScript 循环
  7. 蓝桥杯 基础练习 高精度加法
  8. SRM 587 Div II L3:ThreeColorabilityEasyy
  9. SQL中触发器实例讲解(转)
  10. ICCV2021|面向城市场景理解的大规模3D点云挑战赛