所有参考网址
数据集及处理
-
https://blog.csdn.net/weixin_42216109/article/details/115269420 -
https://blog.csdn.net/weixin_30387339/article/details/94832887?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_title~default-0.control&spm=1001.2101.3001.4242
模型
- https://blog.csdn.net/qq_38308388/article/details/112554972
- https://blog.csdn.net/shenxiaolu1984/article/details/51428392/?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_title~default-0.control&spm=1001.2101.3001.4242
- https://blog.csdn.net/baolinq/article/details/84575381?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162678690316780261943465%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=162678690316780261943465&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29-9-84575381.first_rank_v2_pc_rank_v29&utm_term=hourglass&spm=1018.2226.3001.4187
- https://blog.csdn.net/weixin_52668444/article/details/116578345?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162678612816780262518435%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=162678612816780262518435&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29-25-116578345.first_rank_v2_pc_rank_v29&utm_term=hourglass&spm=1018.2226.3001.4187
- https://blog.csdn.net/shenxiaolu1984/article/details/51428392
可视化
- https://zhuanlan.zhihu.com/p/225494133
GitHub参考代码
- https://github.com/carloscz25/PytorchPoseEstimationLeedsSports
- https://github.com/bearpaw/pytorch-pose
- https://github.com/princeton-vl/pytorch_stacked_hourglass
- https://github.com/Spandana-K-R/DeepPose
一、LSP数据集
LSP数据集包括如下图文件,其中images文件夹包括2000张照片,visualized文件夹则是关节点可视化后的照片,joints文件储存着关节点的坐标信息
1.1数据集处理
1.1.1关节点标签处理
self.annotationmat = scipy.io.loadmat(labelsfilepath)
# print(self.annotationmat) #加载.mat文件的数据
joints = self.annotationmat['joints']
# print(joints) # 只加载'joints'键的数据
[[[ 29.74645941 28.12031897 40.51695761 ... 120.12745241 51.59369452
44.42209685]
[ 30.5501068 49.17944312 27.96569031 ... 136.33061847 33.44243044
42.59402151]
[ 28.94281202 62.60463477 50.08729892 ... 105.46744503 34.11469948
42.59402151]
...
? 第1列第1个数29.74645941是第一张图片的第1个关节点的x轴的值,同理第2列第1个数30.5501068是第1张图片的第2个关节点的x轴的值
将关节点标签处理为如下使(x,y)代表图片的一个关节点坐标(这里去掉了二进制值)
第二张图片的关节点坐标(注意对比原图区分左右,同时这些坐标是根据原始图像建立坐标轴来标记的)
tensor([[ 28.1203, 166.6551],
[ 49.1794, 136.6458],
[ 62.6046, 95.8438],
[ 80.2417, 96.1070],
[ 91.5609, 130.8546],
[ 78.3990, 142.7003],
[ 61.2884, 78.9965],
[ 49.9692, 73.7317],
[ 63.9208, 50.5667],
[ 98.6684, 53.4623],
[111.3039, 69.7831],
[109.4612, 96.3703],
[ 81.0314, 52.6726],
[ 83.4005, 30.8238]])
14个关节点按序号分别为:(上面的坐标也对应下面的顺序)
Right ankle 右脚踝
Right knee 右膝盖
Right hip 右臀部
Left hip 左臀部
Left knee 左膝盖
Left ankle 左脚踝
Right wrist 右手腕
Right elbow 右肘
Right shoulder 右肩
Left shoulder 左肩
Left elbow 左肘
Left wrist 左手腕
Neck 颈部
Head top 头顶
可以分成三部分
即用序号标明为如下图:
def standardize_label(label, orim): #保证了原图像的坐标的准确
label_std = []
for idx, _ in enumerate(label):
labelX = label[idx][0] / orim.size[0] #x的值除于原始图像的宽
labelY = label[idx][1] / orim.size[1] #y的值除于原始图像的高
label_std.append([labelX, labelY])
label_std = np.array(label_std)
# print(label_std)
return label_std
? 处理为(x,y)后再让x除以原图像的宽,y除以原图像的高,这样可以防止缩放原图像造成的关节点坐标丢失。 (!!!注意:这个方法是参考https://github.com/carloscz25/PytorchPoseEstimationLeedsSports中的处理方法处理的,这样做也是为了方便后面可以在原始图像上对关节点坐标可视化,所以其严谨性有待考证)
1.1.2图像处理
-
原图像的处理则采用常规处理 image_size = 196
transforms = Compose([
Resize((image_size,image_size)),
ToTensor(),
Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))
])
二、模型
2.1沙漏模型
沙漏模型在上面的参考网址中有很多讲得很详细,下面只是一些个人总结
-
首先完整沙漏模型如像下图: 可以看到,联级沙漏模型就是由多个沙漏状的hourglass模型首尾连接而成 -
单个沙漏(hourglass)模型 ? 如上图就是单个沙漏模型,红色部分就是沙漏对称的两个部分,这两个部分无论是batch_size,还是图像尺寸都是对称的,蓝色部分则是残差模型的一部分,与红色部分共同组成了残差模型 ? 所以可以看到送进单个沙漏模型的图像经历了下采样和上采样,形状像沙漏,其中还做了残差模型 -
联级沙漏模型 ? 原论文中说到相互关键点之间是有关系的,知道了一个关节点的坐标可以更好地预测其他关节点的位置,每一个hourglass模型中都做了一个热力图预测,并且输入到下一个hourglass模型,这样上一个 hourglass模型学习到的信息可以辅助下一个 hourglass模型的预测
三、检验与可视化
-
首先上面1.1已经采取了坐标标准化,就是为了防止对原始图片放缩后关节点坐标丢失(LSP数据集每张图片大小不一样),若缩放图像并输进网络中,预测出的关节点坐标是根据缩放后的图像建立坐标轴得到的数据,所以标准化(x除以宽,y除以高)后可以保存准确信息,无论原始图像缩放到什么尺寸都不会丢失 -
而关于检验,个人用了距离公式来进行检验,比如在以原始关节点为圆心画任意半径的圆(半径自定义),若预测的关节点坐标落在圆内则正确 -
另外坐标标准化还可以方便检验时直接在原图像上建立坐标轴,只需将预测得到的标准化关节点坐标分别乘以对应的宽和高即可 由于计算资源限制,下图是使用迁移学习方法,用CPU跑了1个epoch的预测效果 至于点与点的划线可以根据上面1.1的关节点的按序号进行划线
四、代码
- 完整代码已经上传到GitHub个人仓库https://github.com/Hopelht/PoseEstimation
最后,个人觉得沙漏模型比较复杂,无论是模型本身还是代码,我都看得云里雾里,我这个菜鸡目前能搞懂的层次只是浅层。
|