CameraCtrl的10个关键推理参数详解:video_length、guidance_scale与多GPU并行全攻略
【免费下载链接】CameraCtrl项目地址: https://gitcode.com/gh_mirrors/ca/CameraCtrl
CameraCtrl 是基于 AnimateDiff 的可控镜头运动文生视频模型:只需一段相机轨迹 + 一句文本提示,就能让镜头按你的"运镜设计"动起来。本文以 inference.py 为主线,带你逐个吃透video_length、guidance_scale等 10 个最常用的推理参数,并附上多GPU并行的完整使用攻略,帮助新手一次跑通第一个镜头可控视频。
一、先认识推理入口
整个推理流程由一个脚本完成:inference.py。它做四件事:
- 加载 SD1.5 + AnimateDiffV3 运动模块 + CameraCtrl 相机控制权重;
- 读取轨迹文件,把每帧相机位姿转成 Plücker 嵌入(核心算法见 ray_condition);
- 将提示词均匀切分到多张 GPU;
- 循环调用 CameraCtrlPipeline 生成并保存 mp4 视频。
相机轨迹是 CameraCtrl 的"灵魂"——同一段文字提示,配合不同轨迹,镜头运动完全不同。官方示例轨迹的可视化如下(每个小四棱锥代表一帧相机,箭头表示位置移动方向):
二、10个关键推理参数逐一详解 🎥
参数1|video_length:视频帧数(默认 16)
- 决定生成多少帧,默认 16 与训练配置
sample_n_frames: 16(见 adv3_256_384_cameractrl_relora.yaml)严格对齐,建议保持 16。 - ⚠️ 必须≤ 轨迹文件的行数,否则切分时相特征帧数不够会直接报错。
- 帧数越多,视频越长,但显存与耗时近似线性增长。
参数2|guidance_scale:提示词跟随强度(默认 14.0)
- 这是无分类器引导(CFG)系数。在 pipeline_animation.py 中,大于 1 时会同时做"条件 + 无条件"两次前向,再按
uncond + scale × (cond − uncond)融合。 - 数值越大画面越贴合文字描述,但过大容易出现色彩过饱和、细节扭曲;调小则画面更随性。设为 ≤ 1 可完全关闭 CFG,省算力。
- 官方默认 14.0 偏高,属于"强跟随"风格,12~14 之间是不错的调参区间。
参数3|num_inference_steps:去噪步数(默认 25)
- 由
model_config中noise_scheduler_kwargs决定的 DDIM 调度器执行步数。 - 20~30 是质量与速度的平衡点;低于 15 步时容易出现伪影与抖动。
参数4|image_height / image_width:输出分辨率(默认 256 × 384)
- 二者必须能被 8 整除(VAE 下采样 8 倍),否则
check_inputs直接抛错。 - 256×384 即训练分辨率(
sample_size: [256, 384]),是效果最稳的选择。
参数5|trajectory_file:相机轨迹文件(必填)
- 每行一帧,内容为帧序号 + 内参(fx, fy, cx, cy)+ 12 个数位的 world-to-camera 矩阵,首行是表头链接,代码会自动跳过。
- 示例文件:assets/pose_files/0f47577ab3441480.txt。
- 没有现成轨迹?可用 tools/select_realestate_poses.py 从 RealEstate10K 数据中随机截取 16 帧轨迹,配套参考视频在 assets/reference_videos 中。
参数6|original_pose_width / original_pose_height:轨迹原始分辨率(默认 1280 × 720)
- 轨迹内参是在原视频分辨率下采集的,而输出是 384×256。这两个参数告诉代码如何把焦距 fx/fy 等比映射到新分辨率:宽高比不一致时,自动按长边/短边 rescale 对应的 fx 或 fy。
- 只要你用官方工具处理轨迹,保持默认值即可。
参数7|model_config:模型结构配置(yaml)
- 指向 adv3_256_384_cameractrl_relora.yaml,提供四组关键配置:
unet_additional_kwargs(运动模块)、noise_scheduler_kwargs(DDIM 调度器)、pose_encoder_kwargs(位姿编码器)、attention_processor_kwargs(注意力注入方式)。 - 与下载的 CameraCtrl 权重配套,无需手改。
参数8|visualization_captions + 种子开关:提示词与可复现性
- 支持 txt(每行一条提示)或 json。json 可含
prompts、negative_prompts、seeds三个键,示例见 assets/cameractrl_prompts.json。 --use_specific_seeds:每条提示使用 json 里各自的 seed,同一配置每次运行结果一致,适合对比实验。--use_negative_prompt:启用 json 中的负提示词,抑制不想要的画面元素。
参数9|image_lora_ckpt / image_lora_rank:风格域 LoRA(可选)
- 加载域适配 LoRA(
image_lora_rank默认 2),例如官方提供的 RealEstate10K LoRA 可显著提升室内外场景生成质量。 - 进阶玩法
--personalized_base_model:直接整体替换 VAE/UNet/文本编码器,接入 Realistic Vision 等社区底模(.safetensors或.ckpt均可)。
配合不同轨迹,同一提示词"马在草地上吃草"会生成风格各异的镜头运动视频:
参数10|n_procs:并行进程数(默认 8)
- 决定把多少张 GPU 用于"一条提示词一个进程"的并行推理,详见下一节。
三、多GPU并行全攻略 🚀
官方推理采用torch.distributed.launch启动(完整示例见 README.md):
python -m torch.distributed.launch --nproc_per_node=8 --master_port=25000 inference.py \ --out_root ${OUTPUT_PATH} \ --ori_model_path ${SD1.5_PATH} \ --pose_adaptor_ckpt ${CAMERACTRL_CKPT} \ --model_config configs/train_cameractrl/adv3_256_384_cameractrl_relora.yaml \ --visualization_captions assets/cameractrl_prompts.json \ --use_specific_seeds \ --trajectory_file assets/pose_files/0f47577ab3441480.txt \ --n_procs 8关键规则一览:
| 要点 | 说明 |
|---|---|
| 数字对齐 | --nproc_per_node(进程数)必须与--n_procs(切分 GPU 数)一致 |
| 提示词自动切分 | 总数 ÷ n_procs,余数分给前几个进程(11 条提示 8 卡 → 前 3 卡各 2 条,其余各 1 条) |
| 单卡独立 | 每个进程各自把完整 pipeline 搬到自己的卡上,结果写入out_root |
| 单卡运行 | 两处都设为 1 即可 |
| 多机训练同理 | 训练侧的 slurm_run.sh、dist_run.sh 也是同一套 DDP 启动逻辑 |
四、实战参数速查表 📋
| 参数 | 默认值 | 推荐设置 | 说明 |
|---|---|---|---|
| video_length | 16 | 16 | ≤ 轨迹行数 |
| guidance_scale | 14.0 | 12~14 | 越大越贴合提示词 |
| num_inference_steps | 25 | 20~30 | 速度与质量平衡 |
| image_height / width | 256 / 384 | 保持不变 | 须被 8 整除 |
| original_pose_width / height | 1280 / 720 | 保持不变 | 轨迹内参映射 |
| n_procs | 8 | = GPU 卡数 | 与 nproc_per_node 对齐 |
| use_specific_seeds | 关 | 开 | 保证结果可复现 |
五、新手三大高频坑位 🛠️
- video_length 超过轨迹行数→ 位姿特征切分后帧数不足,直接报维度错误;先用 tools/visualize_trajectory.py 预览轨迹再定帧数。
- 分辨率不能被 8 整除→
check_inputs立即抛 ValueError,改回 256×384 最省心。 - n_procs 与 nproc_per_node 不一致→ 多出的进程空转或端口冲突崩溃,启动前核对两个数字。
显存吃紧时也别慌:代码默认已开启enable_vae_slicing()按帧解码省显存;仍不够时再降分辨率或帧数。
写在最后
掌握这 10 个参数,你就拥有了 CameraCtrl 推理的全部"旋钮":轨迹文件决定镜头怎么走,提示词 + guidance_scale 决定画面长什么样,video_length 与分辨率决定代价,n_procs 决定多快。照着速查表起步,遇到问题回到 inference.py 的参数定义处查默认值,基本就能独立驾驭这个镜头可控视频生成工具了。
【免费下载链接】CameraCtrl项目地址: https://gitcode.com/gh_mirrors/ca/CameraCtrl
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考