最近有个动作识别项目,采用了mmaction2工具,在使用过程中有些步骤耗费了些时间,例如搭建环境、框架理解。我们的项目要求多视频帧图base64编码传入,涉及到如何改造成多视频帧图推理。比较入门,如果你也感兴趣,继续往下看
一、动作识别类型
先了解下动作识别有哪些?视频领域常见的任务有动作识别、时序动作检测、时空动作检测等。
- 动作识别 (action recognition) : 是对每个输入视频进行分类,识别出视频中人物做出的动作。即输入视频序列,得到视频对应的类别;
- 时序动作检测 (temporal action detection) :任务的输入是一个未经裁剪的视频 (untrimmed video),即在这个视频里有些帧是没有动作发生的,因此需要检测出动作开始和结束的区间,并判断区间内动作的类别。即输入未经裁剪的视频序列,得到动作出现的区间和对应的类别;
- 时空动作检测 (spatio-temporal action detection) :相比于时序动作检测略有不同,时空动作检测不仅需要识别动作出现的区间和对应的类别,还要在空间范围内用一个包围框 (bounding box)标记出人物的空间位置。
- 基于骨骼点的动作识别 (Skeleton-based Action Recognition) 旨在从一系列时间连续的人体骨骼点中识别正在执行的动作。相较于 RGB 帧或光流,人体骨骼这一模态与人体动作天然更密切,且更加紧凑
二、MMAction2介绍
github:https://github.com/open-mmlab/mmaction2
中文教程:https://mmaction2.readthedocs.io/zh-cn/latest/index.html
英文教程:https://mmaction2.readthedocs.io/zh-cn/latest/index.html
MMAction2 是一款基于 PyTorch 开发的行为识别开源工具包,是 open-mmlab 项目的一个子项目。
- 模块化设计: 我们将视频理解框架拆分成了不同模块,用户可以很方便地通过组合不同的模块来构建出自定义的视频理解框架。
- 支持五种主要的视频理解任务: MMAction2 为视频理解任务实现了多种多样的算法,包括行为识别,时序动作定位,时空动作检测,基于骨骼点的行为识别,以及视频检索。
- 详尽的单元测试和文档:我们提供了详尽的文档和 API 参考手册,以及单元测试
三、支持的模型库
so many!下面会以TSN动作识别模型为例
四、环境搭建
查看github上的介绍,执行mmaction2需要安装openmim、mmcv、mmengine等包,有时候Linux上的conda虚拟环境有点问题,这几个包都装不上,实在是很难解决。后面发现源码给出了Dockerfile,在docker目录里面,便尝试用镜像的方式搭建环境。
创建镜像就容易了,这里简单说明下
# 下载源码,进入docker目录
cd docker
docker build -t mmaction2 .
镜像的创建过程中,在apt-get update这一步,显示的报错 GPG error: NO_PUBKEY xxx,在Dockerfile加上这句就可以解决,将下面这个命令放到apt-get update的上一步,并把编码改成你报错显示的编码
RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 报错的编码
五、动作识别推理
我用/bin/bash的方法将镜像启动,参考readme命令,测试TSN模型
# 启动镜像
docker run -it --gpus all mmaction2 /bin/bash
# 下载配置文件和权重文件
mim download mmaction2 --config tsn_imagenet-pretrained-r50_8xb32-1x1x8-100e_kinetics400-rgb --dest .
# 测试源码中demo.mp4视频,使用Kinetics-400的标签文件
python demo/demo.py tsn_imagenet-pretrained-r50_8xb32-1x1x8-100e_kinetics400-rgb.py \
tsn_imagenet-pretrained-r50_8xb32-1x1x8-100e_kinetics400-rgb_20220906-2692d16c.pth \
demo/demo.mp4 tools/data/kinetics/label_map_k400.txt
推理命令解析:
- demo/demo.py:测试脚本
- tsn_imagenet-pretrained-r50_8xb32-1x1x8-100e_kinetics400-rgb.py:TSN模型配置文件
- tsn_imagenet-xx_kinetics400-rgb_20220906-2692d16c.pth:模型权重
- demo/demo.mp4:测试视频
- tools/data/kinetics/label_map_k400.txt:标签label
测试的视频截图:
测试结果返回TOP5的结果:第一名是掰手腕,识别正确
六、视频帧图推理
上面用了视频文件进行推理,但是实际项目要求图片传入,查询发现mmaction2是支持图片推理,但是使用的版本不同。
- 目前新版本1.x没有参数–use-frames,旧版本才有,选用版本v0.24.1
- 在github找到对应的旧版本,环境搭建方法和上面雷同
- 推理图片有命名要求,固定格式,img_00001.jpg、img_00002.jpg…
执行命令如下:
python demo/demo.py configs/recognition/tsn/tsn_r50_video_inference_1x1x3_100e_kinetics400_rgb.py \
checkpoints/tsn_r50_1x1x3_100e_kinetics400_rgb_20200614-e508be42.pth \
test_data/frame_3/ tools/data/kinetics/label_map_k400.txt --use-frames
可以发现比上面的视频推理多了–use-frames参数
七、总结
如果文章对您有所帮助,记得点赞、收藏、评论探讨✌️