本文为稀土掘金技术社区首发签约文章,30天内禁止转载,30天后未获授权禁止转载,侵权必究!
🍊作者简介:秃头小苏,致力于用最通俗的语言描述问题
🍊专栏推荐:深度学习网络原理与实战
🍊近期目标:写好专栏的每一篇文章
🍊支持小苏:点赞👍🏼、收藏⭐、留言📩
关键点检测——Deeppose原理详解篇
写在前面
Hello,大家好,我是小苏👦👦👦
在之前我已经写过几篇关键点检测的博客了,分别是HRNet和Openpose的原理详解和代码解析,它们都是基于热力图实现的关键点检测任务,感兴趣的可以点击一下链接进行阅读:
那么今天将要为大家带来的是Deeppose,它是基于回归的方式来实现关键点检测任务的。那么我想你肯定有点好奇,基于热力图和基于回归的方式有什么区别呢?下面来简单描述一下:
- 基于热力图的方法通过生成每个关键点的热力图来检测其位置。每个热力图表示该关键点在图像中的可能位置分布。模型的目标是预测每个关节点的概率分布,最后通过后处理步骤确定关键点的精确位置。关于这个不明白的可以从上文中的基于热力图的HRNet和Openpose中了解详情。🥙🥙🥙
- 基于回归的方法将关键点检测问题视为一个回归任务,即直接从图像中回归人体关节点的坐标。给定输入图像,模型输出每个关键点的 x和 y坐标,表示该关键点在图像中的具体位置。基于回归的方式的一些细节就可以通过本文来理解啦。🥗🥗🥗
关于这两种方式,基于热力图的方式相对来说会难理解一点,其效果往往也会更好一些。但是基于回归的方式更加适合一些资源有限的场景,像一些基于回归的方式如RLE也能取得很不错的效果。
好了,下面就让我们一起走进Deeppose的世界,探索其原理叭~~~🌱🌱🌱
论文地址:DeepPose: Human Pose Estimation via Deep Neural Networks
数据集介绍
在论文中,实际上由用到两个数据集,如下图所示:
FLIC 主要用于上半身姿态估计,尤其是在电影或视频帧中。它包含 5,000 多张图片,标注了 10 个上半身的关键点,如肩膀、肘部、手腕等。数据集来自电影,因此场景自然,动作多样,适合用于上半身关键点检测任务。但由于标注关键点较少,它不适合处理全身姿态估计任务。Leeds Sports Dataset 是用于全身姿态估计 的数据集,这些数据集包含 11000 张训练图像和 1000 张测试图像。这些图像主要来自运动场景。
但是我没有用这两个而是选择了WFLW数据集,因为它下载比较方便也比较简单,并且是之前在HRNet和Openpose中都没有用过的人脸数据集,下载地址如下:
WFLW 包含 10,000 张面部图像,其中 7,500 张用于训练,2,500 张用于测试。每张图像上有 98 个手动标注的面部关键点,这些关键点精确地覆盖了面部的主要区域,如下图所示:
除了面部关键点的标注之外,WFLW 数据集还包括丰富的 属性标注,包括:
- 大姿态(Large Pose):包含极端姿势的图片,如大角度旋转或侧脸。
- 表情(Expression):包含各种不同的面部表情,如笑、皱眉等。
- 光照(Illumination):包含光照变化较大的图片。
- 小脸(Make-up):化了妆的人物面部图片。
- 遮挡(Occlusion):包含面部部分被遮挡的图片。
- 模糊(Blur):包含面部失焦或模糊的图片。
当我们下载好数据集后,大致结构如下:
WFLW
├── WFLW_annotations
│ ├── list_98pt_rect_attr_train_test
| ├── README
│ └── list_98pt_test
└── WFLW_images
├── 0--Parade
├── 1--Handshaking
├── 2--Demonstration
├── ......
└── ......
在list_98pt_rect_attr_train_test
文件夹下会有一个README文件,里面记录了标注的格式,我们可以来查看一下:
主要还是红框中的内容,大致是说每个样本(每行)的标注文件包含以下信息:
- 98 个关键点的坐标:每个关键点有两个坐标(x 和 y),共计 196 个值。
- 检测矩形框的坐标:矩形框的左上角和右下角的坐标(x_min, y_min, x_max, y_max),用 4 个值表示。
- 6 个属性标注:这些属性标注分别为大姿态、表情、光照、化妆、遮挡和模糊,每个属性使用一个值表示,是这个属性就设置为1。关于这六个属性我们在上文中有所介绍。
- 图片名称:该图片的文件名。
我们来打印标注信息的前两行来看看,如下图所示。红框框的部分为6个属性标注,这里都是0,表示都没有这些属性。红框前面四个值是检测到矩形框的坐标,后面是图片名称。最前面196个值为98个关键点的横纵坐标,最终的标注格式可表示成如下:
x0 y0 ... x97 y97 x_min_rect y_min_rect x_max_rect y_max_rect pose expression illumination make-up occlusion blur image_name
知道了这些标注排列格式,在后续代码中我们就能正确的提取出相关信息啦。🍗🍗🍗
Deeppose原理
Deeppose是基于回归方式实现的,相比较基于热力图的方式理解起来非常简单,我们之间来看论文中的图,如下:
首先,对于一张包含一个人物的图片,我们将其送入到卷积神经网络中,最后再通过几个全连接层,最终得到的全连接层个数为待检测关键点数量的两倍,以WFLW数据集为例,一共有98个脸部关键点,那么最后的全连接层输出就为98*2=196个,因为每个关键点需要获取两个值,即横坐标x和纵坐标y。
其实,在Deeppose论文中,训练Deeppose网络是有两个阶段的,第一阶段会粗略地估计所有关键点的初始位置。第二阶段基于第一阶段的估计结果,通过局部修正进一步精细化每个关键点的位置。这让我感觉有点类似与目标检测中的Faster RCNN,也存在粗略估计的RPN网络和微调的Fast RCNN网络。但是呢,这里Deeppose采用两个过程是由于当时的骨干网络效果比较差,目前有比较好的resnet、transformer等等,其实就不需要两个阶段了。
Deeppose的结构说完啦,下面来说说其损失函数。论文中用的损失函数也是非常简单,是一个L2损失,对于每个关键点的预测结果,损失函数计算预测的关键点位置与真实关键点位置之间的距离。假设对于一个输入图像,网络预测出每个关节的二维坐标 ,而真实的关节坐标为,那么损失函数就是所有关键点预测误差的平方和,如下:
其中,N 是总的关键点数,是网络预测的第 个关节的坐标, 是真实的第 个关节的坐标。这里论文中也说了个小细节,就是GT坐标是经过归一化的,因为GT姿态矢量是在绝对图像坐标中定义的,并且姿态在大小上随图像而变化。关于GT是如何归一化的方法有很多,论文中大致的方法是将每个关节坐标先减去框的中心位置,然后分别除以框的宽度和高度。具体的细节大家可以去看看论文中的第三章,这里不过多叙述。
上文介绍了数据集、网络结构和损失函数,其实一个Deeppose的训练过程就可以实现啦,那么这节来谈谈Deeppose使用的评估指标。🍚🍚🍚在HRNet原理详解篇中我们也谈过一个评估指标,叫做OKS,它理解起来还是有点难的,感兴趣的可以去看看。那么本节的评价指标非常好理解,名为NME(归一化平均误差),其公式如下:
其中,N 为关键点个数, 为第 i 个关健点网络预测的坐标 , 为第 i 个关键点真实坐标, d 为归一化因子,代码中这里的d 设置为两眼外眼角间距,也即WFLW数据集索引60和索引72之间的距离,这里除以d使其不受图像大小的影响,保证误差评估的公平性和一致性。你可能也发现了,这里的评估指标和训练损失基本上是差不多的,很多时候训练和评估的函数是可以设置成一样的,但是它们的目的不同,训练时我们用损失函数来优化模型**,**评估时我们用指标来量化模型的效果。
最后,我们可以来看看Deeppose的效果,由于这个网络时间较久,定量的效果肯定没有HRNet这些好,所以我们这里就来看看一些定性的可视化图片叭,如下图所示:
小结
Deeppose原理详解篇就为大家介绍到这里啦,基于回归式的关键点检测还是非常好理解的,如果你还有什么不明白的地方,欢迎评论区留言,我们一起探讨~~~🌲🌲🌲
参考链接
如若文章对你有所帮助,那就🛴🛴🛴