基于PP-Human的来客分析案例教程
基于PP-Human完成来客分析整体流程。使用PP-Human完成来客分析中非常常见的场景: 1. 来客属性识别(单镜和跨境可视化);2. 来客行为识别(摔倒识别);
1 项目概括
来客分析可以广泛的运用于展馆、商超、饭店等日常场景中。通过对来店客人的属性识别、行为预警、时长和轨迹记录等数据进行统计分析,可以应用于相关场所的客流通统计、用户画像、客户留存分析等功能, 进而提升相关场所的经营和服务水平。
本教程提供了基于PaddleDetection的实时行人分析工具PP-Human,实现单镜头和跨镜下的来客属性分析以及摔倒等异常行为识别。
PP-Human是基于飞桨深度学习框架的业界首个开源的实时行人分析工具,具有功能丰富,应用广泛和部署高效三大优势。PP-Human 支持图片/单镜头视频/多镜头视频多种输入方式,功能覆盖多目标跟踪、属性识别和行为分析。能够广泛应用于智慧交通、智慧社区、工业巡检等领域。支持服务器端部署及TensorRT加速,T4服务器上可达到实时。PP-Human的全景图如下:
在上面的全景图中的算法架构部分,左边为输入数据输入。可以看到PP-Human支持图片、单镜头视频、多镜头视频(跨镜)多种输入。输入的数据经过目标检测、多目标跟踪等模型提取特征并融合后,即可实现属性识别、关键点检测、行为识别等场景应用。
有关PP-Human详细文档可参考:https://github.com/PaddlePaddle/PaddleDetection/tree/develop/deploy/pphuman
2. 场景分析
本教程涉及到来客分析应用中的两个典型场景:用户属性分析和用户行为识别,所用到的模型和相互之间的关系如下:
- 用户属性分析:
- 异常行为预警:摔倒识别
综和这两个场景, 我们要用到如下模型:
- 目标检测
- 属性识别
- 关键点识别
- 多目标追踪
- 行为识别
所采用的输入包括:
- 单镜头视频
- 跨境头视频
本教程最终的效果如下:
- 来客属性识别(跨镜)
镜头1:
镜头2:
- 来客行为识别(单镜)
下面针对这些模型,我们分别来详细说明每个模型的训练、评估、预测、导出等整个流程,帮助用户在了解每个模型后,快速上手和理解整个PP-Human项目。
3. 环境准备
按照如下步骤配置运行环境:
-
- 确认环境中已按照好paddle, 推荐使用最新的2.3版本。如果没有安装,可以参考官网和环境的配置安装相应的版本。
-
- PaddleDetection,PaddleClas等所需要使用的开发套件。这些套件推荐使用git clone进行下载, 此处暂时不安装,在各个模型章节单独安装。
# paddle安装验证,CodeLab在创建时已经指定了环境和GPU
import paddle
print(paddle.__version__)
paddle.utils.run_check()
2.3.1
Running verify PaddlePaddle program ...
W0805 10:09:15.130228 244 gpu_resources.cc:61] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 11.2, Runtime API Version: 10.1
W0805 10:09:15.134845 244 gpu_resources.cc:91] device: 0, cuDNN Version: 7.6.
PaddlePaddle works well on 1 GPU.
PaddlePaddle works well on 1 GPUs.
PaddlePaddle is installed successfully! Let's start deep learning with PaddlePaddle now.
注意:
- 在创建codelab项目时已经指定paddle版本等环境要求,可以不安装paddle,直接运行
- 如果需要安装其他版本, 可以用下面的脚本执行安装
# 安装paddlepaddle, 最新的版本为2.3,注意安装gpu版本。如果机器没有gpu,则需要安装cpu版本
# !python -m pip install paddlepaddle-gpu==2.3.0 -i https://mirror.baidu.com/pypi/simple
# 如果您使用的是安培架构的GPU,推荐使用CUDA11.2,执行以下命令安装
# !python -m pip install paddlepaddle-gpu==2.3.0.post112 -f https://www.paddlepaddle.org.cn/whl/linux/mkl/avx/stable.html
# 安装paddle2.2.2版本
# !python -m pip install paddlepaddle-gpu==2.2.2 -i https://mirror.baidu.com/pypi/simple
4. 目标检测模型
从PP-Human的算法原理图中,我们可以看到目标检测是各个下游任务的基础。因而这里从目标检测开始,以PP-YOLOE模型为例,介绍整个目标检测模型的训练、评估、预测、导出等流程。
PP-YOLOE是基于PP-YOLOv2的卓越的单阶段Anchor-free模型。飞桨团队基于ppyolo做了一系列改进和升级,使其在精度上超越了多种流行的yolo模型。PP-YOLOE有s/m/l/x一系列的模型,可以通过width multiplier和depth multiplier配置。PP-YOLOE避免使用诸如deformable convolution或者matrix nms之类的特殊算子,以使其能轻松地部署在多种多样的硬件上。
PP-YOLOE-l在COCO test-dev2017达到了51.4的mAP, 同时其速度在Tesla V100上达到了78.1 FPS。
ppyoloe由以下方法组成:
- 可扩展的backbone和neck
- Task Alignment Learning
- Efficient Task-aligned head with DFL和VFL
- SiLU激活函数
更多细节可以参考PP-YOLOE官方介绍文档:
https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.4/configs/ppyoloe/README_cn.md
4.1 准备环境和数据
4.1.1. 配置PaddleDetection运行环境
主要步骤如下:
- 下载 PaddleDetection
- 安装PaddleDetection套件的依赖库
- 编译安装paddledet
由于PaddleDetection版本正在升级中,为了防止读者因clone新版本导致代码无法运行问题,本教程提供编写该教程中所用的PaddleDetection版本,该版本为release/2.4版本,放在work目录下,使用时需要先解压。
# 解压PaddleDetection套件
!unzip /home/aistudio/work/PaddleDetection.zip -d /home/aistudio/
# 如果需要下载最新版,可以使用下面的命令,但是要注意由于版本更新,目录变动,可能会导致部分代码无法运行
# !git clone https://gitee.com/paddlepaddle/PaddleDetection.git
# 安装其他依赖
%cd /home/aistudio/PaddleDetection
# !python -m pip install --upgrade pip
!pip install -r requirements.txt
# 编译安装paddledet
!python setup.py install
4.1.2. 数据准备
这里为了让读者可以跑通训练流程,我们为准备了一个小批量的coco样本数据。该数据已经挂载在本项目的data/data157083/目录中。clone本项目后把数据解压到paddledetection的dataset/coco目录下使用即可。
# 解压数据到PaddleDetection/dataset/coco目录下
!unzip /home/aistudio/data/data157083/coco_mini.zip -d /home/aistudio/PaddleDetection/dataset/coco
%cd /home/aistudio/PaddleDetection/dataset/coco
!mv coco_mini/* ./
!rm -rf coco_mini/
# 该数据集按照coco格式准备,使用tree可以查看其目录结构。该目录下存放了训练和验证用的图片和标注文件
!tree -L 2 /home/aistudio/PaddleDetection/dataset/coco
/home/aistudio/PaddleDetection/dataset/coco
├── download_coco.py
├── train
│ ├── images
│ └── train.json
└── val
├── images
└── val.json
4 directories, 3 files
可以看到该目录下有train和val两个目录分别存放训练和验证数据。每个目录中,images存在原始图片,json为标注文件。用户自己准备数据集时也需要按照此格式。json的标注文件可以使用labelimg等开源工具。这里推荐使用飞桨开源的交互式标注工具EIseg,可以同时标注用于检测和分割的数据标注。具体参考:https://github.com/PaddlePaddle/PaddleSeg/tree/release/2.5/EISeg
下面选取部分查看一下,让用户对该数据集有个大概的了解。
%cd /home/aistudio/PaddleDetection/
import os
import cv2
import matplotlib.pyplot as plt
img_root = './dataset/coco/train/images'
img_list = os.listdir(img_root)[10:15]
plt.figure(figsize=(15,6))
for i, img_ in enumerate(img_list):
img_path = os.path.join(img_root, img_)
img_f = cv2.imread(img_path)
plt.subplot(1,5, i+1)
plt.imshow(img_f[:,:, ::-1])
plt.axis("off")
plt.title(img_)
/home/aistudio/PaddleDetection
注意: 上述代码运行第一次可能会报错,在运行一次即可。
4.2 模型训练
使用tools/train.py脚本启动训练流程。训练之前需要将配置文件按照我们的数据集进行更改。
此处,我们将下面的数据集配置信息放到configs/ppyoloe/ppyoloe_crn_l_300e_coco.yml文件下,训练时使用此文件。
'''
# 按照实际数据集修改的配置信息
metric: COCO
num_classes: 80
TrainDataset:
!COCODataSet
image_dir: images
anno_path: train.json
dataset_dir: ./dataset/coco/train
data_fields: ['image', 'gt_bbox', 'gt_class', 'is_crowd']
EvalDataset:
!COCODataSet
image_dir: images
anno_path: val.json
dataset_dir: ./dataset/coco/val
TestDataset:
!ImageFolder
anno_path: annotations/instances_val2017.json # also support txt (like VOC's label_list.txt)
dataset_dir: dataset/coco # if set, anno_path will be 'dataset_dir/anno_path'
'''
# 使用tools/train.py开启一键训练!在训练时可以加入--eval进行边训练边评估,随时查看模型评估效果
# 另外在训练过程中如果报显存溢出错误,可以修改batch size, 实测使用Tesla V100 32G的环境下, bs=16可以完成训练
%cd /home/aistudio/PaddleDetection/
!python tools/train.py -c configs/ppyoloe/ppyoloe_crn_l_300e_coco.yml --eval
4.3 模型评估
训练完成后,默认情况下模型保存在output/ppyoloe_crn_l_300e_coco目录中。在该目录下,保存了训练过程中效果最好的模型best_model和最后一次迭代更新权重后的模型model_final,读者可以按照自己的需求选用
我们可以通过运行评估命令来得到模型的精度,以确认训练的效果。评估可以参考以下命令执行。注意,这里使用了我们已经训练好的模型。如希望使用自己训练的模型,请对应将weights=后的值更改为对应模型.pdparams文件的存储路径即可。
%cd /home/aistudio/PaddleDetection/
!python tools/eval.py -c configs/ppyoloe/ppyoloe_crn_l_300e_coco.yml \
-o weights=https://paddledet.bj.bcebos.com/models/ppyoloe_crn_l_300e_coco.pdparams
从评估结果,可以看到相应的mAP平均精度(Mean Average Precision,mAP)以及召回(Recall)和FPS检测帧率(Frames Per Second,FPS)等评估指标。
4.4 模型预测
预测通过使用tools/infer.py脚本完成
使用以下命令在单张GPU上预测图片
- 使用–infer_img推理单张图片
- 使用–infer_dir推理文件中的所有图片
此处我们使用CrowedHuman数据集中的一张图片作为demo来演示,该图片位于work目录中。
# 预测单张图片
%cd /home/aistudio/PaddleDetection
!python tools/infer.py \
-c configs/ppyoloe/ppyoloe_crn_l_300e_coco.yml \
-o weights=https://paddledet.bj.bcebos.com/models/ppyoloe_crn_l_300e_coco.pdparams \
--infer_img=../work/crowedhuman_demo.jpg
如果需要对一个目录内的所有图片进行预测,只需要将infer_img更换为infer_dir, 并设置好路径即可。
上文脚本预测的结果如下:
4.5 模型导出
训练后的模型,经过验证满足精度要求,可以用于部署时,此时就需要将模型导出为静态图模型进行部署。也可以导出为onnx模型用于后续的部署。导出使用tools/export_model.py这个脚本。
%cd /home/aistudio/PaddleDetection/
!python tools/export_model.py -c configs/ppyoloe/ppyoloe_crn_l_300e_coco.yml -o weights=https://paddledet.bj.bcebos.com/models/ppyoloe_crn_l_300e_coco.pdparams \
TestReader.inputs_def.image_shape=[1,3,640,640] --output_dir output_inference
模型导出时,也可以使用用户训练好的模型,用户只需要将weight改成模型的地址即可。导出时,如果没有指定output_dir,那么导出的模型将默认存储在output_inference/路径下。可以使用下面的代码查看导出后的模型目录结构
!tree /home/aistudio/PaddleDetection/output_inference/ppyoloe_crn_l_300e_coco
/home/aistudio/PaddleDetection/output_inference/ppyoloe_crn_l_300e_coco
├── infer_cfg.yml
├── model.pdiparams
├── model.pdiparams.info
└── model.pdmodel
0 directories, 4 files
以上我们即完成了目标检测模型的训练评估预测和导出整个流程。
5. 属性识别模型
本章节将介绍使用 PaddleClas 的超轻量图像分类方案(PULC,Practical Ultra Lightweight image Classification)快速构建轻量级、高精度、可落地的人体属性识别模型。该模型可以广泛应用于行人分析、行人跟踪等场景。
目前,属性分析包含26种不同属性:
- 性别:男、女
- 年龄:小于18、18-60、大于60
- 朝向:朝前、朝后、侧面
- 配饰:眼镜、帽子、无
- 正面持物:是、否
- 包:双肩包、单肩包、手提包
- 上衣风格:带条纹、带logo、带格子、拼接风格
- 下装风格:带条纹、带图案
- 短袖上衣:是、否
- 长袖上衣:是、否
- 长外套:是、否
- 长裤:是、否
- 短裤:是、否
- 短裙&裙子:是、否
- 穿靴:是、否
更多PULC的资料参考: https://github.com/PaddlePaddle/PaddleClas/blob/develop/docs/zh_CN/PULC/PULC_person_attribute.md
5.1 准备环境和数据
5.1.1 环境配置
先配置paddleclas的运行环境,主要步骤如下:
- 克隆 PaddleClas
- 安装 Python 依赖库
# 使用git clone 下载, github比较慢,可以从gitee上下载
%cd /home/aistudio/
!git clone https://gitee.com/paddlepaddle/PaddleClas.git -b release/2.4
# 安装相关依赖
%cd /home/aistudio/PaddleClas
!pip install --upgrade -r requirements.txt -i https://mirror.baidu.com/pypi/simple
5.1.2 数据准备
本案例中所使用的数据为pa100k 数据集。PA-100K数据集是迄今为止用于行人属性识别的最大数据集,其中包含从室外监控摄像头收集的总共100000张行人图像,每张图像都有26个常用属性。根据官方设置,整个数据集随机分为80000个训练图像、10000个验证图像和10000个测试图像。
关于pa100k数据集相关内容可以参考: https://www.v7labs.com/open-datasets/pa-100k
# 将数据下载到PaddleClas目录下的dataset文件夹内
%cd /home/aistudio/PaddleClas/dataset
!wget https://paddleclas.bj.bcebos.com/data/PULC/pa100k.tar
!tar -xf pa100k.tar
%cd /home/aistudio/PaddleClas/dataset/
# 查看数据集的目录结构
!tree -L 1 pa100k/
print('===' * 10)
# 查看标注文件的前5行
print('---文件标注示意:---')
!head -n 5 pa100k/train_list.txt
- 从数据集目录中可以看到数据集分为训练集(train)、验证集(val)和测试集(test)。train_list.txt、val_list.txt、test_list.txt分别为训练集、验证集、测试集的标签文件。在本例子中,test_list.txt暂时没有使用。
- 在标注文件中,每张图片中的行人属性通过0/1进行标注。
- 为了对数据集有更好的认识,下面选择部分数据查看
# 选择部分数据查看
%cd /home/aistudio/PaddleClas
import os
import cv2
import matplotlib.pyplot as plt
img_root = './dataset/pa100k/train/'
img_list = os.listdir(img_root)[:5]
plt.figure(figsize=(15,6))
for i, img_ in enumerate(img_list):
img_path = os.path.join(img_root, img_)
img_f = cv2.imread(img_path)
plt.subplot(1,5, i+1)
plt.imshow(img_f[:,:, ::-1])
plt.axis("off")
plt.title(img_)
5.2 模型训练
在 ppcls/configs/PULC/person_attribute/PPLCNet_x1_0.yaml 中提供了基于该场景的训练配置,可以通过如下脚本启动训练:
%cd /home/aistudio/PaddleClas/
!python tools/train.py -c ./ppcls/configs/PULC/person_attribute/PPLCNet_x1_0.yaml
上面为单卡训练的脚本,paddleclas同时支持多卡训练,如下:
!export CUDA_VISIBLE_DEVICES=0,1,2,3
!python -m paddle.distributed.launch \
--gpus="0,1,2,3" \
tools/train.py \
-c ./ppcls/configs/PULC/person_attribute/PPLCNet_x1_0.yaml
5.3 模型评估
训练完成后,默认情况下模型保存在output/PPLCNet_x1_0目录中。在该目录下,保存了训练过程中效果最好的模型best_model和最后一次迭代更新权重后的模型model_final。我们可以通过运行tools/eval.py对模型指标的评估来得到模型的精度,以确认训练的效果。评估可以参考以下命令执行。
注意,评估时在模型的选择上,我们即可以选择我们训练得到的模型,也可以使用飞桨官方提供的预训练模型。一般飞桨官方提供的模型都经过了大量的优化,效果较好,推荐使用。如希望使用自己训练的模型,请对应将weights=后的值更改为对应模型.pdparams文件的存储路径即可。这里我们使用官方提供的模型,该模型PPLCNet_x1_0_person_attribute_945_pretrained.pdparams已经下载放在work目录下,拷贝一份放到PaddleClas/out目录下使用
!cp /home/aistudio/work/PPLCNet_x1_0_person_attribute_945_pretrained.pdparams /home/aistudio/PaddleClas/output/
%cd /home/aistudio/PaddleClas/
!python tools/eval.py \
-c ./ppcls/configs/PULC/person_attribute/PPLCNet_x1_0.yaml \
-o Global.pretrained_model=output/PPLCNet_x1_0_person_attribute_945_pretrained
因为属性识别本质是一个分类任务,从模型评估的结果可以看到模型的精度召回F1 score等指标信息
5.4 模型预测
模型训练完成之后,使用套件内的tools/infer.py脚本即可进行预测。用户可以加载训练得到的预训练模型,或者使用paddle官方提供的训练好的预训练模型。用户只需要指定 -o Global.pretrained_model的路径即可。这里使用官方提供的预训练模型,效果较好。
配置文件中默认是对 deploy/images/PULC/person_attribute/090004.jpg 进行预测,也可以通过增加字段 -o Infer.infer_imgs=xxx 对其他图片预测。
此处我们将从本案例来客分析视频文件随机抽取一帧进行属性识别。图片位于/work目录下, 如下图所示:
# 使用模型进行预测
%cd /home/aistudio/PaddleClas/
!python tools/infer.py \
-c ./ppcls/configs/PULC/person_attribute/PPLCNet_x1_0.yaml \
-o Global.pretrained_model=output/PPLCNet_x1_0_person_attribute_945_pretrained \
-o Infer.infer_img=/home/work/attr_demo.PNG
模型预测的结果如下:[{‘attributes’: [‘Male’, ‘Age18-60’, ‘Back’, ‘Glasses: False’, ‘Hat: False’, ‘HoldObjectsInFront: False’, ‘Backpack’, ‘Upper: LongSleeve’, ‘Lower: Trousers’, ‘No boots’], ‘output’: [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1]}]
可以对照此和上图进行对比
5.5 模型导出
训练完成后在部署之前需要模型导出,获得用于推理部署的inference模型。在paddleclas的tools目录下的export.py脚本即可提供此功能,执行该脚本可以得到对应的 inference 模型。同样的在这里可以将pretrained_model替换为自己训练出来的预训练模型,只需将路径修改即可。
!python tools/export_model.py \
-c ./ppcls/configs/PULC/person_attribute/PPLCNet_x1_0.yaml \
-o Global.pretrained_model=output/PPLCNet_x1_0_person_attribute_945_pretrained \
-o Global.save_inference_dir=deploy/models/PPLCNet_x1_0_person_attribute_infer
# 执行完该脚本后会在 deploy/models/ 下生成 PPLCNet_x1_0_person_attribute_infer 文件夹,models 文件夹下应有如下文件结构:
!tree -L 2 /home/aistudio/PaddleClas/deploy/models/PPLCNet_x1_0_person_attribute_infer/
至此, 我们完成了行人属性模型从训练到模型导出的整个流程。
6. 多目标跟踪模型
1. 概述
多目标跟踪(Multiple Object Tracking简称MOT)顾名思义,是对连续视频画面中多个目标进行跟踪。其对象是视频,从视频的第一帧到最后一帧,里边有多个目标在不断运动。多目标跟踪的目的就是将每个目标和其他目标进行区分开来,具体方法是给每个目标分配一个TrackID,并记录他们的轨迹。因而, 可以认为跟踪的本质是关联视频前后帧中的同一物体(目标),这是目标跟踪和目标检测最大的区别。
由于大部分应用场景如交通控制、数字取证的视频监控、手势识别、自动驾驶等都涉及到多个目标的跟踪,因此多目标跟踪也是目前大家主要研究内容。
2. 常见MOT算法分类
目前基于目标检测的跟踪,即Tracking By Detecting,是主要的算法方案。该算法主要由两部分组成:Detection+Embedding。Detection部分即针对视频,检测出每一帧中的潜在目标。Embedding部分则将检出的目标分配和更新到已有的对应轨迹上(即ReID重识别任务)。根据这两部分实现的不同,又可以划分为SDE系列和JDE系列算法。
-
SDE(Separate Detection and Embedding): 这类算法完全分离Detection和Embedding两个环节,最具代表性的就是DeepSORT算法。这样的设计可以使系统无差别的适配各类检测器,可以针对两个部分分别调优,但由于流程上是串联的导致速度慢耗时较长,在构建实时MOT系统中面临较大挑战。
-
JDE(Joint Detection and Embedding)这类算法完是在一个共享神经网络中同时学习Detection和Embedding,使用一个多任务学习的思路设置损失函数。代表性的算法有JDE和FairMOT。这样的设计兼顾精度和速度,可以实现高精度的实时多目标跟踪。
PaddleDetection实现了这两个系列的3种多目标跟踪算法。
-
DeepSORT(Deep Cosine Metric Learning SORT) 扩展了原有的SORT(Simple Online and Realtime Tracking)算法,增加了一个CNN模型用于在检测器限定的人体部分图像中提取特征,在深度外观描述的基础上整合外观信息,将检出的目标分配和更新到已有的对应轨迹上即进行一个ReID重识别任务。DeepSORT所需的检测框可以由任意一个检测器来生成,然后读入保存的检测结果和视频图片即可进行跟踪预测。ReID模型此处选择PaddleClas提供的PCB+Pyramid ResNet101模型。
-
JDE(Joint Detection and Embedding)是在一个单一的共享神经网络中同时学习目标检测任务和embedding任务,并同时输出检测结果和对应的外观embedding匹配的算法。JDE原论文是基于Anchor Base的YOLOv3检测器新增加一个ReID分支学习embedding,训练过程被构建为一个多任务联合学习问题,兼顾精度和速度。
-
FairMOT以Anchor Free的CenterNet检测器为基础,克服了Anchor-Based的检测框架中anchor和特征不对齐问题,深浅层特征融合使得检测和ReID任务各自获得所需要的特征,并且使用低维度ReID特征,提出了一种由两个同质分支组成的简单baseline来预测像素级目标得分和ReID特征,实现了两个任务之间的公平性,并获得了更高水平的实时多目标跟踪精度。
更多资料可以参考:
下面我们以fairMOT为例, 来实现一个MOT模型的训练、评估、验证和导出的整体流程
6.1 环境和数据准备
多目标追踪模型使用PaddleDetection环境即可,此处只需要下载mot16数据集被按照要求进行格式化即可用于训练。
由于前面介绍目标检测模型时,已经部署好PaddleDetection的运行环境,下面重点介绍一下数据集的准备工作。对于MOT模型,此处我们使用MOT16这个数据集进行演示。
【MOT16数据集】MOT16数据集是用于衡量多目标跟踪方法标准的数据集,主要包含行人跟踪图片,专用于行人跟踪领域的评估。更多介绍参考:https://motchallenge.net/
# 网速不好可以自行下载上传,解压
%cd /home/aistudio/PaddleDetection/dataset/mot/
!wget https://bj.bcebos.com/v1/paddledet/data/mot/demo/MOT16.zip
!unzip MOT16.zip
# 准备成相应的格式,使用mot目录下的gen_labels_MOT.py脚本生成labels_with_ids
%cd /home/aistudio/PaddleDetection/dataset/mot/MOT16
!mkdir -p images
!mv ./train ./images
!mv ./test ./images
%cd /home/aistudio/PaddleDetection/dataset/mot
!python gen_labels_MOT.py
/home/aistudio/PaddleDetection/dataset/mot/MOT16
/home/aistudio/PaddleDetection/dataset/mot
# 生成mot16.train文件并且复制到 image_lists下面
%cd /home/aistudio/PaddleDetection/dataset/mot
import glob
import os.path as osp
image_list = []
for seq in sorted(glob.glob('/home/aistudio/PaddleDetection/dataset/mot/MOT16/images/train/*')):
for image in glob.glob(osp.join(seq, "img1")+'/*.jpg'):
# image = image.replace('PaddleDetection/dataset/mot/','')
image_list.append(image)
with open('mot16.train','w') as image_list_file:
image_list_file.write(str.join('\n',image_list))
!mkdir -p /home/aistudio/PaddleDetection/dataset/mot/image_lists
!cp -r /home/aistudio/PaddleDetection/dataset/mot/mot16.train /home/aistudio/PaddleDetection/dataset/mot/image_lists
/home/aistudio/PaddleDetection/dataset/mot
整理之前:
MOT16
└——————train
└——————test
整理之后:
MOT16
|——————images
| └——————train
| └——————test
└——————labels_with_ids
└——————train
详细参考MOT数据准备文档
当用户想用自己的数据进行训练时也需要整理成此格式
# 查看用于训练的mot16.train的文件内容
%cd /home/aistudio/PaddleDetection/dataset/mot
!head -n 5 mot16.train
/home/aistudio/PaddleDetection/dataset/mot
/home/aistudio/PaddleDetection/dataset/mot/MOT16/images/train/MOT16-02/img1/000108.jpg
/home/aistudio/PaddleDetection/dataset/mot/MOT16/images/train/MOT16-02/img1/000309.jpg
/home/aistudio/PaddleDetection/dataset/mot/MOT16/images/train/MOT16-02/img1/000405.jpg
/home/aistudio/PaddleDetection/dataset/mot/MOT16/images/train/MOT16-02/img1/000571.jpg
/home/aistudio/PaddleDetection/dataset/mot/MOT16/images/train/MOT16-02/img1/000376.jpg
注意: 上面mot16.train文件中记录的img的目录位置一定要和实际的一致,不然无法进行下面的训练
# 也可以使用tree命令查看mot16的目录结构
!tree -L 4 /home/aistudio/PaddleDetection/dataset/mot/MOT16
/home/aistudio/PaddleDetection/dataset/mot/MOT16
├── images
│ ├── test
│ │ └── MOT16-01
│ │ ├── det
│ │ ├── img1
│ │ └── seqinfo.ini
│ └── train
│ └── MOT16-02
│ ├── det
│ ├── gt
│ ├── img1
│ └── seqinfo.ini
└── labels_with_ids
└── train
└── MOT16-02
└── img1
14 directories, 2 files
至此, 完成了数据集的准备工作,下面开启训练。
6.2 模型训练
# 修改相应的配置文件,
# 将下面的配置信息添加在PaddleDetection/configs/mot/fairmot/fairmot_dla34_30e_1088x608.yml文件最后
'''
# for MOT training
TrainDataset:
!MOTDataSet
dataset_dir: dataset/mot
image_lists: ['mot16.train']
data_fields: ['image', 'gt_bbox', 'gt_class', 'gt_ide']
# for MOT evaluation
# If you want to change the MOT evaluation dataset, please modify 'data_root'
EvalMOTDataset:
!MOTImageFolder
dataset_dir: dataset/mot
data_root: MOT16/images/train
keep_ori_im: False # set True if save visualization images or video, or used in DeepSORT
# for MOT video inference
TestMOTDataset:
!MOTImageFolder
dataset_dir: dataset/mot
keep_ori_im: True # set True if save visualization images or video
'''
# 单卡训练
%cd /home/aistudio/PaddleDetection/
!python tools/train.py -c configs/mot/fairmot/fairmot_dla34_30e_1088x608.yml
# 多卡训练
%cd /home/aistudio/PaddleDetection/
!python -m paddle.distributed.launch --log_dir=./fairmot_dla34_30e_1088x608/ --gpus 0 tools/train.py -c configs/mot/fairmot/fairmot_dla34_30e_1088x608.yml
训练结束后,训练过程中保存的模型位于./output/fairmot_dla34_30e_1088x608目录下,这些模型可以用于模型评估
6.3 模型评估
使用tools/eval_mot.py 脚本进行评估
在这里为了方便,我们下载训练好的模型进行评估 , 下载地址:https://paddledet.bj.bcebos.com/models/mot/fairmot_dla34_30e_1088x608.pdparams
%cd /home/aistudio/PaddleDetection/output/
!wget https://bj.bcebos.com/v1/paddledet/models/mot/fairmot_dla34_30e_1088x608.pdparams
%cd ../
!python tools/eval_mot.py -c configs/mot/fairmot/fairmot_dla34_30e_1088x608.yml \
-o weights=output/fairmot_dla34_30e_1088x608.pdparams
在MOT的模型评估指标中,重点关注MOTA和MOTP。 这两个指标共同衡量算法连续跟踪目标的能力(即,在连续帧中能准确判断目标的个数,精确的划定其位置,从而实现不间断的连续跟踪)
- MOTA, 即multiple object tracking accuracy, 多目标跟踪准确度,体现在确定目标的个数,以及有关目标的相关属性方面的准确度,用于统计在跟踪中的误差累积情况,包含FP、FN、ID
- MOTP(multiple object tracking precision),多目标跟踪精确度,用于衡量目标位置确定的精确程度
6.4 模型预测
这里我们使用使用下载好的模型进行预测,我们使用来客分析的其中一个视频作为demo。 预测的输出有可视化视频和txt文件。
默认情况下:
- 输出视频保存在output/mot_outputs/目录下
- txt文件结果保存在output/mot_results/*.txt文件中输出格式表示为frame_id, id, bbox_left, bbox_top, bbox_width, bbox_height, score, x, y, z
%cd /home/aistudio/PaddleDetection
!python tools/infer_mot.py -c configs/mot/fairmot/fairmot_dla34_30e_1088x608.yml \
-o weights=output/fairmot_dla34_30e_1088x608.pdparams --video_file=../work/来客分析/来客分析1.mp4 --save_videos
预测的结果视频如下:
可以看到视频中出现的来客都可以正确的追踪到
6.5 模型导出
和其他模型一样, 使用tools/export_model.py脚本进行模型导出
%cd /home/aistudio/PaddleDetection
!python tools/export_model.py -c configs/mot/fairmot/fairmot_dla34_30e_1088x608.yml \
-o weights=https://paddledet.bj.bcebos.com/models/mot/fairmot_dla34_30e_1088x608.pdparams
# 导出后的目录结构如下:
!tree /home/aistudio/PaddleDetection/output_inference/fairmot_dla34_30e_1088x608
/home/aistudio/PaddleDetection/output_inference/fairmot_dla34_30e_1088x608
├── infer_cfg.yml
├── model.pdiparams
├── model.pdiparams.info
└── model.pdmodel
0 directories, 4 files
上面的脚本是使用paddle官方训练好的模型进行导出,如果要使用自己训练的模型,只需要weights=更换为自己训练的模型即可,
例如: -o weights=output/fairmot_dla34_30e_1088x608/model_final.pdparams
以上,我们即完成了一个多目标追踪模型的训练-评估-测试和导出的真个流程。
7. 行人重识别(Person ReID)模型
行人重识别(Person Re-IDentification,简称Re-ID),也称行人再识别,是利用计算机视觉技术判断图像或者视频序列中是否存在特定行人的技术。
具体任务为:一个区域有多个摄像头拍摄视频序列,ReID的要求对一个摄像头下感兴趣的行人,检索到该行人在其他摄像头下出现的所有图片。
行人重识别技术可与行人检测/行人跟踪技术相结合,广泛应用于智能视频监控、智能安保、无人超市等领域。
下面就使用PaddleClas来介绍如何完成一个行人重识别模型的训练、评估、测试等步骤。
7.1 环境和数据准备
7.1.1 环境准备
开发环境使用PaddleClas,在前面的章节中已经下载好了。如果没有下载参考第5部分属性识别模型下载安装PaddleClas即可
7.1.2 数据准备
行人Reid最常用的是Market-1501数据集, 该数据集是在清华大学校园中采集,在2015 年构建并公开。它包括由6个摄像头(其中5个高清摄像头和1个低清摄像头)拍摄到的 1501 个行人、32668 个检测到的行人矩形框。每个行人至少由2个摄像头捕获到,并且在一个摄像头中可能具有多张图像。
训练集有 751 人,包含 12,936 张图像,平均每个人有 17.2 张训练数据;测试集有 750 人,包含 19,732 张图像,平均每个人有 26.3 张测试数据。3368 张查询图像的行人检测矩形框是人工绘制的,而 gallery 中的行人检测矩形框则是使用DPM检测器检测得到的。
数据集的目录结构如下:
数据集中的各个文件夹包含的文件内容如下:
- bounding_box_test: 用于测试集的750 人,包含 19,732 张图像。文件名前缀为0000的表示在提取这 750 人的过程中DPM检测错的图(可能与query是同一个人),-1 表示检测出来其他人的图(不在这 750 人中)
- bounding_box_train:用于训练集的751人,包含 12,936 张图像
- query : 750人在每个摄像头中随机选择一张图像作为query,因此一个人的query最多有6个,共有3,368 张图像
- gt_query:matlab格式,用于判断一个query的哪些图片是好的匹配(同一个人不同摄像头的图像)和不好的匹配(同一个人同一个摄像头的图像或非同一个人的图像)
- gt_bbox: 手工标注的bounding box,用于判断DPM检测的bounding box是不是一个好的box
图片的命名规则,以 0001_c1s1_000151_01.jpg 为例:
- 0001 表示每个人的标签编号,从0001到1501
- c1 表示第一个摄像头(camera1),共有6个摄像头
- s1 表示第一个录像片段(sequece1),每个摄像机都有数个录像段
- 000151 表示 c1s1 的第000151帧图片,视频帧率25fps
- 01 表示 c1s1_001051 这一帧上的第1个检测框,由于采用DPM检测器,对于每一帧上的行人可能会框出好几个bbox。00 表示手工标注框
该项目已经挂载了Market1501数据集, 位于data/data163012/目录中,使用时解压到PaddleClas/dataset/目录下
# 将Market-1501-v15.09.15.zip数据集解压到PaddleClas/dataset/market1501目录下
!unzip /home/aistudio/data/data163012/Market-1501-v15.09.15.zip -d /home/aistudio/PaddleClas/dataset/market1501
7.2 模型训练
和训练一个图像识别模型一样,使用tools/train.py来启动训练,同时指定配置文件。为了加快训练速度,可以设置较大的batch size, 实测在Tesla V100 32G 环境下bs=480可以完成训练。
另外,配置文件按照数据集的配置作如下更改:
# 在此处,使用/ppcls/configs/reid/strong_baseline/softmax_triplet_with_center.yaml作为训练的配置文件,同时按照数据集做如下修改:
"""
Head:
name: "FC"
embedding_size: *feat_dim
class_num: &class_num 751 #行人id总数量
DataLoader:
Train:
dataset:
name: "Market1501"
image_root: "./dataset/" #训练图片根路径
cls_label_path: "bounding_box_train" #训练文件列表
Eval:
Query:
dataset:
name: "Market1501"
image_root: "./dataset/" #评估图片根路径
cls_label_path: "query" #评估文件列表
"""
'\n\nHead:\n name: "FC"\n embedding_size: *feat_dim\n class_num: &class_num 751 #行人id总数量\n\nDataLoader:\n Train:\n dataset:\n name: "Market1501"\n image_root: "./dataset/" #训练图片根路径\n cls_label_path: "bounding_box_train" #训练文件列表\n\n\n Eval:\n Query:\n dataset:\n name: "Market1501"\n image_root: "./dataset/" #评估图片根路径\n cls_label_path: "query" #评估文件列表\n \n'
使用tools/train开启一键训练
%cd /home/aistudio/PaddleClas
!python tools/train.py \
-c ./ppcls/configs/reid/strong_baseline/softmax_triplet_with_center.yaml
以上为单卡训练脚本,也可以使用多卡训练,脚本如下:
%cd /home/aistudio/PaddleClas
!export CUDA_VISIBLE_DEVICES=0,1,2,3
!python -m paddle.distributed.launch \
--gpus="0,1,2,3" \
tools/train.py \
-c ./ppcls/configs/reid/strong_baseline/softmax_triplet_with_center.yaml
7.3 模型评估
模型评估使用tools/eval脚本,通过验证集对模型的精度等指标进行评估
%cd /home/aistudio/PaddleClas
#单卡评估
!python tools/eval.py \
-c ./ppcls/configs/reid/strong_baseline/softmax_triplet_with_center.yaml \
-o Global.pretrained_model=./output/RecModel/best_model
行人重识别本质上是一个分类模型,所以和分类模型类似,在评估的结果中可以看到模型的召回,精度等指标
7.4 模型导出
使用下述命令将训练好的模型导出为预测部署模型。
%cd /home/aistudio/PaddleClas
!python tools/export_model.py \
-c ./ppcls/configs/reid/strong_baseline/softmax_triplet_with_center.yaml \
-o Global.pretrained_model=./output/RecModel/best_model \
-o Global.save_inference_dir=deploy/models/RecModel
注意: 若要将导出的模型用于pphuman, 同时需要下载infer_cfg.yml文件到新导出的模型文件夹’strong_baseline_inference’中, 导出完成后的模型文件结果如下:
%cd /home/aistudio/PaddleClas
!tree -L 2 deploy/models/RecModel
/home/aistudio/PaddleClas
deploy/models/RecModel
├── inference.pdiparams
├── inference.pdiparams.info
└── inference.pdmodel
0 directories, 3 files
8. 单镜和跨镜下的来客属性分析
以上,我们介绍了目标检测、属性识别以及多目标追踪模型。我们将目标检测模型、目标追踪和属性识别模型组成PP-Human中的pipeline即可完成来客属性识别。
这里我们使用已经训练好的模型来体验开箱即用的效果。将各个模型下载解压后即可使用,体验PP-Human设计上的简洁与高效。具体参考下面的流程。
8.1 模型准备
在来客属性分析中,因为要使用到跨镜视频分析, 除了用于目标检测和多目标追踪以及行人属性分析模型外,还需要ReID模型用于跨镜分析,匹配多个视频中的同一个ID。首先我们将这些模型下载后解压备用。单镜和跨镜使用到的模型如下:
- 单镜: 目标检测、多目标追踪、属性识别
- 跨镜: 目标检测、多目标追踪、属性识别、 ReID
# 在paddleDetection跟目录下完成
%cd /home/aistudio/PaddleDetection/
!mkdir output_inference/
%cd output_inference/
#下载多目标追踪和检测模型:mot_ppyoloe
!wget https://bj.bcebos.com/v1/paddledet/models/pipeline/mot_ppyoloe_l_36e_pipeline.zip
# 下载属性识别模型:PPLCNet_x1_0
!wget https://bj.bcebos.com/v1/paddledet/models/pipeline/PPLCNet_x1_0_person_attribute_945_infer.tar
# 下载ReID模型:ReID
!wget https://bj.bcebos.com/v1/paddledet/models/pipeline/reid_model.zip
# 解压模型
!unzip mot_ppyoloe_l_36e_pipeline.zip
!tar -xf PPLCNet_x1_0_person_attribute_945_infer.tar
!unzip reid_model.zip
8.2 配置文件说明
PP-Human相关配置位于deploy/pphuman/config/infer_cfg.yml
中,存放模型路径,完成不同功能需要设置不同的任务类型。
功能及任务类型对应表单如下:
输入类型 | 功能 | 任务类型 | 配置项 |
---|---|---|---|
图片 | 属性识别 | 目标检测 属性识别 | DET ATTR |
单镜头视频 | 属性识别 | 多目标跟踪 属性识别 | MOT ATTR |
单镜头视频 | 行为识别 | 多目标跟踪 关键点检测 行为识别 | MOT KPT ACTION |
本次项目不需要修改配置文件信息,可通过模型预测时的参数选择对应任务。
8.3 模型预测
选取单镜头和跨境头视频样本进行属性识别
模型预测参数选择分为两部分:
-
- 功能选择:将对应参数设置为True
- 属性识别:enable_attr
- 行为识别:enable_action
-
- 模型路径修改:设置对应任务(DET, MOT, ATTR, KPT, ACTION)的模型路径,例如设置目标检测和属性识别模型路径:“–model_dir det=output_inference/mot_ppyoloe_l_36e_pipeline/ attr=output_inference/strongbaseline_r50_30e_pa100k/”
8.3.1 单镜头下的来客属性识别及可视化输出
# 为了能顺利运行,需要将解压后的output_inference/PPLCNet_x1_0_person_attribute_945_infer/目录下的模型文件名中的inference修改成model
%cd /home/aistudio/PaddleDetection/output_inference/PPLCNet_x1_0_person_attribute_945_infer
!rename 's/inference/model/' inferen*.*
/home/aistudio/PaddleDetection/output_inference/PPLCNet_x1_0_person_attribute_945_infer
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = "en.UTF-8",
LC_ALL = (unset),
LC_CTYPE = "C.UTF-8",
LANG = "en.UTF-8"
are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
# 另外由于PaddleDetection的版本和PPLCNet的适配问题,本案例下需要将deploy/python/infer.py中159行代码做如下修改:
"""
# 源代码:
for i in range(len(input_names)):
input_tensor = self.predictor.get_input_handle(input_names[i])
input_tensor.copy_from_cpu(inputs[input_names[i]])
# 修改为:
for i in range(len(input_names)):
input_tensor = self.predictor.get_input_handle(input_names[i])
if input_names[i] == 'x':
input_tensor.copy_from_cpu(inputs['image'])
else:
input_tensor.copy_from_cpu(inputs[input_names[i]])
"""
完成准备工作后,使用deploy/pphuman/pipeline.py脚本开始属性识别。
%cd /home/aistudio/PaddleDetection/
!python deploy/pphuman/pipeline.py \
--config deploy/pphuman/config/infer_cfg.yml \
--model_dir mot=output_inference/mot_ppyoloe_l_36e_pipeline/ attr=output_inference/PPLCNet_x1_0_person_attribute_945_infer/ \
--video_file=/home/aistudio/work/来客分析/来客分析1.mp4 \
--enable_attr=True \
--device=gpu
推理完成后,结果在output文件夹中,下面是其结果展示。读者可以对照着上传自己的视频进行分析。
**注意:**如果属性可视化中的字体出现重叠情况时,可以修改源码中的字体间距line_inter参数,该参数位于PaddleDetection/deploy/python/visualize.py脚本中的visualize_attr方法中。
8.3.2 来客分析跨境预测及属性可视化
对于多镜头的跨境分析,要求输入的多个视频放在同一目录下,同时,在配置文件中加入ReID模型配置。
跨镜头跟踪任务,是在单镜头跟踪的基础上,实现不同摄像头中人员的身份匹配关联。
另外由于跨境可视化的代码尚未合入到paddledetection中,这里需要读者将实现跨境属性可视化部分的代码手动添加到文件中,这里为了方便,可以直接使用/home/aistudio/mtmct/下面的文件替换,所涉及的文件有:
- deploy/pphuman/mtmct.py:
该文件添加了跨境下每一帧属性可视化的逻辑 - deploy/python/visualize.py:
该文件添加了具体属性可视化的实现
# 跨境属性可视化代码修改, 将mtmct目录下的两个文件覆盖Paddledetection目录下的文件即可
!cp /home/aistudio/mtmct/mtmct.py /home/aistudio/PaddleDetection/deploy/pphuman/
!cp /home/aistudio/mtmct/visualize.py /home/aistudio/PaddleDetection/deploy/python/
%cd /home/aistudio/PaddleDetection/
!python deploy/pphuman/pipeline.py \
--config deploy/pphuman/config/infer_cfg.yml \
--video_dir=/home/aistudio/work/来客mtmct \
--device=gpu \
--enable_attr=True \
--model_dir mot=output_inference/mot_ppyoloe_l_36e_pipeline/ attr=output_inference/PPLCNet_x1_0_person_attribute_945_infer/ reid=output_inference/reid_model
结果如下:
镜头1:
镜头2:
在跨镜视频中,我们可以看到两个视频中,相似度非常高的对象(ID:3)会赋予同一个ID, 这就是ReID模型通过计算得到的结果。
以上,我们介绍了目标检测、多目标追踪以及属性识别等模型,并通过使用PP-Human提供的pipeline组建这些模型完成一个典型来客属性分析功能
9. 关键点检测
PaddleDetection 关键点检测能力紧跟业内最新最优算法方案,包含Top-Down、Bottom-Up两套方案,Top-Down先检测主体,再检测局部关键点,优点是精度较高,缺点是速度会随着检测对象的个数增加,Bottom-Up先检测关键点再组合到对应的部位上,优点是速度快,与检测对象个数无关,缺点是精度较低。
更多资料参考:https://github.com/PaddlePaddle/PaddleDetection/tree/release/2.4/configs/keypoint
下面以hrnet为例介绍关键点检测模型的训练评估预测等流程。
9.1 数据和环境准备
使用PaddleDetection的运行环境即可完成关键点检测模型的训练预测等。这里我们只需要准备数据集即可。
目前关键点KeyPoint模型支持COCO数据集和MPII数据集,数据集的准备方式请参考关键点数据准备。关于config配置文件内容说明请参考关键点配置文件说明。
这里为了让读者体验完整的训练流程,我们准备了一个小批量的数据集进行训练,按照下面的方式下载解压即可。
# 下载并解压准备的样例训练数据
%cd /home/aistudio/PaddleDetection/
!wget https://bj.bcebos.com/v1/paddledet/data/keypoint/coco_val_person_mini.tar
!tar -xf coco_val_person_mini.tar -C ./dataset/
!mv ./dataset/coco_val_person_mini/* ./dataset/coco
!cp ./dataset/coco/annotations/instances_train2017.json ./dataset/coco/annotations/person_keypoints_train2017.json
!cp ./dataset/coco/annotations/instances_val2017.json ./dataset/coco/annotations/person_keypoints_val2017.json
/home/aistudio/PaddleDetection
--2022-08-04 08:56:27-- https://bj.bcebos.com/v1/paddledet/data/keypoint/coco_val_person_mini.tar
Resolving bj.bcebos.com (bj.bcebos.com)... 182.61.200.229, 182.61.200.195, 2409:8c04:1001:1002:0:ff:b001:368a
Connecting to bj.bcebos.com (bj.bcebos.com)|182.61.200.229|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 488376320 (466M) [application/x-tar]
Saving to: 'coco_val_person_mini.tar'
coco_val_person_min 100%[===================>] 465.75M 52.4MB/s in 12s
2022-08-04 08:56:39 (37.3 MB/s) - 'coco_val_person_mini.tar' saved [488376320/488376320]
9.2 模型训练
训练模型可以按照下面的命令执行。由于完整COCO数据集的训练耗时较长,这里使用上面准备的样例数据集,供执行流程参考使用。
模型训练同样支持单卡和多卡训练, 脚本如下:
# 单卡训练
%cd /home/aistudio/PaddleDetection/
!python tools/train.py -c configs/keypoint/hrnet/dark_hrnet_w32_256x192.yml
# 多卡训练, 脚本如下:
#COCO DataSet
CUDA_VISIBLE_DEVICES=0,1,2,3
!python -m paddle.distributed.launch tools/train.py \
-c configs/keypoint/higherhrnet/higherhrnet_hrnet_w32_512.yml
#MPII DataSet
CUDA_VISIBLE_DEVICES=0,1,2,3
!python -m paddle.distributed.launch tools/train.py \
-c configs/keypoint/hrnet/hrnet_w32_256x256_mpii.yml
完成训练后,我们的模型默认保存在output/dark_hrnet_w32_256x192/目录下。
9.3 模型评估
在训练模型以后,我们可以通过运行评估命令来得到模型的精度,以确认训练的效果。评估可以参考以下命令执行。
这里使用了我们已经训练好的模型。如希望使用自己训练的模型,请对应将weights=后的值更改为对应模型.pdparams文件的存储路径。
%cd /home/aistudio/PaddleDetection/
!python tools/eval.py -c configs/keypoint/hrnet/dark_hrnet_w32_256x192.yml \
-o weights=https://paddledet.bj.bcebos.com/models/keypoint/dark_hrnet_w32_256x192.pdparams \
在上面的评估结果中,可以看到在不同IOU阈值下的AP(平均精度)和AR(召回)等评估指标。
9.4 模型预测
执行tools/infer.py即可开启预测。需要注意目前top-down模型只支持单人截图预测,如需使用多人图,请使用[联合部署推理]方式。或者使用bottom-up模型。
此处使用来客分析demo视频中抽取其中一帧来演示预测效果,该图片位于work目录下。
%cd /home/aistudio/PaddleDetection/
!python tools/infer.py -c configs/keypoint/hrnet/dark_hrnet_w32_256x192.yml \
-o weights=https://paddledet.bj.bcebos.com/models/keypoint/dark_hrnet_w32_256x192.pdparams \
--infer_img=../work/kp.PNG \
--draw_threshold=0.5
结果如下图:
9.5 模型导出
模型训练结束后通过评估,如果精度达到部署要求,此时还需要执行导出步骤。在部署时,需要使用导出的模型。
导出步骤可以参考下面列举的步骤:
注意,这里使用了我们已经训练好的模型。如希望使用自己训练的模型,请对应将weights=后的值更改为对应模型.pdparams文件的存储路径。如果没有指定–output_dir,那么导出的模型将默认存储在output_inference/路径下。
%cd /home/aistudio/PaddleDetection/
!python tools/export_model.py -c configs/keypoint/hrnet/dark_hrnet_w32_256x192.yml \
--output_dir inference_models/ \
-o weights=https://paddledet.bj.bcebos.com/models/keypoint/dark_hrnet_w32_256x192.pdparams
# 查看导出后的模型文件结构
!tree -L 2 inference_models/dark_hrnet_w32_256x192
至此,我们就完成了关键点模型的从训练到导出的过程。可以用于PPhuman的实际部署中了。
10. 行为识别模型
PP-Human中集成了基于骨骼点的行为识别模块,其行为识别模型使用的是时空图卷积网络模型ST-GCN,并在PaddleVideo训练流程的基础上修改适配,完成模型训练。以下介绍如何使用PaddleVedio来完成行为识别模型的训练评估预测等流程。
ST-GCN是一个基于骨骼点坐标序列进行预测的模型,它通过将图卷积网络(GCN)和时间卷积网络(TCN)结合起来,扩展到时空图模型,设计出了用于行为识别的骨骼点序列通用表示,该模型将人体骨骼表示为图,其中图的每个节点对应于人体的一个关节点。图中存在两种类型的边,即符合关节的自然连接的空间边(spatial edge)和在连续的时间步骤中连接相同关节的时间边(temporal edge)。在此基础上构建多层的时空图卷积,它允许信息沿着空间和时间两个维度进行整合。
算法的整体框架如下:
下面详述整体模型的训练评估和预测流程
10.1 环境和数据准备
10.1.1 环境准备
- 需要下载PaddleVideo来构建模型
- 安装相应的依赖
# 从Github上下载PaddleVideo代码
# %cd /home/aistudio
# !git clone https://github.com/PaddlePaddle/PaddleVideo.git
# 若网速较慢,可使用如下方法下载
# !git clone https://hub.fastgit.org/PaddlePaddle/PaddleVideo.git
# 由于github上下载经常有问题,这里打包了一份PaddleVedio的源码,放在work目录下,可以直接解压出来使用
!tar -xvf /home/aistudio/work/PaddleVideo.tar -C /home/aistudio/
# 配置代码环境,安装相应的依赖包
%cd /home/aistudio/PaddleVideo
# !python -m pip install --upgrade pip
!pip install -r requirements.txt
10.1.2 训练数据准备
在PaddleVideo中,训练数据为采用.npy格式存储的Numpy数据,标签则可以是.npy或.pkl格式存储的文件。对于序列数据的维度要求为(N,C,T,V,M), 每个维度的含义和具体说明如下:
维度 | 大小 | 说明 |
---|---|---|
N | 不定 | 数据集序列个数 |
C | 2 | 关键点坐标维度,即(x, y) |
T | 50 | 动作序列的时序维度(即持续帧数) |
V | 17 | 每个人物关键点的个数,这里我们使用了COCO 数据集的定义,具体可见这里 |
M | 1 | 人物个数,这里我们每个动作序列只针对单人预测 |
将一段待标注的序列(一个动作片段,可以是视频或有顺序的图片集合)处理成进PaddleVedio可以训练使用的标注文件分为以下几个步骤:
- 获取序列的骨骼点坐标
- 统一序列的时序长度
- 使用脚本等工具将序列保存为PaddleVideo可用的文件格式
具体操作可以参考:https://github.com/PaddlePaddle/PaddleVideo/tree/develop/applications/PPHuman
为了让读者体验训练流程,教程提供一份基于UR Fall Detection Dataset的摔倒数据进行处理并融合其他场景摔倒和非摔倒的动作场景数据集用于模型训练测试等流程。数据集位于work目录下,使用时copy到PaddleVedio目录中。
# 将work目录下挂在的数据集解压到Paddlevedio/application/PPhuman/datasets 目录下
!unzip /home/aistudio/work/fall_data.zip -d /home/aistudio/PaddleVideo/applications/PPHuman/datasets/
# 查看数据集目录结构
!tree -L 2 /home/aistudio/PaddleVideo/applications/PPHuman/datasets
/home/aistudio/PaddleVideo/applications/PPHuman/datasets
├── __MACOSX
├── prepare_dataset.py
├── train_data.npy
├── train_label.pkl
├── val_data.npy
└── val_label.pkl
1 directory, 5 files
在上面的数据集中,.npy为numpy格式的数据文件,.pkl为对应的标注文件
10.2 模型训练
PaddleVideo 通过yaml配置文件的方式选择不同的算法和训练参数等,这里我们使用applications/PPHuman/configs/stgcn_pphuman.yaml配置文件完成ST-GCN模型算法训练。打开该配置文件中,我们可以得到网络模型、数据集信息、损失函数等模型的主要配置信息。
这里需要将数据路径等信息按照实际配置好即可进行训练,如下图:
修改配置文件完成后,使用main.py脚本开启训练。
# 由于整个任务可能过拟合,建议在训练过程中加入--validate同时开启验证以保存最佳模型
%cd /home/aistudio/PaddleVideo/
!python main.py --validate -c applications/PPHuman/configs/stgcn_pphuman.yaml
10.3 模型评估
上面在训练过程中加入–validate可以实现在训练过程中对模型进行评估,单但该结果不代表最终的测试分数,因此在训练完成之后可以用测试模式对最好的模型进行测试获取最终的指标。在训练完成后,采用以下命令进行评估,
并通过-c参数指定配置文件,通过-w指定权重存放路径进行模型测试。
这里使用paddle官方提供的训练好的模型进行评估,若用户想用自己训练的模型,只要将-w后的模型路径修改为自己的模型即可。
%cd /home/aistudio/PaddleVideo/
!python main.py --test -c applications/PPHuman/configs/stgcn_pphuman.yaml \
-w /home/aistudio/work/STGCN_best.pdparams
从评估的结果可以看到Top1和Top5的精度
10.4 模型导出
在PaddleVideo中,通过tools/export_model.py脚本命令实现模型的导出,得到模型结构文件STGCN.pdmodel和模型权重文件STGCN.pdiparams,并将加配置文件yml也拷贝到模型目录中:
%cd /home/aistudio/PaddleVideo/
!python tools/export_model.py -c applications/PPHuman/configs/stgcn_pphuman.yaml \
-p /home/aistudio/work/STGCN_best.pdparams \
-o output_inference/STGCN
!cp applications/PPHuman/configs/infer_cfg.yml output_inference/STGCN
# 重命名模型文件,适配PP-Human的调用
%cd output_inference/STGCN
!mv STGCN.pdiparams model.pdiparams
!mv STGCN.pdiparams.info model.pdiparams.info
!mv STGCN.pdmodel model.pdmodel
完成后的导出模型目录结构如下:
"""
STGCN
├── infer_cfg.yml
├── model.pdiparams
├── model.pdiparams.info
├── model.pdmodel
"""
至此, 完成了动作识别模型的训练和导出流程。可以使用导出后的模型用于PP-Human中的pipeline组建。
11. 来客异常行为预警
将以上的目标检测,关键点检测和动作识别模型组成pipeline即可完成来客异常行为预警,这里以摔倒为例,后续PP-Human会增加其他行为预警,如抽烟、打架等。行为预警的使用流程参考下面的操作。
11.1 模型准备
同上面的来客属性识别,这里各个模块的模型我们采用训练好的模型,将各个模型下载下来后保存到PaddleDetection/output_inference目录下即可。
#下载关键点模型
%cd /home/aistudio/PaddleDetection/output_inference/
!wget https://bj.bcebos.com/v1/paddledet/models/pipeline/dark_hrnet_w32_256x192.zip
#下载行为识别模型
!wget https://bj.bcebos.com/v1/paddledet/models/pipeline/STGCN.zip
# 解压模型
!unzip dark_hrnet_w32_256x192.zip
!unzip STGCN.zip
11.2 模型预测
本案例选取单镜头视频样本进行来客行为异常预警。
在模型路径需要设置对应的关键点检测KPT模型和行为识别模型ACTION的路径, 同时在模型预测参数选择部分将enable_action设置为True即可进行行为识别。
具体脚本如下:
#摔倒检测
%cd /home/aistudio/PaddleDetection/
!python deploy/pphuman/pipeline.py \
--config deploy/pphuman/config/infer_cfg.yml \
--model_dir mot=output_inference/mot_ppyoloe_l_36e_pipeline/ kpt=output_inference/dark_hrnet_w32_256x192/ action=output_inference/STGCN \
--video_file=/home/aistudio/work/摔倒2.mp4 \
--enable_action=True \
--device=gpu
检测的结果如下:
12. 总结
从这个项目中,我们可以深刻的体会到在Paddle深度学习框架和各类开发套件如PaddleDetection、PaddleClas等辅助下,我们可以快速高效的搭建出一个AI应用。
PaddlePaddle的各个开发套件提供了风格一致的训练、评估、预测以及模型导出等代码架构,极大的降低了熟悉和使用成本。使用这些套件以及官方提供的预训练模型在结合和我们自己的业务数据进行微调,我们可以高效的完成模型训练调优直接项目的部署上线。
这样在框架的辅助下,我们可以将大部分的精力放在业务的理解上,梳理业务的逻辑关系以及如何从业务提炼出具体的问题解决方法。将一个大的问题,转化了若干个独立的简单的单元,在组合完成整个问题的求解。比如行为识别中,首先要在一帧图片中识别出人,在将人的关键点提取出来,通过前后帧关键点的关系识别出动作。基于此,我们就可以将目标检测、关键点检测和多目标跟踪和动作识别这一系列模型串起来完成整个任务。这就是一个从具体任务中抽象出相应的业务逻辑和解决方案的过程。这也是AI开发者的核心能力。
此文章为搬运
原项目链接
更多推荐
所有评论(0)