BXC_VideoNet 是一个面向视频动作识别的深度学习训练框架,提供完整的模型训练、测试、部署解决方案
BXC_VideoNet 是一个面向视频动作识别的深度学习训练框架,提供完整的模型训练、测试、部署解决方案。🎯命令行训练工具:传统的 Python 脚本训练方式🌐Web 管理后台:基于 Flask 的可视化训练管理平台🚀多平台部署:支持 ONNX、OpenVINO、TensorRT 模型导出💡轻量级模型:高效的 3D 卷积神经网络架构。
BXC_VideoNet - 视频动作识别深度学习框架
👨💻 作者信息
- 作者:北小菜
- 官网:http://www.beixiaocai.com
- 邮箱:bilibili_bxc@126.com
- QQ:1402990689
- 微信:bilibili_bxc
- 哔哩哔哩:https://space.bilibili.com/487906612
- Gitee:https://gitee.com/Vanishi/BXC_VideoNet
- GitHub:https://github.com/beixiaocai/BXC_VideoNet
📖 项目简介
BXC_VideoNet 是一个面向视频动作识别的深度学习训练框架,提供完整的模型训练、测试、部署解决方案。项目包含:
- 🎯 命令行训练工具:传统的 Python 脚本训练方式
- 🌐 Web 管理后台:基于 Flask 的可视化训练管理平台
- 🚀 多平台部署:支持 ONNX、OpenVINO、TensorRT 模型导出
- 💡 轻量级模型:高效的 3D 卷积神经网络架构
✨ 主要特性
核心功能
- ✅ 视频分类模型训练(基于 PyTorch)
- ✅ 智能采样策略:支持3种视频帧采样策略(uniform/random_segment/dense)
- ✅ UCF50/UCF101 数据集支持
- ✅ 数据集自动分割(train/val)
- ✅ 新旧模型兼容:自动识别和加载多种模型格式
- ✅ 模型导出(PyTorch → ONNX → OpenVINO)
- ✅ 实时训练进度监控
- ✅ 断点续训支持
Web 管理后台特色
- 🎨 现代化 UI:渐变色设计,响应式布局
- 📁 数据集管理:拖拽上传、类别管理、自动分割
- 🚀 训练监控:实时显示损失、准确率、进度条
- 🧪 模型测试:上传视频预测,Top-5 结果展示
- 🔄 模型转换:一键转换 ONNX/OpenVINO 格式
- 💾 零第三方库:纯原生 HTML/CSS/JavaScript 实现
🛠️ 技术栈
- 深度学习:PyTorch 2.1.0 + torchvision 0.16.0
- Web 框架:Flask 3.0.0
- 模型导出:ONNX 1.16.1 + OpenVINO 2024.3.0
- 视频处理:OpenCV 4.8.0.74
- 推理加速:ONNX Runtime 1.19.0
📦 安装指南
环境要求
- Python 版本:
- Windows:Python 3.10(推荐)
- Linux:Python 3.8(推荐)
- 操作系统:Windows 10/11、Ubuntu 18.04+
- GPU(可选):NVIDIA GPU + CUDA 12.1
1️⃣ 创建虚拟环境
⚠️ 重要:强烈建议使用虚拟环境,避免依赖冲突
Windows 系统
# 创建虚拟环境
python -m venv venv
# 激活虚拟环境
venv\Scripts\activate
# 更新 pip
python -m pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple
Linux 系统
# 创建虚拟环境
python -m venv venv
# 激活虚拟环境
source venv/bin/activate
# 更新 pip
python -m pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple
2️⃣ 安装依赖库
安装基础依赖
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
安装 PyTorch
CPU 版本(适合学习测试):
pip install torch==2.1.0 torchvision==0.16.0 torchaudio==2.1.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
GPU 版本(CUDA 12.1,推荐训练使用):
pip install torch==2.1.0 torchvision==0.16.0 torchaudio==2.1.0 --index-url https://download.pytorch.org/whl/cu121
📌 注意:请根据你的 CUDA 版本选择对应的 PyTorch 版本,访问 PyTorch 官网 查看更多版本。
3️⃣ 验证安装
python -c "import torch; print('PyTorch版本:', torch.__version__); print('CUDA可用:', torch.cuda.is_available())"
🚀 快速开始
方式一:Web 管理后台(推荐)
1. 启动 Web 服务器
python app.py
2. 访问管理后台
在浏览器中打开:http://127.0.0.1:5000
3. 使用流程
-
📁 数据集管理:
- 创建类别文件夹(如 Basketball、Dancing)
- 拖拽上传视频到对应类别
- 设置比例分割训练集/验证集(默认 8:2)
-
🚀 模型训练:
- 配置训练参数(轮数、批次大小、学习率)
- 可选预训练模型(断点续训)
- 实时查看训练进度和日志
-
🧪 模型测试:
- 选择训练好的模型
- 上传测试视频
- 查看预测结果和 Top-5 概率
-
🔄 模型转换:
- 选择训练模型
- 转换为 ONNX 格式(支持动态输入)
- 转换为 OpenVINO 格式(Intel 平台优化)
方式二:命令行训练
1. 准备数据集
数据集目录结构:
UCF50/
├── train/
│ ├── BaseballPitch/
│ │ ├── v_BaseballPitch_g01_c01.avi
│ │ ├── v_BaseballPitch_g01_c02.avi
│ │ └── ...
│ ├── Basketball/
│ │ ├── v_Basketball_g01_c01.avi
│ │ └── ...
│ └── ...
└── val/
├── BaseballPitch/
│ ├── v_BaseballPitch_g01_c03.avi
│ └── ...
└── ...
2. 转换 UCF 数据集格式
如果你下载的是原始 UCF50/UCF101 数据集:
python split_ucf.py
3. 训练模型
python train.py
启动时会显示版本信息:
============================================================
BXC_VideoNet - 视频动作识别深度学习框架
版本: v1.01
作者: 北小菜
发布日期: 2025-10-31
============================================================
4. 测试模型
python test.py
可以在test.py中配置采样策略:
# 配置区
num_frames = 16 # 采样帧数(可修改为32、64等)
sampling_strategy = 'uniform' # 采样策略:'uniform', 'random_segment', 'dense'
5. 导出模型
导出为 ONNX 格式:
python export2onnx.py
转换为 OpenVINO 格式:
mo --input_model best_model.onnx --output_dir best_model_openvino_model
📂 项目结构
BXC_VideoNet/
├── version.py # 版本管理模块(v1.01)
├── app.py # Flask Web 服务器主程序
├── train.py # 命令行训练脚本
├── test.py # 模型测试脚本(支持3种采样策略)
├── export2onnx.py # 模型导出ONNX脚本
├── split_ucf.py # UCF数据集分割工具
├── model.py # 模型架构定义
├── dataset.py # 数据集加载模块(支持视频和图像)
│ ├── VideoDatasetVideo # 从视频文件直接读取(支持3种采样策略)
│ └── VideoDatasetImage # 从图片序列读取
├── requirements.txt # 依赖库列表
├── README.md # 项目说明文档
├── VIDEO_SAMPLING_STRATEGIES.md # 视频采样策略详细说明
├── templates/ # Web 页面模板
│ ├── base.html # 基础模板
│ ├── index.html # 数据集管理页面
│ ├── train.html # 训练页面
│ ├── test.html # 测试页面
│ └── convert.html # 模型转换页面
├── web_data/ # Web 数据目录(自动生成)
│ ├── uploads/ # 上传的视频
│ ├── dataset/ # 分割后的数据集
│ ├── models/ # 保存的模型
│ └── config.json # 配置文件
├── models_20251012001_ucf50/ # 预训练模型(可选)
└── test/ # C++ 推理示例
├── onnx_inference.py # ONNX Runtime 推理
├── openvino_inference/ # OpenVINO C++ 推理
└── tensorrt_inference/ # TensorRT C++ 推理
💡 使用指南
视频采样策略说明 ⭐ 重要
项目提供了三种智能视频采样策略,可显著提升模型性能。所有策略都会采样固定数量的帧(默认16帧,可配置)。
📊 采样策略对比
| 策略 | 适用场景 | 主要优势 | 数据增强 |
|---|---|---|---|
| uniform | 验证集/测试集 | 稳定可复现 | 无 |
| random_segment ⭐ | 训练集(推荐) | 时间增强,提升泛化 | 强 |
| dense | 长视频/复杂动作 | 细粒度覆盖 | 中等 |
🎯 策略详解
1. uniform - 均匀采样
- 在整个视频上均匀采样
- 每次采样结果完全一致
- 适合验证集和测试集
2. random_segment - 随机片段采样(推荐用于训练)
- 每个epoch随机选择视频的不同时间段
- 等效于2-3倍数据增强
- 预期准确率提升 +3% ~ +8%
- 训练集默认启用此策略
3. dense - 密集分段采样
- 将视频分段,每段采样一帧
- 适合超过300帧的长视频
- 训练时每段随机采样,验证时取中间帧
💻 使用示例
from dataset import VideoDatasetVideo
from torchvision import transforms
# 训练集 - 使用random_segment策略(数据增强)
train_dataset = VideoDatasetVideo(
phase='train',
root_dir='data/train',
transform=train_transforms,
num_frames=16, # 采样帧数(可配置)
sampling_strategy='random_segment' # 随机片段采样
)
# 验证集 - 使用uniform策略(稳定评估)
val_dataset = VideoDatasetVideo(
phase='val',
root_dir='data/val',
transform=val_transforms,
num_frames=16, # 采样帧数
sampling_strategy='uniform' # 均匀采样
)
# 长视频 - 使用dense策略 + 更多帧
long_video_dataset = VideoDatasetVideo(
phase='train',
root_dir='data/long_videos',
transform=train_transforms,
num_frames=32, # 增加采样帧数
sampling_strategy='dense' # 密集采样
)
📖 详细说明:查看 VIDEO_SAMPLING_STRATEGIES.md 了解采样策略的原理、性能对比和最佳实践。
数据集加载模块说明
项目支持两种数据加载方式(位于 dataset.py):
-
VideoDatasetVideo:直接从视频文件读取
- 支持三种智能采样策略
- 支持格式:.mp4、.avi、.mov
- 适合:原始视频文件数据集(如 UCF50/UCF101)
-
VideoDatasetImage:从图片序列读取
- 从视频帧图片文件夹读取
- 支持格式:.jpg、.jpeg、.png
- 适合:已提取帧的数据集
使用示例:
# 导入数据集类
from dataset import VideoDatasetVideo, VideoDatasetImage
# 使用视频文件数据集(推荐)
dataset = VideoDatasetVideo('train', 'path/to/train',
transform=data_transforms['train'],
num_frames=16,
sampling_strategy='random_segment')
# 或使用图片序列数据集
dataset = VideoDatasetImage('train', 'path/to/frames',
transform=data_transforms['train'])
Web 管理后台详细说明
📁 数据集管理
-
创建类别文件夹:
- 输入类别名称(如 Basketball、Dancing、Running)
- 点击"创建类别"按钮
- 类别卡片会显示在页面上
-
上传视频:
- 点击类别卡片选中(会高亮显示)
- 拖拽或点击上传视频文件
- 支持多文件并行上传
- 支持格式:.mp4、.avi、.mov
- 单文件最大 500MB
-
分割数据集:
- 调整训练集比例滑块(默认 80%)
- 设置随机种子(保证可重复性)
- 点击"开始分割"按钮
- 系统自动将视频复制到 train/val 目录
-
查看统计信息:
- 页面顶部显示训练集/验证集数量
- 类别总数和每类视频数量
- 实时更新统计数据
🚀 模型训练
训练参数说明:
-
训练轮数 (Epochs):
- 小数据集:50-100
- 中等数据集:100-200
- 大数据集:200-300
-
批次大小 (Batch Size):
- GPU 显存 4GB:4-8
- GPU 显存 8GB:8-16
- GPU 显存 12GB+:16-32
- CPU 训练:2-4
-
学习率 (Learning Rate):
- 从头训练:0.0005-0.001
- 迁移学习:0.0001-0.0005
-
预训练模型:
- 从头训练:不选择
- 断点续训:选择 latest_model.pth
- 迁移学习:选择其他训练好的模型
训练监控:
- 实时显示当前轮次进度条
- 训练集损失和准确率
- 验证集损失和准确率
- 历史最佳验证准确率
- 详细训练日志滚动显示
模型保存:
- 最佳模型:
best_model_epoch{轮次}_acc{准确率}.pth - 最新模型:
latest_model.pth(每轮更新) - 保存位置:
web_data/models/
🧪 模型测试
- 选择模型:从下拉列表选择已训练模型
- 上传测试视频:拖拽或点击上传
- 查看预测结果:
- 预测类别
- 置信度(百分比)
- Top-5 预测概率分布
- 测试历史:保留最近 10 次测试记录
🔄 模型转换
ONNX 格式转换:
- ✅ 跨平台部署(Windows、Linux、ARM)
- ✅ 可选动态输入维度
- ✅ 自动模型验证
- 📦 生成
.onnx文件
OpenVINO 格式转换:
- ✅ Intel CPU/GPU 优化
- ✅ 推理性能提升 2-5 倍
- ✅ 支持边缘设备部署
- 📦 生成
.xml和.bin文件
训练优化建议
数据集准备
-
数量要求:
- 每个类别至少 20-50 个视频
- 总样本数建议 500+ 以上
-
质量要求:
- 视频清晰、稳定、光线充足
- 避免过度晃动和模糊
- 背景尽量简洁
-
时长建议:
- 3-10 秒最佳(系统支持灵活配置采样帧数)
- 短视频:采样16帧
- 长视频(>300帧):采样32-64帧,使用dense策略
-
类别平衡:
- 各类别视频数量尽量接近
- 避免数据倾斜
解决过拟合
现象:训练准确率高,验证准确率低
解决方案:
- ✅ 启用random_segment采样策略(数据增强,推荐)
- 减少训练轮数(Early Stopping)
- 收集更多训练数据
- 使用数据增强
- 降低模型复杂度
解决欠拟合
现象:训练和验证准确率都低
解决方案:
- 增加训练轮数
- 提高学习率
- 检查数据质量
- 增加模型复杂度
📊 数据集下载
官方数据集
-
UCF101(101 类动作识别):
- 官网:https://www.crcv.ucf.edu/data/UCF101.php
- 样本数:13,320 个视频
- 大小:~6.5GB
-
UCF50(50 类动作识别):
- 官网:https://www.crcv.ucf.edu/data/UCF50.php
- 样本数:6,676 个视频
- 大小:~3.2GB
数据集类别示例
BaseballPitch、Basketball、BenchPress、Biking、Billiards、
BreastStroke、CleanAndJerk、Diving、Drumming、Fencing、
GolfSwing、HighJump、HorseRace、HorseRiding、HulaHoop、
JavelinThrow、JugglingBalls、JumpingJack、JumpRope、Kayaking...
❓ 常见问题
Q1: 上传视频失败?
可能原因:
- ❌ 文件格式不支持(仅支持 .mp4、.avi、.mov)
- ❌ 文件大小超过 500MB
- ❌ 磁盘空间不足
- ❌ 未选择目标类别
解决方案:
- ✅ 检查文件格式和大小
- ✅ 清理磁盘空间
- ✅ 先点击选中类别卡片
Q2: 训练时显存不足(CUDA Out of Memory)?
解决方案:
- 降低 Batch Size(如从 16 降到 8 或 4)
- 关闭其他占用 GPU 的程序
- 使用 CPU 训练(速度较慢)
Q3: 训练速度很慢?
检查项:
- 是否使用了 GPU(查看训练日志中的设备信息)
- 数据加载是否成为瓶颈(调整 num_workers)
- 批次大小是否过小
优化方案:
- 使用 GPU 训练(提速 10-50 倍)
- 增加批次大小
- 使用 SSD 硬盘存储数据
Q4: 如何断点续训?
- 在训练页面选择预训练模型
- 选择
latest_model.pth(最新保存的模型) - 配置训练参数(可以调整学习率等)
- 点击开始训练,系统会从上次状态继续
Q5: 模型转换失败?
ONNX 转换失败:
- 检查模型文件是否完整
- 确认已安装
onnx库 - 查看日志中的详细错误信息
OpenVINO 转换失败:
- 确认已安装
openvino-dev - 检查虚拟环境是否激活
- 查看是否有权限问题
Q6: Web 页面无法访问?
检查项:
- Flask 服务是否正常启动
- 是否有其他程序占用 5000 端口
- 防火墙是否阻止访问
解决方案:
# 检查端口占用
netstat -ano | findstr :5000 # Windows
lsof -i :5000 # Linux
# 更换端口启动
# 修改 app.py 最后一行的 port 参数
app.run(debug=True, host='0.0.0.0', port=8080)
🔧 高级配置
修改模型架构
编辑 model.py 文件中的 VideoNetModel 类:
class VideoNetModel(nn.Module):
def __init__(self, num_classes=50):
super(VideoNetModel, self).__init__()
# 修改网络层配置
# ...
调整数据增强
编辑 train.py 或 app.py 中的数据增强配置:
# 在 train.py 或 app.py 中配置数据增强
data_transforms = {
'train': transforms.Compose([
transforms.RandomResizedCrop(224, scale=(0.8, 1.0)),
transforms.RandomHorizontalFlip(),
transforms.RandomVerticalFlip(p=0.2),
transforms.RandomRotation(15),
transforms.ColorJitter(brightness=0.2, contrast=0.2),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
}
配置视频采样策略
在创建数据集时指定采样策略:
from dataset import VideoDatasetVideo
# 示例1:标准配置(16帧 + random_segment)
train_dataset = VideoDatasetVideo(
phase='train',
root_dir='data/train',
transform=train_transforms,
num_frames=16,
sampling_strategy='random_segment'
)
# 示例2:长视频配置(32帧 + dense)
train_dataset = VideoDatasetVideo(
phase='train',
root_dir='data/train',
transform=train_transforms,
num_frames=32,
sampling_strategy='dense'
)
# 示例3:验证集配置(uniform)
val_dataset = VideoDatasetVideo(
phase='val',
root_dir='data/val',
transform=val_transforms,
num_frames=16,
sampling_strategy='uniform'
)
修改训练策略
编辑 train.py 或 app.py 中的训练循环:
# 学习率调度器
scheduler = optim.lr_scheduler.ReduceLROnPlateau(
optimizer, mode='max', factor=0.5, patience=5
)
# 早停策略
if epochs_no_improve >= patience:
print("Early stopping")
break
📈 性能指标
训练性能
| 配置 | Batch Size | 训练速度 | 显存占用 |
|---|---|---|---|
| RTX 3090 | 32 | ~2s/epoch | ~8GB |
| RTX 3060 Ti | 16 | ~4s/epoch | ~6GB |
| GTX 1660 | 8 | ~8s/epoch | ~4GB |
| CPU (i7-10700) | 4 | ~120s/epoch | ~2GB RAM |
推理性能
| 格式 | 平台 | 单帧耗时 | 备注 |
|---|---|---|---|
| PyTorch | NVIDIA GPU | ~15ms | 原始模型 |
| ONNX | CPU | ~80ms | 跨平台 |
| OpenVINO | Intel CPU | ~45ms | 优化推理 |
| TensorRT | NVIDIA GPU | ~8ms | 最快 |
采样策略性能对比(UCF50数据集)
| 采样策略 | 验证准确率 | 训练时间/epoch | 数据增强效果 |
|---|---|---|---|
| uniform(基线) | 85.2% | 120s | - |
| random_segment | 89.7% (+4.5%) | 125s | ⭐⭐⭐ |
| dense | 87.8% (+2.6%) | 130s | ⭐⭐ |
📈 推荐配置:训练集使用
random_segment策略,验证集使用uniform策略,可获得最佳性能提升。
📝 更新日志
v1.01 (2025-10-31) - 采样策略优化版
新增功能:
- ✅ 视频采样策略优化:新增3种智能采样策略(uniform/random_segment/dense)
- ✅ 数据增强增强:random_segment策略可将准确率提升3-8%
- ✅ 版本管理系统:新增version.py,统一管理项目版本号
- ✅ 模型兼容性提升:自动识别和加载新旧模型格式
- ✅ Web界面优化:所有页面显示版本号
修复问题:
- 🐛 修复test.py和export2onnx.py中的模型加载错误
- 🐛 修复app.py中Web测试和转换功能的兼容性问题
- 🐛 优化数据集加载模块,合并为dataset.py
文档更新:
- 📚 新增VIDEO_SAMPLING_STRATEGIES.md采样策略详细说明
- 📚 更新README.md,补充采样策略和版本管理说明
🤝 贡献指南
欢迎提交 Issue 和 Pull Request!
- Fork 本仓库
- 创建特性分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 开启 Pull Request
📄 开源协议
本项目采用 MIT 协议开源 - 详见 LICENSE 文件
📞 联系方式
- 📧 邮箱:bilibili_bxc@126.com
- 💬 QQ:1402990689
- 📱 微信:bilibili_bxc
- 🎥 B站:https://space.bilibili.com/487906612
- 🌐 官网:http://www.beixiaocai.com
🙏 致谢
感谢以下开源项目:
⭐ Star History
如果这个项目对你有帮助,请给个 Star ⭐ 支持一下吧!
享受你的视频分类模型训练之旅! 🎉
Made with ❤️ by 北小菜
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)