目录

  • 前言
    • AlphaPose介绍
    • 这里强调一下
    • 轻量化什么
  • yolo目标检测的轻量化
  • 单人姿态估计网络的轻量化
    • 训练轻量化的单人姿态估计模型
      • 下载数据集
      • 创建FastPoseMobile
      • 创建训练文件
      • 开始训练
      • 训练结果
  • 训练项目和数据集

前言

AlphaPose介绍

AlphaPose是一个精确的多人姿态估计器,是第一个在COCO数据集上实现70+ mAP (75 mAP),在MPII数据集上实现80+ mAP (82.1 mAP)的开源系统。为了匹配跨帧对应于同一个人的姿势,我们还提供了一个名为“姿势流”的高效在线姿势跟踪器。它是首个在PoseTrack Challenge数据集上同时实现60+ mAP (66.5 mAP)和50+ MOTA (58.3 MOTA)的开源在线姿势跟踪器。

项目地址

这里强调一下

大部分Alphapose的文章都会介绍Alphapose和RMPE等论文有关。但事实上发展到今天,Alphapose其实更接近一个纯粹的基于自上而下的多人姿态估计项目,里面的模型也是集众家之所长,像RMPE论文里提到的SSTN在新版的项目里甚至都被去除了。

轻量化什么

目前的Alphapose实际上是yolov3-spp行人检测+姿态关键点检测+行人重识别算法的组合,对应多目标检测单人姿态估计行人重识别三个任务,本文主要介绍的是在Alphapose原项目中轻量化单人姿态估计模型的方法。

yolo目标检测的轻量化

Alphapose里使用的yolov3实际上是yolov4项目下的一个版本,加入了空间金字塔池化(Spatial Pyramid Pooling, SPP),目标检测效果会比原版的yolov3好一点。

这里有大佬使用Yolov4优化了一下目标检测部分:https://github.com/WildflowerSchools/pytorch-YOLOv4

csdn里的另一个大佬完成了使用任意yolo替换Alphapose的目标检测网络的项目:https://blog.csdn.net/qq_35975447/article/details/114940943

本人的做法是将所有模型转换成torchscript模型,然后自己重写中间的衔接(主要是中间的图像处理和多线程流水线),有兴趣的可以关注一下我的项目,里面能找到相应的处理:https://github.com/hongyaohongyao/smart_classroom_demo

  • 我在项目里用的是yolov5s模型,姑且算是使用了比较轻量的目标检测模型吧。

单人姿态估计网络的轻量化

Alphapose的自上而下的多人姿态估计的步骤

  1. 先做多人目标检测
  2. 将检测到的目标裁剪下来,通过仿射变换转换成大小为固定大小的图像
  3. 使用单人姿态估计网络预测所有图像中的关键点,关键点回归用的是热图法
  4. 将检测到的关键点通过仿射变换的逆变换还原成原图像中的坐标。

Alphapose的单人姿态估计网络主要有三种输出格式:coco 17关键点,Halpe 26关键点和Halpe 136关键点。

coco17关键点比较常见,其实可以用其他单人姿态估计模型替代,比如这个南京大学做的SimpleBaseline的轻量化:https://github.com/zhang943/lpn-pytorch

Halpe是Alphapose自己的数据集,需要自己重新训练模型。

训练轻量化的单人姿态估计模型

下载数据集

到Alphapose的这个子项目Fang-Haoshu/Halpe-FullBody下载数据集

在data文件夹下按照下面的目录结构进行组织,这里我应该改过一些文件名称,需要和下面创建的训练文件进行对应

  • 其实完整的模型应该要在:300wLP(脸部)、Halpe数据集(全身)和frei(手部)三个数据集训练,否则至训练Halpe数据集的化手部和脸部的效果会比较差,不过因为设备和时间的问题,我只训练了Halpe数据集的136个关键点,虽然map有下降,不过实际效果也基本能满足项目需求。

创建FastPoseMobile

alphapose/models目录下创建自己的轻量化模型。我命名叫FastPoseMobile

这里使用torchvision的mobilenetv3轻量化了fastpose的骨干网络

  • 这里提一嘴,貌似Alphapose里的Alphapose和fastpose的论文没啥关系,可能就是个模型结构吧。
  • 创建好的模型需要添加`@SPPE.registe在这里插入图片描述

r_module`注解

  • alphapose/models/__init__.py文件的__all__字典里添加FastPoseMobile
  • mobilenet_v3是我从torchvision里面改的,内容比较多,这里就不放出来了
# -----------------------------------------------------
# Copyright (c) Shanghai Jiao Tong University. All rights reserved.
# Written by Jiefeng Li (jeff.lee.sjtu@gmail.com)
# -----------------------------------------------------import torch.nn as nnfrom .builder import SPPE
from .layers.DUC import DUC
from .layers.mobilenet_v3 import mobilenet_v3@SPPE.register_module
class FastPoseMobile(nn.Module):def __init__(self, norm_layer=nn.BatchNorm2d, **cfg):super(FastPoseMobile, self).__init__()self._preset_cfg = cfg['PRESET']if 'CONV_DIM' in cfg.keys():self.conv_dim = cfg['CONV_DIM']else:self.conv_dim = 128assert cfg['MODEL_SIZE'] in ['large', 'small']self.preact = mobilenet_v3(cfg['MODEL_SIZE'])output_num = 960 // 4 if cfg['MODEL_SIZE'] == 'large' else 576 // 4self.suffle1 = nn.PixelShuffle(2)self.duc1 = DUC(output_num, 1024, upscale_factor=2, norm_layer=norm_layer)if self.conv_dim == 256:self.duc2 = DUC(256, 1024, upscale_factor=2, norm_layer=norm_layer)else:self.duc2 = DUC(256, self.conv_dim * 4, upscale_factor=2, norm_layer=norm_layer)self.conv_out = nn.Conv2d(self.conv_dim, self._preset_cfg['NUM_JOINTS'], kernel_size=3, stride=1, padding=1)def forward(self, x):out = self.preact(x)out = self.suffle1(out)out = self.duc1(out)out = self.duc2(out)out = self.conv_out(out)return outdef _initialize(self):for m in self.conv_out.modules():if isinstance(m, nn.Conv2d):# nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')# logger.info('=> init {}.weight as normal(0, 0.001)'.format(name))# logger.info('=> init {}.bias as 0'.format(name))nn.init.normal_(m.weight, std=0.001)nn.init.constant_(m.bias, 0)

创建训练文件

创建训练文件configs/halpe_136/mobilenet/256x192_mobilenet_lr1e-3_2x-regression.yaml

  • 要训练其他数据集可以参考这个格式编写一下其他训练文件,主要是改一下DATASET下面的文件地址。
DATASET:TRAIN:TYPE: 'Halpe_136'ROOT: './data/halpe/'IMG_PREFIX: 'train2017'ANN: 'halpe_train_v1.json'AUG:FLIP: trueROT_FACTOR: 45SCALE_FACTOR: 0.35NUM_JOINTS_HALF_BODY: 8PROB_HALF_BODY: 0.3VAL:TYPE: 'Halpe_136'ROOT: './data/coco/'IMG_PREFIX: 'val2017'ANN: 'halpe_val_v1.json'TEST:TYPE: 'Halpe_136_det'ROOT: './data/coco/'IMG_PREFIX: 'val2017'DET_FILE: './exp/json/test_det_yolo.json'ANN: 'halpe_val_v1.json'
DATA_PRESET:TYPE: 'simple'LOSS_TYPE: 'L1JointRegression'SIGMA: 2NUM_JOINTS: 136IMAGE_SIZE:- 256- 192HEATMAP_SIZE:- 64- 48
MODEL:TYPE: 'FastPoseMobile'PRETRAINED: ''TRY_LOAD: ''NUM_DECONV_FILTERS:- 256- 256- 256MODEL_SIZE: 'large'CONV_DIM: 256
LOSS:TYPE: 'L1JointRegression'NORM_TYPE: 'sigmoid'OUTPUT_3D: False
DETECTOR:NAME: 'yolo'CONFIG: 'detector/yolo/cfg/yolov3-spp.cfg'WEIGHTS: 'detector/yolo/data/yolov3-spp.weights'NMS_THRES: 0.6CONFIDENCE: 0.05
TRAIN:WORLD_SIZE: 4BATCH_SIZE: 48BEGIN_EPOCH: 0END_EPOCH: 270OPTIMIZER: 'adam'LR: 0.001LR_FACTOR: 0.1LR_STEP:- 170- 200DPG_MILESTONE: 210DPG_STEP:- 230- 250

开始训练

修改train.py文件的配置,将–cfg的默认值修改成刚才的训练文件。

parser.add_argument('--cfg', default="configs/halpe_136/mobilenet/256x192_mobilenet_lr1e-3_2x-regression.yaml",help='experiment configure file name',type=str)

然后就可以把项目部署到gpu服务器上训练了。

训练结果

用八张卡的rtx3090训练了大概6天,模型在209轮达到了最好的效果,准确率大概90%多,之后就过拟合了。

识别效果其实还是不错的,面部的关键点回归会稍微有点扭曲,勉强可以使用,手部的基本没法用,需要用另外两个数据集进一步训练,不过这边也用不上。

训练项目和数据集

训练项目代码

  • .tensorboard文件夹里包含我之前训练好的权重

打包好的数据集,有需要可以自己下载,提取码:uk26
百度云链接好像不是很好使,大家到github上下载数据集

轻量化AlphaPose相关推荐

  1. 深度学习模型轻量化(下)

    深度学习模型轻量化(下) 2.4 蒸馏 2.4.1 蒸馏流程 蒸馏本质是student对teacher的拟合,从teacher中汲取养分,学到知识,不仅仅可以用到模型压缩和加速中.蒸馏常见流程如下图所 ...

  2. 【神经网络】(11) 轻量化网络MobileNetV1代码复现、解析,附Tensorflow完整代码

    各位同学好,今天和大家分享一下如何使用 Tensorflow 复现轻量化神经网络模型 MobileNetV1.为了能将神经网络模型用于移动端(手机)和终端(安防监控.无人驾驶)的实时计算,通常这些设备 ...

  3. BERT轻量化:最优参数子集Bort,大小仅为BERT-large16%

    郑集杨 发自 凹非寺  量子位 报道 | 公众号 QbitAI 近期,亚马逊 Alexa 团队发布了一项研究成果:研究人员对BERT模型进行参数选择,获得了BERT的最优参数子集--Bort. 研究结 ...

  4. CSL-YOLO | 超越Tiny-YOLO V4,全新设计轻量化YOLO模型实现边缘实时检测!!!

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 本文提出了一种新的轻量级卷积方法Cross-Stage Lightweight(CSL)模块,从简单的 ...

  5. 突破置换模块计算瓶颈,MSRA开源轻量版HRNet,超越主流轻量化网络!|CVPR2021...

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨happy 审稿丨邓富城 编辑丨极市平台 极市导读 本文从HRNet与轻量化网络ShuffleN ...

  6. linux 轻量化图形界面,用这13个方法,帮你做出真正轻量化的移动 App 设计

    原标题:用这13个方法,帮你做出真正轻量化的移动 App 设计 (点击上方公号,可快速关注) 英文:medium 译者:优设网 - 陈子木 链接:http://www.uisdc.com/2015-u ...

  7. gecco 1.1.0稳定版发布,易用的轻量化爬虫

    gecco 1.1.0稳定版发布了. 1.1.0版本主要做了如下修改: 1.优化代理设置,运行时计算代理下载成功率,自动发现无效代理,支持运行时添加代理 2.HttpClientDownloader支 ...

  8. 动态slimmable网络:高性能的网络轻量化方法!对比slimmable涨点5.9%

    动态slimmable网络:高性能的网络轻量化方法!对比slimmable涨点5.9% 论文链接: https://arxiv.org/abs/2103.13258 代码: https://githu ...

  9. 毕加索发布轻量化转化引擎及BIMSOP协作云平台

    一直以来,杂务缠身,博客都好久没有更新了,以后还是要继续坚持总结一下.希望能有时间坚持下去 :) 月初在国家会议中的智能展会上,我分享了毕加索公司近来的工作,即自行研发的轻量化转化云平台,以及以此为基 ...

最新文章

  1. Objective-C 什么是类
  2. 微信协议简单调研笔记
  3. Online Learning算法理论与实践
  4. Tensorboard--模型可视化工具
  5. php创建windos用户,window_Win7系统创建及开启隐藏账户图文教程,  在电脑操作中有时候因为 - phpStudy...
  6. 程序员高效学习,坚持十年就是大师
  7. STM8S——Analog/digital converter (ADC)
  8. 千月影视APP前端搭建_①_注册apicloud账号密码
  9. C++代码审查工具Cppcheck和TscanCode
  10. php 生成 rtf,PHP 生成Word文档,ODT文档,RTF文档
  11. 错误总结:Exception in thread main java.lang.ExceptionInInitializerError
  12. 解题报告:HDU_4093 Xavier is Learning to Count FFT
  13. “红黑树”,我一脸懵逼......
  14. 数学建模国赛编程手必备工具
  15. Mendeley-一款免费好用的文献管理软件
  16. [附源码]java毕业设计小超市进销存管理系统
  17. 浏览器退出全屏快捷键
  18. 平面设计主要是学什么?平面设计主要有哪些内容?——黎乙丙
  19. 【嵌入式软件开发岗位 ---- 面试总结01】
  20. HDFS的文件压缩格式

热门文章

  1. jdbc之mysql的serverTimezone参数设置
  2. Access的DateAdd 函数
  3. 域名证书和SSL证书一样的吗?有什么区别呢
  4. Jupyter notebook文字排版笔记
  5. QT .pro文件详解
  6. 还不懂PID控制?精华都在这了!
  7. Tiled Based Deferred Shading与Forward+
  8. 专科的计算机跨专业考研,专科生考研心路:跨学历都不怕,怕什么三跨?
  9. 图形界面 I: 图形界面的动画 (第三章)
  10. 基于协同过滤的推荐系统