返回文章列表

微調文字轉影片模型提升視覺內容生成

本文探討如何利用微調技術提升文字轉影片模型的效能,並以包含 22 個花卉影片的自定義資料集為例,詳細介紹了使用 BLIP-2 生成精確描述、調整影片解析度、組態模型引數以及運用 LoRA 技術進行模型訓練的完整流程,旨在生成更精確、更具視覺吸引力的影片內容。

機器學習 Web 開發

隨著 AI 技術的進步,文字轉影片模型在內容生成領域展現出巨大潛力。然而,通用模型在特定應用場景下往往表現不足。本文以花卉影片資料集為例,探討如何透過微調技術,提升模型生成符合特定主題影片的能力。首先,我們使用 BLIP-2 模型為每個影片生成準確的描述,確保文字與視覺資訊的緊密結合。接著,將影片解析度標準化為 384x256,以提升模型訓練效率。在模型訓練階段,我們採用 LoRA 技術,有效降低微調所需的計算資源,並透過調整學習率、dropout 等引數,最佳化模型效能。最終,微調後的模型能夠更精確地理解文字描述,並生成與花卉主題高度相關的影片內容。

從指令碼到螢幕:揭開文字轉影片生成的神秘面紗

在人工智慧的動態領域中,微調文字轉影片模型為生成精確符合各種使用者群體獨特需求的內容提供了一條創新途徑。這種先進的方法顯著增強了自定義影片的創作,直接滿足了不同領域中特定受眾的興趣或目標,包括教育、行銷和娛樂。透過自定義預訓練模型以適應獨特的領域,開發者和創作者能夠超越標準影片輸出的限制。這種自定義促進了獨特視覺效果的製作,能夠與目標受眾建立深層次的聯絡,從而提高使用者參與度並豐富整體體驗。

然而,要充分發揮微調文字轉影片技術的全部潛力,卻面臨著重重障礙。微調的主要挑戰在於高品質、專門的文字轉影片資料集的可用性有限。許多領域應用都受到適當資料的缺乏,這阻礙了模型準確捕捉和重現專門內容細微差別的能力。與此同時,在影片資料上訓練複雜模型所需的龐大計算成本也是個問題。調整文字轉影片模型的眾多引數需要大量的處理能力,通常使得微調過程對於那些無法取得先進運算基礎設施的人來說是不切實際的。

為瞭解決微調文字轉影片模型所面臨的固有挑戰,我們開展了一項創新之旅,使用了一個包含22個影片的自定義資料集,所有這些影片都是親自收集的,並以多樣化的花卉為特色。這一獨特的收藏提供了一個可控卻高度相關的背景,用於嘗試微調技術,旨在顯著提高模型在生成準確捕捉特定視覺主題的影片方面的效能。

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title 微調文字轉影片模型提升視覺內容生成

package "文字轉影片微調" {
    package "資料準備" {
        component [花卉影片資料集] as flower
        component [BLIP-2 描述生成] as blip
        component [解析度標準化] as resize
    }

    package "模型訓練" {
        component [LoRA 微調] as lora
        component [學習率調整] as lr
        component [Dropout 設定] as dropout
    }
}

package "影片生成" {
    component [文字輸入] as text
    component [模型推理] as infer
    component [影片輸出] as video
}

flower --> blip : 22 個影片
blip --> resize : 精確描述
resize --> lora : 384x256
lora --> lr : 低資源微調
lr --> dropout : 參數優化
text --> infer : 生成請求
infer --> video : 主題影片

note right of blip
  BLIP-2 特點:
  - 視覺-語言對齊
  - 精確標題生成
  - 上下文理解
end note

note right of lora
  LoRA 優勢:
  - 低計算成本
  - 快速收斂
  - 記憶體效率
end note

@enduml

圖表翻譯: 此圖示呈現了使用自定義花卉影片資料集並結合BLIP-2生成精確描述,最終微調文字轉影片模型以生成高品質自定義影片的流程。

為了增加資料集的價值,我們使用了Bootstrapped Language Image Pretraining 2(BLIP-2),這是一種尖端的模型,以其生成精確和描述性標題的能力而聞名。透過將BLIP應用於我們的花卉影片集合,我們確保每個內容都與準確反映其視覺元素的文字描述配對。這一關鍵步驟不僅豐富了我們的資料集,還使其為更有效的微調過程做好準備,為創作視覺上吸引人且在上下文中相關的影片奠定了基礎。

BLIP-2建立在其前身的基本原理之上,代表了視覺和文字資料處理的更先進融合,為人工智慧和機器學習領域樹立了新的標準。這個增強的模型透過結合最先進的技術,更深入地理解影像內容和其對應標題的上下文,促進了從視覺輸入中生成更細緻和精確的文字。

BLIP-2的核心架構

BLIP-2的核心架構(圖3-4)是一個進化的視覺和語言元件整合。它利用先進的視覺變換器(ViT)來細緻分析視覺輸入,從影像中提取更豐富的特徵集。同時,升級的語言模型處理文字資料,更深入地理解語言的語義、語法和上下文細微差別。透過增強的注意力機制和神經網路層,BLIP-2實作了視覺和文字資訊的更複雜合成,能夠生成不僅準確而且在上下文和情感深度上豐富的標題。

# 使用BLIP-2生成影像標題的範例程式碼
from transformers import Blip2Processor, Blip2ForConditionalGeneration

# 初始化BLIP-2處理器和模型
processor = Blip2Processor.from_pretrained("Salesforce/blip2-opt-2.7b")
model = Blip2ForConditionalGeneration.from_pretrained("Salesforce/blip2-opt-2.7b")

# 載入影像並生成標題
def generate_caption(image_path):
    inputs = processor(images=image_path, return_tensors="pt")
    generated_ids = model.generate(**inputs)
    generated_caption = processor.batch_decode(generated_ids, skip_special_tokens=True)[0].strip()
    return generated_caption

# 測試函式
print(generate_caption("path/to/image.jpg"))

內容解密:

  1. 匯入必要的函式庫:程式碼首先匯入了處理BLIP-2模型所需的Blip2ProcessorBlip2ForConditionalGeneration類別。
  2. 初始化BLIP-2模型和處理器:使用預訓練的BLIP-2模型和處理器進行初始化,這些是從Hugging Face模型函式庫中載入的。
  3. 定義生成標題的函式generate_caption函式接受一個影像路徑作為輸入,使用Blip2Processor處理影像,並利用Blip2ForConditionalGeneration生成標題。
  4. 測試函式:最後,程式碼測試了generate_caption函式,透過傳遞一個影像路徑來生成並列印對應的標題。

BLIP-2的訓練方法結合了一種改進的對比學習方法,旨在最佳化模型準確配對影像與正確標題的能力,並有效區分它們與不匹配的配對。廣泛的預訓練機制在龐大且多樣化的影像-文字配對資料集上進行補充,這擴大了模型對廣泛視覺概念和語言風格的理解。這種全面的訓練賦予了BLIP-2在從影像生成文字方面的卓越能力,使其成為從增強自動標題到創意內容生成等一系列應用的寶貴資產。

步驟 1:安裝必要的函式庫

要開始我們的微調之旅,第一步是透過安裝必要的函式庫來建立我們的環境。這些函式庫包括處理影片和影像處理以及模型訓練所需的函式庫。這一步驟確保我們具備微調程式所需的所有工具。

from google.colab import drive
drive.mount('/content/drive')

首先,我們從 google.colab 匯入 drive 模組,並將 Google Drive 掛載到 Colab 筆記本中的 /content/drive 目錄下,這樣就可以存取儲存在 Google Drive 中的檔案。

內容解密:

  1. from google.colab import drive:從 google.colab 匯入 drive 模組,用於與 Google Drive 互動。
  2. drive.mount('/content/drive'):將 Google Drive 掛載到指定的目錄,讓 Colab 可以讀取和寫入 Google Drive 中的檔案。
%cd /content/drive/MyDrive
!git clone https://github.com/ExponentialML/Text-To-Video-Finetuning.git
%cd Text-To-Video-Finetuning/
!pip install -r requirements.txt
!pip install triton
!pip install compel

上述程式碼片段依序執行以下操作:

  1. 將目前的工作目錄變更為 /content/drive/MyDrive
  2. 從 GitHub 複製 Text-To-Video-Finetuning 儲存函式庫到目前的工作目錄中。
  3. 將目前的工作目錄變更為新複製的 Text-To-Video-Finetuning 目錄。
  4. 安裝 Text-To-Video-Finetuning 目錄中 requirements.txt 檔案所列出的 Python 相依性套件。
  5. 安裝 tritoncompel 函式庫。Triton 設計用於幫助編寫高效能的 GPU 程式碼。

內容解密:

  1. %cd /content/drive/MyDrive:變更工作目錄到 /content/drive/MyDrive
  2. !git clone https://github.com/ExponentialML/Text-To-Video-Finetuning.git:從 GitHub 複製指定的儲存函式庫。
  3. %cd Text-To-Video-Finetuning/:進入剛剛複製的儲存函式庫目錄。
  4. !pip install -r requirements.txt:根據 requirements.txt 安裝必要的 Python 套件。
  5. !pip install triton!pip install compel:安裝額外的 Python 套件。
!git clone https://github.com/ExponentialML/Video-BLIP2-Preprocessor.git
%cd Video-BLIP2-Preprocessor/
!pip install -r requirements.txt

在上述程式碼中,我們首先從 GitHub 複製名為 Video-BLIP2-Preprocessor 的儲存函式庫到本機。複製成功後,命令 %cd Video-BLIP2-Preprocessor/ 將目前的工作目錄變更為新複製的 Video-BLIP2-Preprocessor 目錄,以確保後續命令在該目錄中執行。最後,命令 !pip install -r requirements.txt 安裝該目錄中 requirements.txt 檔案所列出的 Python 相依性套件。

內容解密:

  1. !git clone https://github.com/ExponentialML/Video-BLIP2-Preprocessor.git:複製儲存函式庫。
  2. %cd Video-BLIP2-Preprocessor/:切換到儲存函式庫目錄。
  3. !pip install -r requirements.txt:安裝所需的 Python 套件。

步驟 2:資料載入與預處理

在步驟 2 中,我們專注於匯入我們的 22 個影片集合,並進行必要的預處理任務。我們的首要目標是將所有影片的格式標準化為 384x256 畫素,以確保與我們的文字轉影片合成模型的統一性和相容性。接著,我們將為每個影片生成標題,豐富我們的資料集,使其包含準確反映影片內容的描述性文字資訊。此步驟對於準備我們的資料進行微調至關重要,為提升模型效能奠定堅實的基礎。

from moviepy.editor import VideoFileClip
import os

上述程式碼匯入了 moviepy.editor 模組中的 VideoFileClip 類別,用於讀取影片檔案並對其進行編輯或處理。然後,我們匯入了 os 模組,該模組提供了與作業系統互動的功能。

內容解密:

  1. from moviepy.editor import VideoFileClip:匯入用於處理影片的類別。
  2. import os:匯入用於與作業系統互動的模組。
input_path = '/content/drive/MyDrive/sampe_videos_for_fine_tuning'
output_path = '/content/drive/MyDrive/sampe_videos_for_fine_tuning_384_256'
os.makedirs(output_path, exist_ok=True)
for filename in os.listdir(input_path):
    if not filename.endswith('.mp4'):
        continue
    video_path = os.path.join(input_path, filename)
    output_video_path = os.path.join(output_path, f"processed_{filename}")
    clip = VideoFileClip(video_path)
    processed_clip = clip.resize(newsize=(384, 256)).without_audio()
    processed_clip.write_videofile(output_video_path, codec='libx264', audio_codec=None)
print("Video processing completed.")

透過上述程式碼,我們匯入了一批影片,並將其解析度調整為 384x256 畫素,這是確保資料集一致性的關鍵步驟。首先,我們定義了兩個路徑:input_path 指向原始樣本影片的儲存位置,而 output_path 指定了我們將儲存處理後的影片的位置。我們使用 os.makedirs 函式來建立輸出目錄,並設定 exist_ok=True 以確保如果目錄已存在,則不會丟擲錯誤。

內容解密:

  1. 設定輸入和輸出的路徑。
  2. 建立輸出目錄(如果不存在)。
  3. 遍歷輸入目錄中的每個檔案,篩選出 MP4 檔案。
  4. 對每個 MP4 檔案進行處理,包括縮放至指定解析度和移除音訊。
  5. 將處理後的影片儲存到輸出目錄中。
%cd /content/drive/MyDrive/Text-To-Video-Finetuning/Video-BLIP2-Preprocessor
!python preprocess.py \
--video_directory /content/drive/MyDrive/sampe_videos_for_fine_tuning_384_256 \
--config_name "captions_for_videos" \
--config_save_name "captions_for_videos" \
--prompt_amount 8 \
--max_prompt_length 100

此步驟中,我們進入指定的工作目錄,並執行 Python 指令碼 preprocess.py,傳入多個引數以組態預處理流程,包括指定影片目錄、組態名稱、儲存名稱、提示數量和最大提示長度等。

內容解密:

  1. 切換工作目錄到指定的路徑。
  2. 執行 Python 指令碼進行預處理,並傳入必要的引數以控制預處理的行為。

從指令碼到螢幕:揭開文字轉影片生成的神秘面紗

第三步:模型訓練(微調)

在第三步中,我們進入了模型訓練的關鍵階段,特別是微調。這一階段對於使預訓練模型適應我們的特定任務至關重要,從而增強其理解和生成與我們資料集緊密相關內容的能力。

安裝Git LFS並下載預訓練模型

首先,我們安裝了Git Large File Storage(LFS)擴充套件,這是一種版本控制系統,旨在透過在儲存函式庫中儲存對這些檔案的參照來改善大型檔案的處理,而實際的檔案內容則儲存在遠端伺服器上。這透過以下命令實作:

!git lfs install

接著,我們使用以下命令下載了Hugging Face模型中心上的預訓練模型:

!git clone https://huggingface.co/damo-vilab/text-to-video-ms-1.7b

組態檔案建立

接下來,我們建立了一個名為my_config_hq.yaml的組態檔案,用於定義模型的訓練引數。以下是組態檔案的內容:

pretrained_model_path: "/content/drive/MyDrive/Text-To-Video-Finetuning/text-to-video-ms-1.7b"
output_dir: "./outputs"
dataset_types:
- 'json'
use_offset_noise: False
rescale_schedule: False
extend_dataset: False
cache_latents: True
cached_latent_dir: null 
train_text_encoder: False
lora_version: "cloneofsimo"
use_unet_lora: True
use_text_lora: True
lora_unet_dropout: 0.1
lora_text_dropout: 0.1
save_lora_for_webui: True
only_lora_for_webui: False
save_pretrained_model: True
unet_lora_modules:
- "UNet3DConditionModel"
text_encoder_lora_modules:
- "CLIPEncoderLayer"
lora_rank: 16
train_data:
  width: 384
  height: 256
  use_bucketing: True
  sample_start_idx: 1
  fps: 24
  frame_step: 1
  n_sample_frames: 8
  single_video_path: ""
  single_video_prompt: ""
  fallback_prompt: ''
  json_path: "/content/drive/MyDrive/Text-To-Video-Finetuning/Video-BLIP2-Preprocessor/train_data/captions_for_videos.json"
validation_data:
  prompt: ""
  sample_preview: True
  num_frames: 16
  width: 384
  height: 256
  num_inference_steps: 25
  guidance_scale: 9
learning_rate: 1e-5
adam_weight_decay: 1e-2
extra_unet_params: null
extra_text_encoder_params: null

#### 組態檔案解密:

上述組態檔案定義了模型訓練的各種引數,包括預訓練模型的路徑、輸出目錄、資料集型別、訓練引數等。其中,pretrained_model_path指定了預訓練模型的路徑,output_dir指定了輸出目錄。dataset_types指定了資料集的型別為JSON。train_data部分定義了訓練資料的相關引數,包括影片的寬高、FPS、取樣起始索引等。validation_data部分定義了驗證資料的相關引數,包括提示詞、取樣預覽、幀數等。

微調過程詳解

在微調過程中,我們使用了LoRA(Low-Rank Adaptation)技術來適應預訓練模型。LoRA是一種引數高效的微調方法,可以有效地降低微調所需的計算資源和記憶體佔用。在組態檔案中,我們設定了use_unet_lorause_text_lora為True,以啟用LoRA技術。

LoRA技術解密:

LoRA技術透過在預訓練模型的權重矩陣中新增低秩矩陣來實作微調。這種方法可以有效地捕捉資料集中的特定模式和特徵,從而提高模型的表現。在組態檔案中,我們設定了lora_rank為16,以控制LoRA矩陣的秩。