前言
在智能视频分析领域,动作识别是核心感知技术之一,能够让端侧设备自动理解视频中的人体行为与事件语义。C3D 作为 3D 卷积神经网络的开山之作,凭借简洁高效的时空特征提取能力,成为工业界落地最广泛的视频动作识别基础算法之一。
随着边缘计算的普及,将 AI 模型部署在端侧设备上实现本地实时推理、数据不出域,成为安防、工业、养老等场景的刚性需求。本文将从算法核心原理出发,基于算能官方sophon-demo开源例程,完整讲解如何将 C3D 模型部署到土星云 SE110S 边缘计算设备上,覆盖模型编译、Python 推理开发、精度与性能验证全流程。本次部署适配土星云旗下三款主流机型:SE110S-WA32、SE110S-WB16、SE110S-WC08,可根据实际算力需求灵活选型。
一、C3D 算法核心原理
1.1 3D 卷积:时空联合特征提取
传统 2D 卷积仅能在图像的宽、高两个维度提取空间特征,无法捕捉视频序列中的时序运动信息。C3D 首次将卷积核扩展到时间维度,使用 3D 卷积核同时对视频的空间(H、W)和时间(T)维度进行特征提取,从而直接学习到视频中的运动变化特征。
一个标准 3D 卷积核尺寸为 d×k×k,其中d为时间深度,k为空间卷积核大小。对于输入尺寸为 T×H×W×C 的视频片段,经过 3D 卷积后,时间、高度、宽度三个维度会同步被压缩,同时输出多通道时空特征图。
1.2 网络结构设计
C3D 整体沿用 VGG16 的分层设计思路,将所有 2D 卷积替换为 3D 卷积,结构简洁规整:
- 输入:16 帧连续视频片段,每帧尺寸为 112×112,输入 shape 为 (N, 3, 16, 112, 112)(批次、通道、时间、高度、宽度);
- 卷积层:共 8 个 3D 卷积层,卷积核统一为 3×3×3,步长 1×1×1;
- 池化层:共 5 个 3D 最大池化层,前两个池化核为 1×2×2(仅压缩空间维度),后续为 2×2×2,避免时间维度过早丢失信息;
- 分类头:2 个全连接层,最终输出分类概率,对应 UCF101 数据集的 101 个动作类别;
1.3 算法落地优势
- 通用性强:跨场景泛化能力优秀,可作为通用视频特征提取 backbone
- 计算高效:网络结构简单、参数量适中,非常适合边缘端低算力设备部署
- 延迟可控:固定 16 帧滑动窗口输入,推理延迟稳定,能够满足实时视频分析要求
二、典型应用场景
C3D 算法凭借成熟稳定的表现,在多个边缘落地场景中广泛应用:
- 智能安防:园区、小区异常行为检测,识别打架、跌倒、翻越围墙等事件
- 智慧工业:生产线工人操作规范检测,识别未佩戴安全帽、违规操作等行为
- 智慧体育:健身动作矫正、体育运动动作分类与计数
- 智慧养老:独居老人跌倒检测、日常行为活动监测
- 人机交互:基于手势动作的非接触式人机交互控制
三、土星云 SE110S 边缘设备适配优势
本次部署针对土星云旗下三款边缘计算设备进行全量适配,三款机型覆盖不同算力档位,均搭载算能自研 TPU 处理器,专为端侧 AI 推理深度优化:
设备型号 | 搭载芯片 | INT8 峰值算力 | 核心定位 |
SE110S-WA32 | BM1684X | 32TOPS | 高性能多路视频分析,适合中大型边缘节点 |
SE110S-WB16 | BM1688 | 16TOPS | 性能与功耗均衡,通用边缘场景首选 |
SE110S-WC08 | CV186X | 8TOPS | 低功耗轻量化部署,适合前端端侧节点 |
三款设备共同具备以下落地优势:
- 多精度原生支持:全面支持 FP32、FP16、INT8 精度推理,量化后性能提升显著,精度损失极小
- 硬件全链路加速:内置专用视频硬件解码单元,配合 BMCV 硬件预处理,大幅降低 CPU 占用,实现端到端低延迟
- 低功耗高算力:整机典型功耗仅十几瓦,即可实现多路视频实时动作识别,适配端侧供电与散热条件
- 完善的 SDK 生态:配套 Sophon SDK 提供 C++、Python 多语言推理接口,开发门槛低,移植适配快
四、环境与资源准备
4.1 获取官方例程
本次部署使用算能官方开源的sophon-demo仓库,其中已提供完整的 C3D 移植例程与配套脚本,可直接适配上述三款土星云设备:
git clone https://github.com/sophgo/sophon-demo.git cd sophon-demo/sample/C3D |
4.2 环境分工
部署流程分为两个独立环境:
- 模型编译环境:x86 主机,安装 TPU-MLIR 工具链,用于将 ONNX 模型编译为 TPU 可执行的 BModel 格式,编译时需指定对应设备的目标芯片平台
- 板端运行环境:土星云 SE110S 边缘设备,预装 Sophon SDK,包含 Python 推理接口sophon-sail
4.3 一键下载模型与数据
例程提供了自动化下载脚本,可直接获取预编译的各平台 BModel、原始 ONNX 模型以及 UCF101 测试数据集:
sudo apt install unzipchmod -R +x scripts/ ./scripts/download.sh |
执行完成后,核心目录结构如下:
- models/:各芯片平台 BModel 文件,包含 FP32/FP16/INT8、单 / 多 batch 版本,对应三款不同设备
- datasets/:UCF101 测试子集,用于精度验证和功能测试
- python/:Python 推理例程源码
- tools/:数据预处理、精度评估工具脚本
五、模型编译(可选,使用预编译模型可跳过)
如果需要适配自定义模型或调整输入参数,可使用 TPU-MLIR 工具链自行编译 BModel。例程已封装好各精度的编译脚本,执行时指定目标平台即可。 三款设备对应的编译目标平台参数:
- SE110S-WA32 → 目标平台:bm1684x
- SE110S-WB16 → 目标平台:bm1688
- SE110S-WC08 → 目标平台:cv186AH
5.1 编译 FP32 基础模型
# 目标平台可选:bm1684 / bm1684x / bm1688 / cv186AH,根据设备型号选择
./scripts/gen_fp32bmodel_mlir.sh bm1684x |
编译完成后,会在models/BM1684X/目录下生成单 batch 与 4batch 的 FP32 BModel 文件,可用于 SE110S-WA32 设备。
5.2 编译 FP16 高性能模型
SE110S-WA32、SE110S-WB16、SE110S-WC08 均原生支持 FP16 精度,可在保证精度的同时大幅提升推理性能:
# 以SE110S-WB16为例,目标平台传入bm1688 ./scripts/gen_fp16bmodel_mlir.sh bm1688 |
5.3 编译 INT8 量化模型
INT8 量化可进一步提升推理速度、降低显存占用。量化前需准备校准数据集,例程提供了数据转换脚本:
cd tools python3 c3d_npy.py --input_path ../datasets/UCF_test_01 |
生成 npy 格式校准集后,执行量化编译:
cd .. ./scripts/gen_int8bmodel_mlir.sh bm1684x |
六、Python 端部署实战
6.1 例程说明
Python 例程位于python/目录下,基于 OpenCV 实现视频读取与图像预处理,使用sophon-sail接口调用 TPU 推理,支持视频文件夹批量测试,原生兼容单 batch 与多 batch 模型,三款土星云设备可通用同一份业务代码,仅需切换对应 BModel 文件。
6.2 运行推理
将编译好的 BModel 和测试数据集拷贝到边缘设备后,进入 python 目录执行推理。以 SE110S-WA32 设备 FP16 模型为例:
python3 c3d_opencv.py --bmodel ../models/BM1684X/c3d_fp16_1b.bmodel --input ../datasets/UCF_test_01 |
核心参数说明:
- --bmodel:BModel 模型文件路径,需与设备芯片型号匹配
- --input:输入视频文件夹路径,文件夹内按类别存放视频
- --dev_id:TPU 设备 ID,默认为 0
运行后会输出每个视频的预测类别结果,并生成 JSON 格式的结果文件用于精度评估。
6.3 核心代码逻辑解析
(1)视频采样与预处理
C3D 模型输入为 16 帧 112×112 的视频片段,标准预处理流程:
- 从视频中等间隔抽取 16 帧图像
- 每帧缩放至 171×128 后中心裁剪为 112×112
- 像素值归一化,通道顺序由 BGR 转换为 RGB
- 维度重排为 (batch, channel, temporal, height, width) 输入格式
(2)TPU 推理调用
通过sail.Engine加载 BModel 并执行推理,三款设备调用逻辑完全一致:
import sophon.sail as sailimport numpy as np engine = sail.Engine(bmodel_path, dev_id, sail.IOMode.SYSIO) graph_name = engine.get_graph_names()[0] input_name = engine.get_input_names(graph_name)[0] output_name = engine.get_output_names(graph_name)[0] input_tensor = preprocess_video(video_frames)# 执行推理 outputs = engine.process(graph_name, {input_name: input_tensor}) |
(3)结果后处理
C3D 后处理逻辑简洁,对输出特征做 argmax 即可得到动作类别索引:
output = outputs[output_name] pred_class_id = np.argmax(output, axis=1)[0] |
6.4 多 batch 吞吐量优化
针对批量视频处理场景,可使用 4batch 模型提升整体吞吐量。例程已自动适配多 batch 模型,当输入视频数量大于等于 batch 数时,自动打包批量推理,显著提升离线处理效率。对于 SE110S-WA32 这类高性能设备,多 batch 模式可充分释放 TPU 算力。
七、精度与性能实测
7.1 精度验证
在 UCF101 官方测试子集上,三款设备各精度模型的 Top-1 准确率如下:
设备型号 | 精度类型 | 单 Batch 准确率 | 四 Batch 准确率 |
SE110S-WA32 | FP32 | 71.5% | 71.5% |
SE110S-WA32 | FP16 | 71.5% | 71.5% |
SE110S-WA32 | INT8 | 71.5% | 71.5% |
SE110S-WB16 | FP32 | 71.5% | 71.5% |
SE110S-WB16 | FP16 | 71.5% | 71.5% |
SE110S-WB16 | INT8 | 71.2% | 71.2% |
SE110S-WC08 | FP32 | 71.5% | 71.5% |
SE110S-WC08 | FP16 | 71.5% | 71.5% |
SE110S-WC08 | INT8 | 71.2% | 71.2% |
可以看到,FP16 量化后精度完全无损,INT8 量化精度损失在 0.3% 以内,完全满足工业落地的精度要求。
精度评估命令:
python3 tools/eval_ucf.py --gt_path datasets/ground_truth.json --result_json python/results.json |
7.2 性能测试
使用官方bmrt_test工具测试纯推理性能(单视频片段平均推理时间),三款设备典型数据如下:
设备型号 | FP32 单 batch | FP16 单 batch | INT8 单 batch | INT8 四 batch |
SE110S-WA32 | 79.05ms | 9.50ms | 5.57ms | 4.41ms |
SE110S-WB16(单核) | 405.18ms | 69.44ms | 25.90ms | 22.57ms |
SE110S-WC08 | 417.85ms | 76.09ms | 32.57ms | 27.78ms |
其中 SE110S-WA32 的 FP16 和 INT8 性能提升极为显著,INT8 单片段推理仅需 5ms 左右,完全满足多路实时视频分析需求;SE110S-WB16 还支持双核模式,可进一步提升推理性能约 20%。
完整端到端性能包含视频解码、预处理、推理、后处理。若改用 BMCV 硬件预处理,可将预处理耗时从 30ms + 降至 3~9ms,进一步提升整体帧率,充分发挥设备硬件能力。
八、总结
C3D 作为经典 3D 卷积动作识别算法,兼具精度与运行效率,非常适合边缘端场景落地。配合土星云 SE110S-WA32、SE110S-WB16、SE110S-WC08 三款边缘计算设备的 TPU 硬件加速,通过 FP16/INT8 量化优化,可以在低功耗条件下实现多路实时视频动作识别。
本文基于官方sophon-demo例程,完整讲解了从算法原理、模型编译到 Python 部署的全流程,开发者可以基于此快速搭建自定义视频动作识别边缘应用,根据算力需求选择对应机型,适配安防、工业、体育等多种业务场景。