矽速科技 · 2023年04月14日 · 广东

MMPose:在爱芯派上玩转你的关键点检测

嘿 欢迎回到一起变强频道!
想拥有并部署 MMPOES + YOLOv8 强强联合的关键点姿态检测吗?

前言

继部署 YOLOv8 目标检测后我们又带来了关键点检测的部署教程,早在验证时我们就体验过内置的关键点模型,但如何部署到 爱芯派 上并实现姿态检测?这可能卡住了很多小伙伴变强的脚步,那就由这篇文章来告诉你怎么实现!

  • 以下视频为关键点检测实拍效果

https://www.bilibili.com/vide...

文章补充说明

仓库:GitHub - prophet-mu/elderly_fell_detect
本文基于 prophet-mu 原文 进行整理以及补充发布。

本文内容以下文【YOLOv8 目标检测合集】为基础编写关键点检测。
YOLOv8 目标检测:训练自定义数据集并部署到爱芯派(一)
YOLOv8 目标检测:训练自定义数据集并部署到爱芯派(二)

什么是 MMPose

MMPose 是一个基于 PyTorch 的姿态估计算法库,也是 OpenMMLab 项目的一部分。MMPose 支持人体、人手、人脸、动物、服装等多类物体的 2D/3D 姿态估计,并实现多种学界最先进的姿态估计模型,包括自顶向下和自底向上两大类算法,还支持多种主流和代表性的数据集如 COCO、MPII、 AIC 等。

参考资料:

1. 爱上她的 N 个理由!OpenMMLab 姿态估计工具箱:MMPose
2. 欢迎来到 MMPOSE 中文文档!
3. OpenMMLab/mmpose
4. Github - OpenMMLad

本文着重在于实操与应用,更多理论请关注:深度学习板块

能做什么

MMPose:可用于姿态估计以及关键点的全身人体姿态估计、动物关键点检测等,它还提供了训练好的权重,可以用于预测图片和视频。

要做什么

我们将要采用 MMPose 的预训练模型 HRnet 把他部署到爱芯派上。

本篇我们采用 Top-Down 的方法,第一步先使用 YOLOv8 目标检测 把人体检测出来第二步将检测到的人体所在区域图像扣出来传入 HRnet 的网络中完成关键点的提取。总的来说这不是一个端对端的模型,而是通过了两段模型进行处理来完成我们的人体关键点检测。

参考资料:目标检测网络中的 bottom-up 和 top-down 理解_bottom-up 网络

流程导读(该怎么做)

从【做什么】我们知道了要部署 MMPoes 模型到爱芯派上并实现关键点检测。
那接下来就是围绕【怎么做】来实现我们的目标!

流程图

我们将通过四大块多个小块的步骤来实现我们的目标!

b39b30ac15b36e846de18a8ec37a7f8.png

步骤概括

  • 准备工作:配置相关的生产环境。
  • 模型选择:我们需要选择合适的预训练模型。
  • 模型评估:在下载完预训练模型后,我们需要对其进行评估以确保其性能符合预期。
  • 模型部署:最后我们将模型部署到生产环境中以便实际应用。

环境

  • 系统 ubuntu20.04
  • nvidia 独立显卡 GPU(可选)
  • 良好的网络(重要)
  • Python:3.8.10

工具

  • vscode(开发工具)
  • Git
  • Docker
  • 预训练模型:HRnet + Fpn(测试模型性能和效果)

体验 MMPose

准备工作

需要掌握的基础知识:

  1. 掌握 Ubuntu 的基本操作,参考:Linux 教程 | 菜鸟教程
  2. 掌握 git 相关知识:Git 教程 | 菜鸟教程
  3. 掌握 Python:Python 基础教程 | 菜鸟教程

获取 MMPose 源码

第一步:先拉取仓库,后续的所有操作都基于此。

cd ~ 
git clone https://github.com/open-mmlab/mmpose.git

第二步:进入 mmpose 目录下

cd ~/mmpose

配置 MMPose 环境

准备:进行配置 MMPose 环境前先是我们的准备工作。

  • 安装 pip:执行下面的指令安装
sudo apt install python3-pip    # install   

换源:如果执行下文指令时发现网络较差下载不了 MMPoes 训练环境,则需要先进行换源这里以下文清华源为例参考。

1.1. pip更换软件源方法
1.2. python pip 换国内源的办法(永久和临时两种办法)
1.3. PIP 更换国内安装源

  • 安装 anaconda

第一步:anaconda 的安装与使用,以下资料可供参考:

1.1. 【anaconda在Ubuntu环境下的安装与使用(保证看完就会用,请将声音调到最大)】
1.2. ubuntu20.04 安装 anaconda 然后在 conda 里安装 pytorch
1.3. Anaconda 在 Ubuntu 下的安装与简单使用

第二步:安装显卡驱动、CUDA、cuDNN,以下资料可供参考:

搭建舒适的Ubuntu使用环境系列——安装显卡驱动、CUDA、cuDNN及其简单介绍

第三步:在 anaconda 中创建虚拟环境并安装 pytorch,以下资料可供参考:

Ubuntu 在 Anaconda 中创建虚拟环境并安装 pytorch

第四步:anaconda 换源,以下资料可供参考:

Ubuntu anaconda 换源(最新最全亲测)
  • 安装 MMCV

这里我们使用 MIM 来安装 MMCV

pip install -U openmim #安装mim
mim install mmcv-full #使用mim安装mmcv

也可以使用自定义安装来手动安装 MMCV

资料参考:安装 - MMPoes 1.0.0 文档

安装依赖

接下来再进行配置 MMPose 环境速度就会提高

cd ~/mmpose #进入mmpose目录
pip install -r requirements.txt  # 安装依赖   

也可以用 pip 单独安装特定版本的软件包

1681444831840.jpg

pip install -v -e . #安装mmpose
资料参考:欢迎来到 MMPOSE 中文文档! - MMPoes 0.29.0 文档

电脑端体验 MMPoes

  • 预训练模型
预训练模型是一种深度学习的方法:它利用大量的无标注数据来学习通用的特征或知识,然后再用少量的标注数据来微调模型以适应特定的任务。在数据稀缺或领域特定的场景下,预训练模型可以提高模型的性能和泛化能力。

接下来我们需要下载 HRnetFast_rcnn 两个预训练模型。

  • 什么是 HRnet

HRNet 是一种网络结构可用于多个视觉任务,包括图像分类、图像分割、目标检测、人脸对齐、姿态识别、风格迁移、Image Inpainting、超分、optical flow、Depth estimation、边缘检测等。

它的创新点是将高低分辨率之间的链接由串联改为并联,同时在整个网络结构中都保持了高分辨率的表征。HRNet 可以在整个过程中保持高分辨率表示,从而提高准确性。HRNet使用并行连接多分辨率子网络中的信息,通过跨分辨率的信息交互,实现高分辨率丰富语义的特征输出,实现多尺度融合。而它可以在整个过程中保持高分辨率表示,从而提高准确性。

参考资料说明:

1. 一文读懂 HRNet
2. 打通多个视觉任务的全能 Backbone:HRNet

  • 什么是 faster_rcnn

简单来说就是一个目标检测模型,用于把人从图像中扣出来传入 HRnet 中做关键点。

参考资料说明:一文读懂 Faster RCNN

创建模型文件夹并且下载预处理模型。

mkdir -p ~/mmpose/models  #创建模型文件夹
wget -P ~/mmpose/models -o faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth https://download.openmmlab.com/mmdetection/v2.0/faster_rcnn/faster_rcnn_r50_fpn_1x_coco/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth #下载模型
wget -P ~/mmpose/models -o hrnet_w48_coco_256x192-b9e0b3ab_20200708.pth https://download.openmmlab.com/mmpose/top_down/hrnet/hrnet_w48_coco_256x192-b9e0b3ab_20200708.pth
  • 识别图中人体的关键点

1681453727268.jpg

本文采用 mmpose 进行演示
python demo/top_down_img_demo_with_mmdet.py demo/mmdetection_cfg/faster_rcnn_r50_fpn_coco.py models/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth  configs/body/2d_kpt_sview_rgb_img/topdown_heatmap/coco/hrnet_w48_coco_256x192.py  models/hrnet_w48_coco_256x192-b9e0b3ab_20200708.pth --img-root tests/data/ochuman/ --img 000817.jpg --out-img-root vis_results

1681453864002.jpg

1681453883130.jpg

在爱芯派上部署 MMPoes 模型

接下来将详细介绍如何将模型部署到 爱芯派 并使用。

模型导出

  • 导出模型

现在我们已知完成一个关键点检测需要的是两个模型了,但现成的目标检测模型有很多,我们只需要在爱芯派上跑一个 yolo 把人体给扣出来就好,所以这里我们只需转换另一个模型 HRnet 即可。

cd ~/mmpose/tools/deployment/

第一步:使用以下命令导出 onnx 模型并注意路径与模型名称

python3 pytorch2onnx.py ../../configs/body/2d_kpt_sview_rgb_img/topdown_heatmap/coco/hrnet_w32_coco_256x192.py ../../models/hrnet_w32_coco_256x192-c78dce93_20200708.pth --shape 1 3 256 192 --output-file hrnet.onnx

1681458092507.jpg

第二步:可使用下面命令进一步简化 onnx 模型

python3 -m onnxsim hrnet.onnx hrnet_sim.onnx

1681458175192.jpg

导出的 onnx 模型在 /mmpose/tools/deployment/ 目录下。

模型转换

  • 准备工作

第一步:掌握 Docker :Docker 教程
第二步:完成转换的 ONNX 模型

  • 拉取 Docker

第一步:使用以下命令拉取带有模型转换工具的容器,没有安装 docker 请自行安装。
安装 docker 直接用一键命令安装简单省事:

wget http://fishros.com/install -O fishros && . fishros

第二步:拉取 Docker

docker pull sipeed/pulsar:0.6.1.20

1681199489517.jpg

第三步:拉取我的仓库

git clone https://github.com/prophet-mu/elderly_fell_detect.git
cd elderly_fell_detect
  • 准备模型转换的量化数据集
模型量化是一种将神经网络的浮点算法转换为定点算法的技术,以损失推理精度为代价,将网络中连续取值或离散取值的浮点型参数(权重或张量)线性映射为定点近似(int8 / uint8)的离散值,取代原有的 float32 格式数据,同时保持输入输出为浮点型,从而达到减少模型尺寸大小、减少模型内存消耗及加快模型推理速度等目标。
模型量化为定点与浮点等数据之间建立一种数据映射关系,使得以较小的精度损失代价获得了较好的收益。
模型量化需要数据集的原因是为了用来确定对于每一层卷积输出 feature map 的量化因子,对于权值一般是直接取最大绝对值去做量化因子。

网盘下载:点击前往百度网盘

1681458527844.jpg

注意onnx 模型需转换为 joint 模型才能在爱芯派运行,我们使用 pulsar 模型转换工具,以及 pb、tflite、weights、paddle 等模型,同样需要转换为 onnx 模型才能使用 pulsar 模型转换工具。

修改 hrnet_256x192_11.prototxt 的文件,修改你对应的数据集地址

input_type: INPUT_TYPE_ONNX
output_type: OUTPUT_TYPE_JOINT
target_hardware: TARGET_HARDWARE_AX620
input_tensors {
    color_space: TENSOR_COLOR_SPACE_RGB
}
cpu_backend_settings {
    onnx_setting {
        mode: DISABLED
    }
    axe_setting {
        mode: ENABLED
        axe_param {
            optimize_slim_model: true
        }
    }
}
neuwizard_conf {
    operator_conf {
        input_conf_items {
            attributes {
                input_modifications {
                    affine_preprocess {
                        slope: 1
                        slope_divisor: 255
                        bias: 0
                    }
                }
            }
        }
        input_conf_items {
            attributes {
                input_modifications {
                   input_normalization {
                       mean:[0.485, 0.456, 0.406]
                       std:[0.229, 0.224, 0.225]
                   }
                }
            }
        }
   }
   dataset_conf_calibration {
        path: "images.tar" # 一个具有 1000 张图片的 tar 包,用于编译过程中对模型校准
        type: DATASET_TYPE_TAR
        size: 32
   }
   dataset_conf_error_measurement {
        path: "images.tar" # 用于编译过程中测量偏差
        type: DATASET_TYPE_TAR
        size: 4
        batch_size: 1
    }
    evaluation_conf {
            path: "neuwizard.evaluator.error_measure_evaluator"
            type: EVALUATION_TYPE_ERROR_MEASURE
            source_ir_types: IR_TYPE_NATIVE
            ir_types: IR_TYPE_LAVA
    }
}
# pulsar compiler 的配置参数
pulsar_conf {
    ax620_virtual_npu: AX620_VIRTUAL_NPU_MODE_111
    batch_size: 1
    debug : false
}

移动之前导出的 onnx 模型文件到当前文件夹

  1. 用于转换的 hrnet.onnx 文件
  2. 用于转换的 hrnet.prototxt 文件
  3. 用于量化的数据集 image.tar

1681458679110.jpg

  • 进入 Docker

使用以下命令进入容器,如果需要保留该容器请删除 --rm 参数。
注意:一定要设置共享内存,将工作空间的目录挂载到容器的 data 目录。

docker run -it --net host --rm --shm-size 16g -v $PWD:/data sipeed/pulsar

1681458759087.jpg

如果有 Nvidia GPU 环境可以使用以下命令,使用带有 GPU 的容器可以加快模型转换的速度。

docker run -it --net host --rm --gpus all --shm-size 16g -v $PWD:/data sipeed/pulsar

1681199634146.jpg

  • 转换模型
pulsar build --input onnx/best.onnx --output rebar.joint --config config/rebar.prototxt --output_config rebar.prototxt

转换时间较长请耐心等待。

1681458875415.jpg

转换完成可以在工作目录下找到转换后的模型 hrnet.joint

使用 Python 部署

上文更多的是阐述部署到 爱芯派 前的各项准备,而接下来介绍的则是如何使用 Python 进行部署,但部署前我们先来认识 爱芯派 并了解使用基础。

参考资料说明:浏览以下文章快速了解 爱芯派 硬件以及上手指南。

M3axpi 官方介绍:wiki.sipeed.com/m3axpi
MAIX-III AXera-Pi 系列文章:开箱之硬件初体验
MAIX-III AXera-Pi 系列文章:上手之丝滑玩转 AI 板卡【一】
MAIX-III AXera-Pi 系列文章:上手之丝滑玩转 AI 板卡【二】

  • 模型部署是什么?

模型部署是指将训练好的模型应用到生产环境中,以便实际使用。

这一过程通常包括以下几个步骤:

1. 导出模型:首先你需要将训练好的模型导出为一种可以在生产环境中使用的格式,常见的格式包括 ONNX、TensorFlow SavedModelTorchScript 等。
2. 选择部署平台:接下来你需要选择一个合适的部署平台,这可以是本地服务器、云服务器或边缘设备等。
3. 配置运行环境:然后你需要在部署平台上配置运行环境,以便能够运行导出的模型,这可能包括安装相关软件和库等。
4. 集成模型:最后你需要将导出的模型集成到应用程序中,并进行测试以确保其正常工作。

第一步:修改提供的 hrnet_pose_yolov8.json 文件,把转换好的模型 hrnet.joint、yolov8n.joint,和 json 拷入爱芯派的 home 目录下,自行修改成自己的模型文件名字。

hrnet_pose_yolov8.json
{
    "MODEL_TYPE": "MT_MLM_HUMAN_POSE_HRNET",
    "SAMPLE_IVPS_ALGO_WIDTH": 960,
    "SAMPLE_IVPS_ALGO_HEIGHT": 540,
    "MODEL_MINOR": {
        "CLASS_ID": [
            0
        ],
        "MODEL_PATH": "/home/hrnet.joint"
    },
    "MODEL_MAJOR": {
        "MODEL_TYPE": "MT_DET_YOLOV8",
        "MODEL_PATH": "/home/yolov8n.joint",
        "STRIDES": [8, 16, 32],
        "CLASS_NAMES": [
            "person",
            "bicycle",
            "car",
            "motorcycle",
            "airplane",
            "bus",
            "train",
            "truck",
            "boat",
            "traffic light",
            "fire hydrant",
            "stop sign",
            "parking meter",
            "bench",
            "bird",
            "cat",
            "dog",
            "horse",
            "sheep",
            "cow",
            "elephant",
            "bear",
            "zebra",
            "giraffe",
            "backpack",
            "umbrella",
            "handbag",
            "tie",
            "suitcase",
            "frisbee",
            "skis",
            "snowboard",
            "sports ball",
            "kite",
            "baseball bat",
            "baseball glove",
            "skateboard",
            "surfboard",
            "tennis racket",
            "bottle",
            "wine glass",
            "cup",
            "fork",
            "knife",
            "spoon",
            "bowl",
            "banana",
            "apple",
            "sandwich",
            "orange",
            "broccoli",
            "carrot",
            "hot dog",
            "pizza",
            "donut",
            "cake",
            "chair",
            "couch",
            "potted plant",
            "bed",
            "dining table",
            "toilet",
            "tv",
            "laptop",
            "mouse",
            "remote",
            "keyboard",
            "cell phone",
            "microwave",
            "oven",
            "toaster",
            "sink",
            "refrigerator",
            "book",
            "clock",
            "vase",
            "scissors",
            "teddy bear",
            "hair drier",
            "toothbrush"
        ],
        "CLASS_NUM": 80,
        "NMS_THRESHOLD": 0.44999998807907104,
        "PROB_THRESHOLD": 0.4000000059604645
    }
}

第二步:修改 predict.py 文件把代码中的 json 改成自己的名字,如果默认跟我一致则不修改,拷入爱芯派 home 目录下运行。

import time
from ax import pipeline
pipeline.load([
    'libsample_vin_ivps_joint_vo_sipy.so',
    '-p', '/home/hrnet_pose_yolov8.json',
    '-c', '2',
])
while pipeline.work():
    time.sleep(0.001)
    tmp = pipeline.result()
    if tmp and tmp['nObjSize']:
        for i in tmp['mObjects']:
            print(i)
        # if tmp['nObjSize'] > 10: # try exit
        #     pipeline.free()
pipeline.free()

本文以 Windows10 系统为例,首先参考以下文章学习连接爱芯派(推荐用 SSH 进行登录).

  1. 如何使用爱芯派网口进行 SSH 通信(推荐)
  2. 爱芯派系统使用手册
  3. 如何在 Mobaxterm 使用 SSH

第一步:确保成功连接后,如图进行操作进入爱芯派。

1681204631459.jpg

第二步:使用以下指令进入爱芯派的 home 目录。

cd ..
cd home

第三步:将识别所需的 rebar.joint、rebar.json、rebar.py 放入 home 目录里,然后执行下面的指令运行目标检测代码。

python3 rebar.py

1681201786428.jpg

第四步:找测试物或实时画面进行测试效果。

铛铛铛:MMPoes 关键点检测成功部署并在 爱芯派 上运行。

https://www.bilibili.com/vide...

本文所有使用的外链在 2023/04/15 前是有效可观看状态。

章节小结

当你跟着一起学习完这篇文章的内容后,相信你一定对整个流程有了一个清晰的认识,后续文章将会详细讲解更多的实战部分,包括如何优化模型效果提高模型的精度,如何检测更多类别更多标签,如何制作一个实际的功能与应用,下次见!

回顾往期文章

MAIX-III AXera-Pi 系列文章(1):新一代 3.6T 视觉 AI Linux 板卡面世

MAIX-III AXera-Pi 系列文章(2):丰富多采的 AI 应用

MAIX-III AXera-Pi 系列文章(3):Debian 系统 & 开箱案例

MAIX-III AXera-Pi 系列文章:开箱之硬件初体验

MAIX-III AXera-Pi 系列文章:上手之丝滑玩转 AI 板卡【一】

MAIX-III AXera-Pi 系列文章:上手之丝滑玩转 AI 板卡【二】

YOLOv8 目标检测:训练自定义数据集并部署到爱芯派(一)

YOLOv8 目标检测:训练自定义数据集并部署到爱芯派(二)

还想了解更多内容?

内容链接
AXera-Pi 产品介绍https://mp.weixin.qq.com/s/JIvVprWlQPvE7bTxozAG_Q
AXera-Pi 产品资料wiki.sipeed.com/m3axpi
海外购买渠道https://fr.aliexpress.com/item/1005005016931077.html
国内购买渠道https://item.taobao.com/item.htm?id=682169792430
AI 开发工具链https://pulsar-docs.readthedocs.io/
AI 示例仓库https://github.com/AXERA-TECH/ax-samples
Python APIhttps://github.com/junhuanchen/ax-pipeline-api
系统 BSP SDKhttps://github.com/sipeed/axpi_bsp_sdk
基础 C++ SDKhttps://github.com/sipeed/libmaix
进阶 C++ SDKhttps://github.com/AXERA-TECH/ax-pipeline
AXERA 技术交流群专供 AI ISP 技术交流:139953715
荔枝 MaixPy3 AI 交流群产品开箱小白答疑:756313869
AI 训练平台http://maixhub.com
在线文档http://wiki.sipeed.com
交流社区http://bbs.sipeed.com
开源组织http://github.com/sipeed
官方推特https://twitter.com/SipeedIO
商业邮箱support@sipeed.com
推荐阅读
关注数
7434
内容数
92
人工智能边缘计算软硬件解决方案,提供高性能、低成本、低功耗、易使用的硬件选型方案.
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息