DeepPose

news2025/4/20 6:59:49

目录

摘要

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 models

class 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 np

class PoseDataset(Dataset):
    def __init__(self, image_paths, keypoints, transform=None):
        self.image_paths = image_paths
        self.keypoints = keypoints
        self.transform = transform
    
    def __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等的快速发展。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2299698.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

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

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

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

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

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

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

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

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

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-数据结构 若有问题 评论区见 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是…

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

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

【吾爱出品】针对红警之类老游戏适用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系统要么只会“死记硬背”数据(如深度学习模…

[Spring Boot] Expense API 实现

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

设置默认构建变体 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方法…

图像生成GAN和风格迁移

文章目录 摘要abstract1.生成对抗网络 GAN1.1 算法步骤 2.风格迁移2.1 损失函数2.2 论文阅读2.2.1 简介2.2.2 方法2.2.3 实验2.2.4 结论 3.总结 摘要 本周学习了生成对抗网络(GAN)与风格迁移技术在图像生成中的应用。首先介绍了GAN模型中生成器与判别器…

golangAPI调用deepseek

目录 1.deepseek官方API调用文档1.访问格式2.curl组装 2.go代码1. config 配置2.模型相关3.错误处理4.deepseekAPI接口实现5. 调用使用 3.响应实例 1.deepseek官方API调用文档 1.访问格式 现在我们来解析这个curl 2.curl组装 // 这是请求头要加的参数-H "Content-Type:…

【第15章:量子深度学习与未来趋势—15.3 量子深度学习在图像处理、自然语言处理等领域的应用潜力分析】

一、开篇:为什么我们需要关注这场"量子+AI"的世纪联姻? 各位技术爱好者们,今天我们要聊的这个话题,可能是未来十年最值得押注的技术革命——量子深度学习。这不是简单的"1+1=2"的物理叠加,而是一场可能彻底改写AI发展轨迹的范式转移。 想象这样一个…

JAVA安全—Shiro反序列化DNS利用链CC利用链AES动态调试

前言 讲了FastJson反序列化的原理和利用链,今天讲一下Shiro的反序列化利用,这个也是目前比较热门的。 原生态反序列化 我们先来复习一下原生态的反序列化,之前也是讲过的,打开我们写过的serialization_demo。代码也很简单&…