综合介绍
SegAnyMo 是一个开源项目,由加州大学伯克利分校和北京大学的研究团队开发,包括 Nan Huang 等成员。这个工具专注于视频处理,能自动识别和分割视频中任意运动的物体,比如人、动物或车辆。它结合了 TAPNet、DINOv2 和 SAM2 等技术,计划在 CVPR 2025 会议上展示成果。项目代码完全公开,用户可以免费下载、使用或修改,适合开发者、研究人员和视频处理爱好者。SegAnyMo 的目标是简化动态视频分析,提供高效的分割方案。
功能列表
- 自动检测视频中的运动物体,生成精确的分割掩码。
- 支持视频格式(如 MP4、AVI)或图像序列输入。
- 提供预训练模型,支持快速部署和测试。
- 集成 TAPNet 生成 2D 追踪轨迹,捕捉运动信息。
- 使用 DINOv2 提取语义特征,提升分割准确性。
- 利用 SAM2 细化掩码,实现像素级分割。
- 支持自定义数据集训练,适应不同场景。
- 输出可视化结果,便于检查和调整。
使用帮助
SegAnyMo 需要一定的技术基础,主要面向有编程经验的用户。下面是详细的安装和使用指南。
安装流程
- 准备硬件和软件
项目在 Ubuntu 22.04 上开发,推荐使用 NVIDIA RTX A6000 或类似支持 CUDA 的显卡。需要预装 Git 和 Anaconda。- 克隆代码仓库:
git clone --recurse-submodules https://github.com/nnanhuang/SegAnyMo
- 进入项目目录:
cd SegAnyMo
- 克隆代码仓库:
- 创建虚拟环境
用 Anaconda 创建独立的 Python 环境,避免依赖冲突。- 创建环境:
conda create -n seg python=3.12.4
- 激活环境:
conda activate seg
- 创建环境:
- 安装核心依赖
安装 PyTorch 和其他必要库。- 安装 PyTorch(支持 CUDA 12.1):
conda install pytorch==2.4.0 torchvision==0.19.0 torchaudio==2.4.0 pytorch-cuda=12.1 -c pytorch -c nvidia
- 安装其他依赖:
pip install -r requirements.txt
- 安装 xformers(加速推理):
pip install -U xformers --index-url https://download.pytorch.org/whl/cu121
- 安装 PyTorch(支持 CUDA 12.1):
- 安装 DINOv2
DINOv2 用于特征提取。- 进入预处理目录并克隆:
cd preproc && git clone https://github.com/facebookresearch/dinov2
- 进入预处理目录并克隆:
- 安装 SAM2
SAM2 是掩码细化核心。- 进入 SAM2 目录:
cd sam2
- 安装:
pip install -e .
- 下载预训练模型:
cd checkpoints && ./download_ckpts.sh && cd ../..
- 进入 SAM2 目录:
- 安装 TAPNet
TAPNet 用于生成 2D 追踪轨迹。- 进入 TAPNet 目录:
cd preproc/tapnet
- 安装:
pip install .
- 下载模型:
cd ../checkpoints && wget https://storage.googleapis.com/dm-tapnet/bootstap/bootstapir_checkpoint_v2.pt
- 进入 TAPNet 目录:
- 验证安装
检查环境是否正常:
python -c "import torch; print(torch.cuda.is_available())"
输出 True
表示成功。
使用方法
数据准备
SegAnyMo 支持视频或图像序列输入。数据需按以下结构组织:
data
├── images
│ ├── scene_name
│ │ ├── image_name
│ │ ├── ...
├── bootstapir
│ ├── scene_name
│ │ ├── image_name
│ │ ├── ...
├── dinos
│ ├── scene_name
│ │ ├── image_name
│ │ ├── ...
├── depth_anything_v2
│ ├── scene_name
│ │ ├── image_name
│ │ ├── ...
- 如果输入是视频,用工具(如 FFmpeg)提取帧到
images
文件夹。 - 如果是图像序列,直接放入对应目录。
运行预处理
- 生成深度图、特征和轨迹
使用以下命令处理数据(约 10 分钟,视数据量而定):- 对于图像序列:
python core/utils/run_inference.py --data_dir $DATA_DIR --gpus 0 --depths --tracks --dinos --e
- 对于视频:
python core/utils/run_inference.py --video_path $VIDEO_PATH --gpus 0 --depths --tracks --dinos --e
参数说明:
--e
启用高效模式,降低帧率和分辨率,加速处理。--step 10
表示每 10 帧取 1 帧作为查询帧,可调小以提高精度。
- 对于图像序列:
预测运动轨迹
- 下载模型权重
从 Hugging Face 或 Google Drive 下载预训练模型。将路径写入configs/example_train.yaml
的resume_path
字段。- 运行轨迹预测:
python core/utils/run_inference.py --data_dir $DATA_DIR --motin_seg_dir $OUTPUT_DIR --config_file configs/example_train.yaml --gpus 0 --motion_seg_infer --e
输出结果保存在
$OUTPUT_DIR
。 - 运行轨迹预测:
生成分割掩码
- 使用 SAM2 细化掩码
- 运行掩码生成:
python core/utils/run_inference.py --data_dir $DATA_DIR --sam2dir $RESULT_DIR --motin_seg_dir $OUTPUT_DIR --gpus 0 --sam2 --e
参数说明:
$DATA_DIR
是原始图像路径。$RESULT_DIR
是掩码保存路径。$OUTPUT_DIR
是轨迹预测结果路径。
注意:SAM2 默认支持.jpg
或.jpeg
格式,文件名需为纯数字。若不符合,可修改代码或重命名文件。
- 运行掩码生成:
评估结果
- 下载预计算结果
可从 Google Drive 下载官方掩码进行对比。- 评估 DAVIS 数据集:
CUDA_VISIBLE_DEVICES=0 python core/eval/eval_mask.py --res_dir $RES_DIR --eval_dir $GT_DIR --eval_seq_list core/utils/moving_val_sequences.txt
- 细化评估:
cd core/eval/davis2017-evaluation && CUDA_VISIBLE_DEVICES=0 python evaluation_method.py --task unsupervised --results_path $MASK_PATH
- 评估 DAVIS 数据集:
自定义训练
- 数据预处理
以 HOI4D 数据集为例:
python core/utils/process_HOI.py
python core/utils/run_inference.py --data_dir $DATA_DIR --gpus 0 --tracks --depths --dinos
自定义数据集需提供 RGB 图像和动态掩码。
- 检查数据完整性:
python current-data-dir/dynamic_stereo/dynamic_replica_data/check_process.py
- 清理数据节省空间:
python core/utils/run_inference.py --data_dir $DATA_DIR --gpus 0 --clean
- 模型训练
修改configs/$CONFIG.yaml
配置,使用 Kubric、HOI4D 等数据集训练:
CUDA_VISIBLE_DEVICES=0 python train_seq.py ./configs/$CONFIG.yaml
应用场景
- 视频后期制作
从视频中分离运动物体(如奔跑的人),生成掩码后用于特效合成。 - 行为分析研究
追踪动物或人体运动轨迹,分析行为模式。 - 自动驾驶开发
分割行车视频中的移动物体(如车辆、行人),优化感知系统。 - 监控系统优化
提取监控视频中的异常运动,提升安防效率。
QA
- 需要 GPU 吗?
是的,推荐 NVIDIA 显卡支持 CUDA,否则运行效率低。 - 支持实时处理吗?
当前版本适合离线处理,实时应用需自行优化。 - 训练需要多大空间?
视数据集而定,小数据集几 GB,大数据集可能上百 GB。 - 如何提高分割精度?
减小--step
值,或用更多标注数据训练模型。