当前位置: 首页 > article >正文

DeepPose

目录

摘要

Abstract

DeepPose

算法框架

损失函数

创新点

局限性

训练过程

代码

总结


摘要

DeepPose是首个将CNN应用于姿态估计任务的模型。该模型在传统姿态估计方法的基础上,通过端到端的方式直接从图像中回归出人体关键点的二维坐标,避免了复杂的特征工程。DeepPose将姿态估计问题建模为一个回归问题,利用CNN提取图像特征,并通过全连接层直接预测关键点坐标。模型还引入了级联回归策略,通过多阶段优化逐步细化关键点位置,显著提高了预测精度。DeepPose在LSP和FLIC数据集上取得了当时最优的性能,为后续基于深度学习的人体姿态估计方法奠定了基础。尽管其在处理遮挡和复杂背景时存在一定局限性,但其端到端回归的思想和级联回归的策略对后续研究产生了深远影响,推动了人体姿态估计领域的发展。

Abstract

DeepPose is the first model to apply CNNs to the task of pose estimation. Building on traditional pose estimation methods, the model directly regresses the 2D coordinates of human keypoints from images in an end-to-end manner, avoiding complex feature engineering. DeepPose formulates pose estimation as a regression problem, leveraging CNNs to extract image features and using fully connected layers to directly predict keypoint coordinates. The model also introduces a cascaded regression strategy, refining keypoint locations through multi-stage optimization, which significantly improves prediction accuracy. DeepPose achieved state-of-the-art performance on the LSP and FLIC datasets at the time, laying the foundation for subsequent deep learning-based human pose estimation methods. Although it has certain limitations in handling occlusions and complex backgrounds, its end-to-end regression approach and cascaded regression strategy have had a profound impact on follow-up research, driving advancements in the field of human pose estimation.

DeepPose

论文地址:[1312.4659] DeepPose: Human Pose Estimation via Deep Neural Networks

DeepPose是由Google在2014年提出的一种基于深度学习的人体姿态估计算法,是首个将CNN应用于姿态估计任务的工作。该算法通过端到端的方式直接从图像中回归出人体关键点的二维坐标,避免了传统方法中复杂的特征工程和模型设计。
姿态估计的目标是从输入图像中检测出人体的关键点,如:关节点的位置,并将其表示为二维坐标。DeepPose将这一问题建模为一个回归问题,即通过神经网络直接从图像中回归出关键点的坐标。

算法框架

DeepPose的整体框架基于卷积神经网络,其核心思想是通过CNN提取图像特征,然后通过全连接层直接回归出关键点的坐标。

(1) 输入

输入为RGB图像,通常会被缩放到固定大小,如上图 220 x 220 。图像中通常包含一个人体实例。

(2) 特征提取(Backbone)

DeepPose使用AlexNet作为特征提取器:

首先,通过卷积层提取图像的局部特征;再经过池化层降低特征图的空间维度;最后,通过激活函数引入非线性。通过多层卷积和池化操作,模型逐渐提取出高层次的语义特征。

(3) 全局特征表示

经过卷积和池化后,特征图被展平为固定长度一维向量,作为全局特征表示。

(4) 关键点回归

在全局特征的基础上,DeepPose使用全连接层直接回归出关键点的坐标。假设需要预测的关键点数量为K,则全连接层的输出维度为2K,即每个关键点对应一个二维坐标\left ( x_{i},y_{i} \right )

使用L2损失函数最小化预测坐标与真实坐标之间的误差。

(5) 输出

模型的输出是一个长度为2K的向量,表示K个关键点的坐标。例如,对于人体姿态估计,K可以是14,如:头、肩、肘、腕等关键点。

参数传递过程:

NameFilter Size(WHC)/StrideInput Shape(WHC)Output
Conv11x11x96/4224x224x355x55x96
LRNNone55x55x9655x55x96
MaxP2x2/255x55x9627x27x96
Conv5x5x256/127x27x9627x27x256
LRNNone27x27x25627x27x256
MaxP2x2/227x27x25613x13x256
Conv3x3x384/113x13x25613x13x384
Conv3x3x384/113x13x38413x13x384
Conv3x3x256/113x13x38413x13x256
MaxP2x2/213x13x2566x6x256
Flatten\6x6x2564096x1
\\4096x14096x1
\\4096x14096x1
\\4096x12xk

损失函数

DeepPose使用L2损失函数来衡量预测坐标与真实坐标之间的差异:

L=\frac{1}{2K}\sum_{i=1}^{K}((x_{i}-\hat{x}_{i})^{2}+(y_{i}-\hat{y}_{i})^{2})

(x_{i},y_{i})是第 i 个关键点的真实坐标;

(\hat{x}_{i},\hat{y}_{i})是第 i 个关键点的预测坐标。

创新点

首次将CNN引入姿态估计:DeepPose是第一个将深度卷积神经网络应用于姿态估计任务的工作,开创了基于深度学习的人体姿态估计方法;

端到端回归:直接回归关键点坐标,避免了传统方法中复杂的特征工程和模型设计;

级联回归:通过多阶段回归逐步优化关键点的位置,提高了预测精度。

局限性

对遮挡和复杂背景的鲁棒性较差:由于直接回归坐标,模型在处理遮挡或复杂背景时表现不佳;

计算复杂度较高:全连接层的参数量较大,导致模型的计算复杂度较高;

依赖大规模标注数据:模型的性能高度依赖于大量精确标注的训练数据。

训练过程

数据增强:为了提高模型的鲁棒性,训练时会对输入图像进行数据增强,如:旋转、缩放、翻转等;

端到端训练:模型通过反向传播算法进行端到端训练,优化CNN和全连接层的参数;

多阶段训练:DeepPose还提出了一种级联回归的方法,即通过多个阶段的回归逐步细化关键点的位置。

代码

  • 模型构建

DeepPose的模型结构包括一个CNN特征提取器和一个全连接回归器。以下是PyTorch的实现代码:

import torch
import torch.nn as nn
import torchvision.models as modelsclass DeepPose(nn.Module):def __init__(self, num_keypoints):super(DeepPose, self).__init__()# 使用预训练的AlexNet作为特征提取器self.backbone = models.alexnet(pretrained=True)# 替换最后的分类层为回归层self.backbone.classifier = nn.Sequential(nn.Linear(256 * 6 * 6, 4096),nn.ReLU(inplace=True),nn.Linear(4096, 4096),nn.ReLU(inplace=True),nn.Linear(4096, num_keypoints * 2)  # 输出关键点的坐标 (x, y))def forward(self, x):return self.backbone(x)

Backbone:使用预训练的AlexNet作为特征提取器,移除最后的分类层;

回归层:将AlexNet的全连接层替换为回归层,输出维度为num_keypoints * 2,表示每个关键点的(x, y)坐标;

前向传播:输入图像通过CNN提取特征,最终输出关键点坐标。

  • 数据预处理

DeepPose的输入是图像和对应的关键点坐标标签。需要对数据进行预处理,包括图像缩放、归一化和数据增强。

from torchvision import transforms
from torch.utils.data import Dataset, DataLoader
import cv2
import numpy as npclass PoseDataset(Dataset):def __init__(self, image_paths, keypoints, transform=None):self.image_paths = image_pathsself.keypoints = keypointsself.transform = transformdef __len__(self):return len(self.image_paths)def __getitem__(self, idx):image = cv2.imread(self.image_paths[idx])image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)keypoints = self.keypoints[idx]if self.transform:image = self.transform(image)return image, torch.tensor(keypoints, dtype=torch.float32)# 数据预处理
transform = transforms.Compose([transforms.ToPILImage(),transforms.Resize((224, 224)),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])# 示例数据
image_paths = ["image1.jpg", "image2.jpg"]
keypoints = [[[x1, y1], [x2, y2], ...], [[x1, y1], [x2, y2], ...]]  # 关键点坐标
dataset = PoseDataset(image_paths, keypoints, transform=transform)
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)

PoseDataset:自定义数据集类,加载图像和关键点坐标;

数据增强:使用transforms对图像进行缩放、归一化等操作;

DataLoader:将数据集封装为批量数据,用于训练。

  • 训练过程

训练过程包括定义损失函数、优化器和训练循环。 

# 初始化模型
model = DeepPose(num_keypoints=14)  # 假设预测14个关键点
criterion = nn.MSELoss()  # 使用均方误差损失
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)# 训练循环
num_epochs = 10
for epoch in range(num_epochs):model.train()for images, targets in dataloader:# 前向传播outputs = model(images)loss = criterion(outputs, targets.view(-1, 14 * 2))  # 计算损失# 反向传播optimizer.zero_grad()loss.backward()optimizer.step()print(f"Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}")

损失函数:使用MSE衡量预测坐标与真实坐标的差异;

优化器:使用Adam优化器更新模型参数;

训练循环:逐批次训练模型,输出每个epoch的损失。

  • 推理过程

训练完成后,可以使用模型对新的图像进行关键点预测。

# 加载训练好的模型
model.load_state_dict(torch.load("deep_pose_model.pth"))
model.eval()# 推理
with torch.no_grad():test_image = cv2.imread("test_image.jpg")test_image = transform(test_image).unsqueeze(0)  # 预处理并增加batch维度predicted_keypoints = model(test_image)print("Predicted Keypoints:", predicted_keypoints)

加载模型:加载训练好的模型权重;

推理:对输入图像进行预处理,并通过模型预测关键点坐标。

输入图像:

测试结果:

 

总结

DeepPose是首个将CNN应用于人体姿态估计任务的模型,标志着深度学习在该领域的突破性应用。其核心贡献在于将姿态估计问题建模为端到端的回归任务,通过CNN提取特征并直接预测关键点坐标,避免了传统方法中复杂的特征工程。DeepPose还引入了级联回归策略,通过多阶段优化逐步提升关键点定位精度。在LSP和FLIC等标准数据集上,DeepPose取得了当时最优的性能,为后续研究奠定了基础。尽管在处理遮挡和复杂背景时存在局限性,但其端到端回归思想和级联优化策略对后续工作产生了深远影响,推动了基于深度学习的人体姿态估计方法,如:热图回归、图模型和Transformer等的快速发展。

相关文章:

DeepPose

目录 摘要 Abstract DeepPose 算法框架 损失函数 创新点 局限性 训练过程 代码 总结 摘要 DeepPose是首个将CNN应用于姿态估计任务的模型。该模型在传统姿态估计方法的基础上,通过端到端的方式直接从图像中回归出人体关键点的二维坐标,避免了…...

[HarmonyOS]鸿蒙(添加服务卡片)推荐商品 修改卡片UI(内容)

什么是服务卡片 ? 鸿蒙系统中的服务卡片(Service Card)就是一种轻量级的应用展示形式,它可以让用户在不打开完整应用的情况下,快速访问应用内的特定功能或信息。以下是服务卡片的几个关键点: 轻量级&#…...

DeepSeek R1 本地部署和知识库搭建

一、本地部署 DeepSeek-R1,是幻方量化旗下AI公司深度求索(DeepSeek)研发的推理模型 。DeepSeek-R1采用强化学习进行后训练,旨在提升推理能力,尤其擅长数学、代码和自然语言推理等复杂任务 。 使用DeepSeek R1, 可以大大…...

领域驱动设计叕创新,平安保险申请DDD专利

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 见下图: 这个名字拼得妙:领域驱动设计模式。 是领域驱动设计?还是设计模式?还是领域驱动设计设计模式?和下面这个知乎文章的…...

团体程序设计天梯赛-练习集——L1-041 寻找250

前言 10分的题,主要的想法就一个,按这个想法可以出几个写法 L1-041 寻找250 对方不想和你说话,并向你扔了一串数…… 而你必须从这一串数字中找到“250”这个高大上的感人数字。 输入格式: 输入在一行中给出不知道多少个绝对值…...

动量突破均值回归策略

动量突破均值回归策略:量化交易中的双剑合璧 引言 在量化交易的世界中,动量策略和均值回归策略是两种经典且广泛应用的策略。动量策略基于“强者恒强”的理念,认为过去表现良好的资产在未来一段时间内仍会继续表现良好;而均值回…...

vue3.x 的provide 与 inject详细解读

在 Vue 3.x 中,provide 和 inject 是一对用于实现依赖注入的 API。它们允许父组件向其所有子组件(无论嵌套多深)传递数据或方法,而不需要通过 props 逐层传递。这在开发复杂组件或高阶组件时非常有用。 1. provide 的基本用法 p…...

C#控制台大小Console.SetWindowSize函数失效解决

在使用C#修改控制台大小相关API会失效. 由于VS将控制台由命令提示符变成了终端,因此在设置大小时会出现问题 测试代码: Console.SetWindowSize(100, 50);...

spring boot 对接aws 的S3 服务,实现上传和查询

1.aws S3介绍 AWS S3(Amazon Simple Storage Service)是亚马逊提供的一种对象存储服务,旨在提供可扩展、高可用性和安全的数据存储解决方案。以下是AWS S3的一些主要特点和功能: 1.1. 对象存储 对象存储模型:S3使用…...

25/2/16 <算法笔记> DirectPose

DirectPose 是一种直接从图像中预测物体的 6DoF(位姿:6 Degrees of Freedom)姿态 的方法,包括平移和平面旋转。它在目标检测、机器人视觉、增强现实(AR)和自动驾驶等领域中具有广泛应用。相比于传统的位姿估…...

数据结构-8.Java. 七大排序算法(下篇)

本篇博客给大家带来的是排序的知识点, 由于时间有限, 分两天来写, 下篇主要实现最后一种排序算法: 归并排序。同时把中篇剩下的快排非递归实现补上. 文章专栏: Java-数据结构 若有问题 评论区见 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是…...

缓存穿透、缓存击穿、缓存雪崩的区别与解决方案

1. 缓存穿透(Cache Penetration) 定义:大量请求查询 数据库中不存在的数据,导致请求绕过缓存直接访问数据库,造成数据库压力过大。 场景: 恶意攻击:例如用不存在的用户ID频繁请求。 业务误操作…...

DeepSeek私有化部署+JAVA通过API调用离线大模型问答

在当今快速发展的数字化时代,企业对于高效、灵活的技术解决方案需求日益增长。DeepSeek作为一款领先的智能搜索与分析平台,凭借其强大的数据处理能力和精准的搜索结果,已经成为众多企业提升运营效率的得力助手。为了更好地满足企业对数据安全…...

【go语言规范】Gopherfest 2015 | Go Proverbs with Rob Pike的 总结

根据 Gopherfest 2015 | Go Proverbs with Rob Pike 的演讲,总结内容如下: 虽然已是十年前的产物,但是proverbs的价值依旧存在 以下是整合补充内容后的完整总结,涵盖 Rob Pike 在 Gopherfest 2015 演讲 “Go Proverbs” 中的核心…...

【吾爱出品】针对红警之类老游戏适用WIN10和11的补丁cnc-ddraw7.1汉化版

针对红警之类老游戏适用WIN10和11的补丁cnc-ddraw7.1汉化版 链接:https://pan.xunlei.com/s/VOJ8PZd4avMubnDzHQAeZDxWA1?pwdnjwm# 直接复制到游戏安装目录,保持与游戏主程序同目录下。...

内容中台驱动企业数字化内容管理高效协同架构

内容概要 在数字化转型加速的背景下,企业对内容管理的需求从单一存储向全链路协同演进。内容中台作为核心支撑架构,通过统一的内容资源池与智能化管理工具,重塑了内容生产、存储、分发及迭代的流程。其核心价值在于打破部门壁垒,…...

【第14章:神经符号集成与可解释AI—14.4 神经符号集成与可解释AI的未来发展趋势与挑战】

想象一下,如果AI既能像人类一样直觉感知(比如一眼认出街角的咖啡店),又能像数学家一样逻辑推理(比如计算最优路线避开拥堵),这个世界会变成什么样?这种“双脑协同”正是神经符号集成技术的终极目标。 但现实是,当前99%的AI系统要么只会“死记硬背”数据(如深度学习模…...

[JVM篇]虚拟机性能监控、故障处理工具

虚拟机性能监控、故障处理工具 基础故障处理工具 jps(JVM Peocess Status Tool - 虚拟机进程状况工具) jstat(JVM Statistics Monitoring Too - 虚拟机统计信息监视工具) jinfo( Configuration info for Java - Java配置信息工具) jmap(Memory Map for…...

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_cycle_t 类型

ngx_cycle_t 定义在 src/core/ngx_core.h typedef struct ngx_cycle_s ngx_cycle_t; ngx_cycle_s 定义在 src/core/ngx_cycle.h struct ngx_cycle_s {void ****conf_ctx;ngx_pool_t *pool;ngx_log_t *log;ngx_log_t …...

WHERE子句中的条件

在SQL查询中,WHERE子句用于指定筛选条件,以限制从数据库表中检索出的数据行。WHERE子句通常位于SELECT、UPDATE、DELETE等SQL语句中,紧跟在FROM子句(对于SELECT语句)或其他相关子句之后。 一、WHERE子句的基本语法 sq…...

Effective Objective-C 2.0 读书笔记——内存管理(下)

Effective Objective-C 2.0 读书笔记——内存管理(下) 在 dealloc 方法中只释放引用并解除监听 对象在经历其生命期后 ,最终会为系统所回收 ,这时就要执行dealloc 方法了。 在每个对象的生命期内,此方法仅执行一次&a…...

[Spring Boot] Expense API 实现

[Spring Boot] Expense API 实现 项目地址:expense-api 项目简介 最近跟着视频做的一个 spring boot 的项目,包含了比较简单的记账功能的实现(只限 API 部分),具体实现的功能有: 记账(expen…...

Pell数列【一本通在线评测】

目录 描述 输入描述 输出描述 用例输入 1 用例输出 1 什么是pell数列 一、定义与递推关系 二、数学性质 三、应用领域 四、编程实现要点 五、扩展与相关概念 C代码实现 描述 Pell数列a1​,a2​,a3​,...的定义是这样的,a1​1,a2​2,...,an​2an−1​a…...

linux ollama deepseek等大语言模型的model文件的存储目录

linux ollama deepseek等大语言模型的model文件的存储目录 一、用ollama serve启动的,模型数据存放在: /usr/share/ollama/.ollama/models二、如果在自启动文件中指定了工作目录,则在工作目录下的.ollama/models 1.自启动服务 /etc/system…...

【PyQt】工具栏(QToolBar)与动作按钮(QAction)使用指南

PyQt工具栏(QToolBar)与动作按钮(QAction)使用指南 🛠️ 一、基础用法示例 🌟 class MainWindow(QMainWindow):def __init__(self):super().__init__()# 创建工具栏 🔧self.toolbar self.addToolBar("主工具栏")# 创建动作集合 …...

软路由折腾 | OpenWrt安装后基础配置指南:联网设置与DNS优化

在PVE中安装OpenWrt教程 一、网络基础配置 1. 确认网络接口角色 OpenWrt旁路由通常仅需配置LAN口,无需WAN口。其流量通过主路由转发,因此需确保: 物理连接:OpenWrt的LAN口(如eth0)桥接到主路由的局域网&…...

设置默认构建变体 Build Variant

Android Studio在打开项目时有时会把我设置好的build Variant改为默认的变体,没注意的话可能打完包才发现打错了,浪费时间。因此,有必要通过代码设置一个我想要的默认变体。 代码其实很简单,只要在变体下面加上isDefault true即可…...

【大模型】DeepSeek使用与原理解析:从V3到R1

文章目录 一、引言二、使用与测评1.7大R1使用技巧2.官网实测 发展历程三、Deepseek MoE:专家负载均衡 (2024年1月)四、GRPO:群体相对策略优化(DeepSeek-Math,2024年4月)五、三代注意力&#xff…...

DAY04 Object、Date类、DateFormat类、Calendar类、Math类、System类

学习目标 能够说出Object类的特点是所有类的祖宗类,任意的一个类都直接或者间接的继承了Object类,都可以使用Object类中的方法Animal extends Object:直接继承Cat extends Animal:间接继承 能够重写Object类的toString方法altinsert,选择toString 能够重写Object类的equals方法…...

oracle 19c安装DBRU补丁时报错CheckSystemSpace的处理

oracle 19c的补丁目前已经发布到19.26版本了,数据库补丁安装也是数据库运维中的一个常见工作;近期在一个安装补丁的环境遇到了Prerequisite check "CheckSystemSpace" failed.错误,看起来是磁盘剩余空间不足的告警;按以…...