ð ïž ææ¯æ : **?
1. é¡¹ç®æŠè§äžé¡¹ç®åŒæºå°å
AnimateDiff æ¯äžäžªåºäº Stable Diffusion çåŒæºåšç»çææ¡æ¶ïŒç± Genmo å¢éåŒåå¹¶åŒæºã该项ç®äº 2023 幎 10 æéŠæ¬¡ååžïŒè¿ éåš AI è§é¢çæé¢ååŒèµ·å¹¿æ³å ³æ³šãAnimateDiff çæ žå¿ä»·åŒåšäºå®å°ææ¬å°åŸåçææš¡åïŒåŠ Stable DiffusionïŒçèœåæ©å±å°è§é¢çæé¢åïŒéè¿åŒå ¥æ¶éŽäžèŽæ§æºå¶ïŒäœ¿åŸçæçè§é¢åž§ä¹éŽä¿æè¿èޝæ§åæµç æ§ã
该项ç®è§£å³çæ žå¿äžå¡çç¹æ¯ïŒäŒ ç»æçåŸæš¡ååšçæè§é¢æ¶çŒºä¹æ¶éŽç»ŽåºŠçäžèŽæ§ïŒå¯ŒèŽçæçè§é¢åž§ä¹éŽååšè·³ååäžè¿èޝãAnimateDiff éè¿ Motion Module å Temporal Attention æºå¶ïŒææè§£å³äºè¿äžé®é¢ïŒäœ¿åŸçšæ·èœå€ä»¥èŸäœçè®¡ç®ææ¬çæé«èŽšéçåšç»è§é¢ã
项ç®åŒæºå°åïŒhttps://github.com/animatediff/AnimateDiff
åŒæºåè®®ïŒApache 2.0 讞å¯è¯
GitHub StarsïŒè¶
è¿ 15,000+ïŒæªè³ 2024 幎åïŒ
ç€ŸåºæŽ»è·åºŠïŒé«ïŒæç»æèŽ¡ç®è
åäžåŒåïŒçæ¬è¿ä»£é¢ç¹
AnimateDiff çè¯çæ å¿ç AI è§é¢çæé¢åçäžäžªéèŠéçšç¢ãå®å°åæ¬éèŠæèŽµ GPU èµæºå倿è®ç»çåšç»çæä»»å¡ïŒèœ¬å䞺çžå¯¹èœ»éçº§çæšçä»»å¡ïŒäœ¿åŸäžªäººåŒåè åå°åå¢éä¹èœåäžå° AI è§é¢çæé¢åã
2. è¯èšäžæ žå¿ææ¯æ 深床åæ
2.1 åç«¯ææ¯æ
| ææ¯ç±»å« | å
·äœææ¯ | 诎æ |
|———|———|——|
| åŒåè¯èš | Python 3.8+ | äž»èŠçåŒåè¯èšïŒäŸæäž°å¯ç AI çæ |
| 深床åŠä¹ æ¡æ¶ | PyTorch 1.13+ | æ žå¿è®¡ç®æ¡æ¶ïŒæ¯æ GPU å é |
| æš¡ååºç¡ | Stable Diffusion v1.5/v2.1 | äœäžºåŸåçæåºåº§æš¡å |
| æšçäŒå | Diffusers åº | Hugging Face æäŸçæšçæ¡æ¶ |
| è§é¢å€ç | OpenCVãimageio | è§é¢çŒè§£ç ååŸåå€ç |
2.2 åç«¯ææ¯æ
AnimateDiff äž»èŠæ¯äžäžªå端æšçæ¡æ¶ïŒå ¶å端亀äºäž»èŠäŸèµ WebUI å·¥å ·ïŒ
| ææ¯ç±»å« | å
·äœææ¯ | 诎æ |
|———|———|——|
| åç«¯æ¡æ¶ | Gradio | æäŸ Web UI çé¢ |
| å¯è§å | Matplotlib | çšäºç»æé¢è§åè°è¯ |
2.3 æ°æ®ååšäžçŒå
| ææ¯ç±»å« | å
·äœææ¯ | 诎æ |
|———|———|——|
| æš¡åååš | æ¬å°æä»¶ç³»ç» | æš¡åæä»¶ä»¥ .safetensors/.ckpt æ ŒåŒååš |
| çŒåæºå¶ | å
åçŒå | äžéŽç¹åŸçŒåïŒåå°éå€è®¡ç® |
| é
眮æä»¶ | YAML/JSON | åæ°é
眮管ç |
2.4 éšçœ²äžåºç¡è®Ÿæœ
| ææ¯ç±»å« | å
·äœææ¯ | 诎æ |
|———|———|——|
| 容åšå | Docker | æ¯æ Docker éšçœ² |
| ç¯å¢ç®¡ç | Conda/Pipenv | Python ç¯å¢é犻 |
| GPU æ¯æ | CUDA 11.7+ | NVIDIA GPU å é |
2.5 æ žå¿ææ¯æ¶æ
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â AnimateDiff æ¶ææŠè§ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
â âââââââââââââââ âââââââââââââââ âââââââââââââââ â
â â Text Encoderâ â UNet Backboneâ âMotion Moduleâ â
â â (CLIP) âââââ¶â (SD Model) âââââ¶â (Temporal) â â
â âââââââââââââââ âââââââââââââââ âââââââââââââââ â
â â â â â
â ⌠⌠⌠â
â âââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
â â VAE Decoder + Video Output â â
â âââââââââââââââââââââââââââââââââââââââââââââââââââââââ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
3. æ žå¿åèœäžäžå¡æš¡åæè§£
3.1 æ žå¿åèœç©éµ
| åèœæš¡å | åèœæè¿° | äžå¡ä»·åŒ |
|———|———|———|
| Motion Module | æ¶éŽæ³šæåæºå¶æš¡åïŒæ³šå
¥å° UNet äž | å®ç°åž§éŽæ¶éŽäžèŽæ§ïŒè§£å³è§é¢è·³åé®é¢ |
| Adapter æ¯æ | æ¯æ ControlNet 飿 Œçå§¿æ/èŸ¹çŒæ§å¶ | æäŸç²Ÿç»åçè¿åšæ§å¶èœå |
| 倿š¡åå
Œå®¹ | æ¯æ SD 1.5ãSD 2.1ãSDXL çå€ç§åºåº§ | çµæŽ»éé
äžå莚ééæ±çåºæ¯ |
| LoRA éæ | æ¯æ LoRA æš¡ååŸ®è° | å®ç°ç¹å®é£æ Œçå¿«éå®å¶ |
| WebUI çé¢ | åºäº Gradio çå¯è§åæäœçé¢ | éäœäœ¿çšéšæ§ïŒæåçšæ·äœéª |
| æ¹éçæ | æ¯æå€æç€ºè¯æ¹éæšç | æé«å
容ç产æç |
3.2 诊ç»åèœè¯Žæ
#### 3.2.1 Motion Module æ¶éŽäžèŽæ§æºå¶
Motion Module æ¯ AnimateDiff çæ žå¿åæ°ç¹ãå®éè¿ä»¥äžæ¹åŒå®ç°æ¶éŽäžèŽæ§ïŒ
1. Temporal Attention LayerïŒåš UNet çæ¯äžªæ®å·®åäžæå
¥æ¶éŽæ³šæåå±ïŒæè·åž§éŽçæ¶éŽäŸèµå
³ç³»
2. 3D å·ç§¯æ¿ä»£ 2D å·ç§¯ïŒéšåå®ç°äžäœ¿çš 3D å·ç§¯æ¥å¢åŒºæ¶ç©ºç¹åŸæå
3. æ¶åºæéå
±äº«ïŒç¡®ä¿äžå垧䜿çšçžåç空éŽç¹åŸæååšïŒä¿æé£æ ŒäžèŽæ§
# ç®åç Motion Module æ žå¿é»èŸ
class MotionModule(nn.Module):
def __init__(self, in_channels):
super().__init__()
# æ¶éŽæ³šæåå±
self.time_mix_conv = ConvLayer(in_channels, in_channels, kernel_size=3)
self.time_attn = TemporalAttention(in_channels)
def forward(self, x, num_frames):
# x: [batch, channels, height, width]
# éå¡äžºæ¶åºæ¹æ¬¡
x_reshaped = x.reshape(1, num_frames, -1, *x.shape[2:])
# åºçšæ¶éŽæ³šæå
x_temporal = self.time_attn(x_reshaped)
return x_temporal.reshape_as(x)
#### 3.2.2 Adapter æ§å¶æºå¶
AnimateDiff æ¯æå€ç§ ControlNet 飿 Œçéé åšïŒ
| éé
åšç±»å | æ§å¶æ¹åŒ | åºçšåºæ¯ |
|———–|———|———|
| OpenPose Adapter | 人äœå§¿æå
³é®ç¹ | 人ç©åšç»çæ |
| Canny Adapter | èŸ¹çŒæ£æµ | 蜮å»ä¿æçåšç» |
| Depth Adapter | æ·±åºŠåŸ | 3D ç©ºéŽæåšç» |
| SoftEdge Adapter | èœ¯èŸ¹çŒæ£æµ | æåè¿æž¡çåšç» |
#### 3.2.3 倿š¡åå Œå®¹æ¶æ
AnimateDiff éçšæä»¶åæ¶æè®Ÿè®¡ïŒæ¯æå€ç§ Stable Diffusion åäœïŒ
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â æš¡åå
Œå®¹æ§æ¶æ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
â ââââââââââââââââ ââââââââââââââââ ââââââââââââââââ â
â â SD 1.5 â â SD 2.1 â â SDXL â â
â â (512x512) â â (768x768) â â (1024x1024) â â
â ââââââââ¬ââââââââ ââââââââ¬ââââââââ ââââââââ¬ââââââââ â
â â â â â
â âââââââââââââââââââŒââââââââââââââââââ â
â ⌠â
â âââââââââââââââââââââââââââ â
â â Motion Module â â
â â (ç»äžæ¶éŽæ³šæåå±) â â
â âââââââââââââââââââââââââââ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
#### 3.2.4 LoRA éæç³»ç»
AnimateDiff æ¯æéè¿ LoRA è¿è¡é£æ ŒåŸ®è°ïŒ
– 飿 Œ LoRAïŒç¹å®èºæ¯é£æ Œçå¿«ééé
– è§è² LoRAïŒä¿æè§è²äžèŽæ§çåšç»çæ
– åšäœ LoRAïŒç¹å®è¿åšæš¡åŒçé¢è®ç»
4. ææ¯æ¶æäº®ç¹äžäºæ¬¡åŒåäŒå¿
4.1 æ¶æè®Ÿè®¡äº®ç¹
#### 4.1.1 æš¡ååæä»¶æ¶æ
AnimateDiff éçšé«åºŠæš¡ååç讟计ïŒå䞪ç»ä»¶å¯ä»¥ç¬ç«åŒååæ¿æ¢ïŒ
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â æš¡ååæ¶æè®Ÿè®¡ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ€
â âââââââââââââââ âââââââââââââââ âââââââââââââââ â
â â Text Encoderâ â UNet Model â âMotion Moduleâ â
â â (CLIP) â â (坿¿æ¢) â â (坿¿æ¢) â â
â âââââââââââââââ âââââââââââââââ âââââââââââââââ â
â â² â² â² â
â â â â â
â ââââââŽâââââ âââââââŽââââââ ââââââŽâââââ â
â â å€ç§CLIP â â å€ç§UNet â âå€ç§Motionâ â
â â åäœæ¯æ â â åäœæ¯æ â â æš¡åæ¯æ â â
â âââââââââââ âââââââââââââ âââââââââââ â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
äŒå¿åæïŒ
– ç¬ç«è¿ä»£ïŒåæš¡åå¯ä»¥ç¬ç«å级ïŒäºäžåœ±å
– çµæŽ»ç»åïŒæ¯æäžåæš¡åçèªç±ç»å
– èµæºäŒåïŒå¯æ ¹æ®ç¡¬ä»¶æ¡ä»¶éæ©äžåè§æš¡çæš¡å
#### 4.1.2 æ¶éŽäžèŽæ§æºå¶åæ°
AnimateDiff çæ žå¿åæ°åšäºå ¶æ¶éŽäžèŽæ§æºå¶ïŒ
1. Temporal AttentionïŒåšç©ºéŽæ³šæåä¹å€ïŒåŒå
¥æ¶éŽæ³šæåå±
2. Weight SharingïŒæ¶åºç»ŽåºŠäžçæéå
±äº«ïŒç¡®ä¿é£æ ŒäžèŽæ§
3. Efficient ComputationïŒéè¿å·§åŠçå
å管çïŒéäœè®¡ç®åŒé
# Temporal Attention æ žå¿å®ç°
class TemporalAttention(nn.Module):
def __init__(self, dim, num_heads=8):
super().__init__()
self.num_heads = num_heads
self.scale = dim ** -0.5
self.to_qkv = nn.Linear(dim, dim * 3)
self.to_out = nn.Linear(dim, dim)
def forward(self, x):
# x: [batch * frames, channels, height, width]
b, c, h, w = x.shape
frames = b # å讟 batch=1
# éå¡äžºæ¶åºæ¹æ¬¡
x = x.reshape(frames, c, h, w)
# è®¡ç®æ³šæå
qkv = self.to_qkv(x.flatten(2)).reshape(frames, -1, self.num_heads, 3, c // self.num_heads)
q, k, v = qkv.permute(3, 0, 1, 2, 4)
# å€å€Žæ³šæå计ç®
attn = torch.einsum('bihd,bjhd->bihj', q, k) * self.scale
attn = attn.softmax(dim=-1)
out = torch.einsum('bihj,bjhd->bihd', attn, v)
out = out.reshape(frames, -1, c)
return self.to_out(out).reshape(x.shape)
#### 4.1.3 å åäŒåçç¥
é对è§é¢çæç髿Ÿåéæ±ïŒAnimateDiff éçšå€ç§äŒåçç¥ïŒ
| äŒåçç¥ | å®ç°æ¹åŒ | ææ |
|———|———|——|
| æ¢¯åºŠæ£æ¥ç¹ | éæ©æ§è®¡ç®æ¢¯åºŠ | åå° 40-50% æŸåå çš |
| æ··å粟床 | FP16/BF16 æšç | æå 2x æšçé床 |
| å
åçŒå | äžéŽç¹åŸå€çš | åå°éå€è®¡ç® |
| ååå€ç | 倧å蟚çååæšç | æ¯ææŽé«å蟚ç |
4.2 äºæ¬¡åŒåäŒå¿
#### 4.2.1 æ©å±æºå¶
AnimateDiff æäŸå€ç§æ©å±ç¹ïŒ
1. èªå®ä¹ Motion ModuleïŒçšæ·å¯ä»¥åŒåèªå·±çæ¶éŽæ³šæåæš¡å
2. èªå®ä¹ AdapterïŒæ¯ææ°çæ§å¶æ¡ä»¶ç±»å
3. èªå®ä¹éæ ·åšïŒæ¯æäžåçè§é¢éæ ·çç¥
# èªå®ä¹ Motion Module 瀺äŸ
class CustomMotionModule(MotionModule):
def __init__(self, in_channels, custom_params):
super().__init__(in_channels)
# èªå®ä¹åæ°
self.custom_layer = nn.Conv3d(in_channels, in_channels, kernel_size=3)
def forward(self, x, num_frames):
# èªå®ä¹é»èŸ
base_output = super().forward(x, num_frames)
custom_output = self.custom_layer(x)
return base_output + custom_output
#### 4.2.2 å·¥çšåè§è
– æž
æ°çç®åœç»æïŒäŸ¿äºçè§£å富èª
– 诊ç»çææ¡£ïŒæ¯äžªæš¡åéœæææ¡£è¯Žæ
– æµè¯èŠçïŒæäŸåå
æµè¯åéææµè¯
– çæ¬ç®¡çïŒæ¯ææš¡åçæ¬å代ç çæ¬ç对åº
#### 4.2.3 瀟åºçæ
– äž°å¯çé¢è®ç»æš¡åïŒç€ŸåºæäŸå€ç§é£æ Œç Motion Module
– æçšèµæºïŒè¯Šç»çéšçœ²åäœ¿çšæçš
– æä»¶çæïŒæ¯æ ComfyUIãWebUI çå€ç§å端
5. å¿«éäžæãéšçœ²å®æäžé¡¹ç®éå建议
5.1 ç¯å¢äŸèµèŠæ±
# Python ç¯å¢èŠæ±
Python >= 3.8
PyTorch >= 1.13.0
CUDA >= 11.7 (æšè CUDA 11.8)
# æ žå¿äŸèµ
diffusers >= 0.24.0
transformers >= 4.25.0
accelerate
invisible-watermark
omegaconf
einops
5.2 æ 忬å°è¿è¡æ¥éª€
# 1. å
é项ç®
git clone https://github.com/animatediff/AnimateDiff.git
cd AnimateDiff
# 2. å建èæç¯å¢
conda create -n animatediff python=3.9
conda activate animatediff
# 3. å®è£
äŸèµ
pip install -r requirements.txt
# 4. äžèœœé¢è®ç»æš¡å
# - Stable Diffusion 1.5 æ 2.1 åºåº§æš¡å
# - AnimateDiff Motion Module
# - å¯éïŒControlNet Adapter æš¡å
# 5. è¿è¡ WebUI
python app.py
5.3 Docker äžé®éšçœ²
# Dockerfile 瀺äŸ
FROM nvidia/cuda:11.8.0-cudnn8-runtime-ubuntu22.04
WORKDIR /app
# å®è£
Python åäŸèµ
RUN apt-get update && apt-get install -y
python3.9
python3-pip
&& rm -rf /var/lib/apt/lists/*
# å€å¶é¡¹ç®æä»¶
COPY . /app
# å®è£
Python äŸèµ
RUN pip3 install -r requirements.txt
# æŽé²ç«¯å£
EXPOSE 7860
# å¯åšåœä»€
CMD ["python3", "app.py", "--port", "7860"]
# æå»ºå¹¶è¿è¡ Docker 容åš
docker build -t animatediff .
docker run -d
--gpus all
-p 7860:7860
-v /path/to/models:/app/models
--name animatediff
animatediff
5.4 项ç®éåå³çæå
#### éåäœ¿çš AnimateDiff çåºæ¯
| åºæ¯ç±»å | å
·äœåºçš | æšèçç± |
|———|———|———|
| å
容åäœ | çè§é¢ã广åçŽ æ | å¿«éçæé«èŽšéåšç»å
容 |
| èºæ¯åäœ | æ°åèºæ¯ãåšç»çç | æ¯æå€ç§èºæ¯é£æ Œççæ |
| æè²æŒç€º | æåŠåšç»ãç§æ®è§é¢ | éäœåšç»å¶äœéšæ§ |
| åå讟计 | æŠå¿µéªè¯ã讟计皿 | å¿«éè¿ä»£è§è§æ¹æ¡ |
| ç ç©¶å®éª | AI è§é¢çæç ç©¶ | åŒæºå¯å®å¶ïŒäŸ¿äºå®éª |
#### äžéåçåºæ¯
– çµåœ±çº§å¶äœïŒéèŠæŽäžäžçåšç»å¶äœå·¥å
·
– 宿¶äº€äºåºçšïŒæšçé床å¯èœäžæ»¡è¶³å®æ¶æ§èŠæ±
– è¶
å€§è§æš¡ç产ïŒå»ºè®®èèæŽäžäžçåäžè§£å³æ¹æ¡
#### éå对æ¯
| 绎床 | AnimateDiff | å
¶ä»æ¹æ¡ (åŠ RunwayãPika) |
|—–|————|————————|
| ææ¬ | å
èŽ¹åŒæº | 订é
å¶/ææ¬¡ä»è޹ |
| 坿§æ§ | é«ïŒå¯å®å¶ïŒ | äœïŒé»çæå¡ïŒ |
| 莚é | è¯å¥œ | äŒç§ |
| æçšæ§ | äžçïŒéææ¯èæ¯ïŒ | é«ïŒå³åŒå³çšïŒ |
| éšçœ²çµæŽ»æ§ | é«ïŒæ¬å°/äºç«¯ïŒ | äœïŒäŸèµäºæå¡ïŒ |
5.5 æ§èœäŒå建议
# æ§èœäŒåé
眮瀺äŸ
optimization_config = {
# å¯çšå
åäŒå
"enable_memory_efficient_attention": True,
"enable_xformers_memory_efficient_attention": True,
# æ··å粟床
"torch_dtype": torch.float16,
# ååå€ç
"chunk_size": 32,
"overlap": 4,
# å蟚çäŒå
"resolution": (512, 512),
"max_frames": 16,
}
5.6 æ»ç»
AnimateDiff äœäžº AI è§é¢çæé¢åçéèŠåŒæºé¡¹ç®ïŒä»¥å ¶åæ°ç Motion Module 讟计ãçµæŽ»çæ¶æå掻è·ç瀟åºçæïŒäžºåŒåè ååäœè æäŸäºåŒºå€§çåšç»çæèœåãæ è®ºæ¯çšäºå 容åäœãèºæ¯å®éªè¿æ¯ææ¯ç ç©¶ïŒAnimateDiff éœæ¯äžäžªåŒåŸæ·±å ¥ç ç©¶ååºçšçäŒç§é¡¹ç®ã
æ žå¿äŒå¿æ»ç»ïŒ
– â
åŒæºå
莹ïŒåäžå奜
– â
æš¡ååè®Ÿè®¡ïŒæäºæ©å±
– â
ç€ŸåºæŽ»è·ïŒèµæºäž°å¯
– â
æ¯æå€ç§æš¡åå飿 Œ
– â
è¯å¥œçææ¡£åæçš
æœåšææïŒ
– â ïž éèŠäžå®çææ¯èæ¯
– â ïž å¯¹ GPU èµæºæäžå®èŠæ±
– â ïž çæèŽšéåæç€ºè¯åœ±åèŸå€§
å¯¹äºæ AI è§é¢çæéæ±çææ¯å¢éååäœè ïŒAnimateDiff æäŸäºäžäžªæ§ä»·æ¯æé«çè§£å³æ¹æ¡ïŒåŒåŸæ·±å ¥è¯äŒ°åå°è¯ã
⢠Git å éåœä»€ïŒ
git clone https://github.com/animatediff/AnimateDiff.git