深度學習技術的進步使得影像字幕生成成為可能,它能自動為影像產生描述性文字。此技術需要整合影像處理和自然語言處理,將影像的視覺特徵轉換為語義相關的文字描述。構建影像字幕生成系統的核心步驟包含資料收集、影像預處理、語言建模以及視覺和文字特徵的融合。其中,資料預處理至關重要,它直接影響模型的訓練效果和最終效能。本文將詳細介紹如何使用預訓練的 Xception 模型提取影像特徵,並使用 TensorFlow 的 TextVectorization 層處理文字資料,為構建一個高效的影像字幕生成系統奠定基礎。此外,我們也將探討字幕長度分析,這對於模型的訓練和最佳化至關重要。
影像到文字:影像字幕生成系統
影像字幕生成是一種人工智慧技術,旨在自動為給定的輸入影像生成描述性和語境相關的字幕。這種系統旨在橋接視覺內容和自然語言理解之間的差距,使機器能夠理解和描述視覺訊息。以下是影像字幕生成系統的方法和步驟。
步驟概覽
- 資料收集和準備:收集和準備適合的資料集以訓練和評估影像字幕生成系統。
- 影像預處理:對輸入影像進行預處理,以提取有用的特徵。
- 語言建模:使用語言模型(例如序列或變換器架構)生成字幕,考慮視覺特徵和之前生成的單詞。
- 視覺和文字模式的結合:結合視覺和文字模式,以生成描述視覺內容和結合語境訊息的字幕。
挑戰
- 模糊性和主觀性:影像可以以不同的方式解釋,導致多個有效的字幕。
- 處理複雜場景:影像可以包含複雜的場景,具有多個物體、關係和語境訊息。
- 資料收集和註解:影像字幕模型依賴於大型註解資料集進行訓練,收集和註解這些資料集是勞動密集的。
進展和應用
- 注意力機制:注意力機制可以幫助提高視覺和文字元素之間的對齊。
- 變換器架構:變換器架構可以幫助生成更好的字幕。
- 轉移學習:轉移學習技術(例如預訓練在大型影像和文字資料集上)已經被證明對影像字幕生成有益。
- 實際應用:影像字幕生成已經在各個領域找到實際應用,例如無障礙、影像搜尋和社交媒體。
內容解密:
以上步驟和挑戰是影像字幕生成系統的核心。影像預處理是提取有用的特徵的第一步,語言建模是生成字幕的關鍵步驟。結合視覺和文字模式可以生成更好的字幕。注意力機制、變換器架構和轉移學習技術可以幫助提高字幕的品質。
flowchart TD A[影像預處理] --> B[語言建模] B --> C[視覺和文字模式的結合] C --> D[字幕生成]
圖表翻譯:
此圖表示了影像字幕生成系統的流程。影像預處理是第一步,語言建模是第二步,視覺和文字模式的結合是第三步,最後是字幕生成。注意力機制、變換器架構和轉移學習技術可以幫助提高字幕的品質。
影像字幕的力量:開啟視覺內容的新世界
影像字幕是一種能夠將影像轉換為文字描述的技術,對於視覺障礙人士來說,這項技術可以幫助他們更好地理解周圍的環境。同時,影像字幕也可以用於內容生成、影像搜尋和多媒體故事講述等領域。
內容生成:影像字幕的潛力
影像字幕可以用於自動生成影像描述,從而減少手動標注的工作量和時間。這項技術特別適合於社交媒體平臺、新聞機構或電子商務網站等場合。透過影像字幕,影像可以根據其內容和上下文進行搜尋和篩選,從而提高使用者的搜尋效率。
影像搜尋和檢索:提高影像的可搜尋性
影像字幕可以顯著提高影像資料函式庫的可搜尋性。透過對影像進行字幕標注,影像可以根據其內容和上下文進行搜尋和篩選。這使得使用者可以更容易地找到相關的影像,無論是用於個人使用、研究還是創意專案。
多媒體故事講述:創造沉浸式體驗
影像字幕可以用於創造沉浸式的多媒體體驗。透過結合影像和相關的字幕,故事講述可以變得更加吸引人和互動性。這項技術特別適合於虛擬現實(VR)和增強現實(AR)等應用。
瞭解資料:Flickr8K資料集
Flickr8K資料集是一個廣泛使用的基準資料集,用於影像字幕的研究和評估。該資料集包含8,092張影像,每張影像都有五個唯一的字幕。這些字幕由人類標注者生成,旨在捕捉每張影像的多樣性和描述。
資料集結構
Flickr8K資料集包含兩個主要部分:影像資料集和字幕資料集。影像資料集包含8,000張JPEG格式的影像,代表了多樣的主題和場景。字幕資料集包含了一個文字檔案,內含所有影像的字幕,每行對應一張影像的描述。
標題檔案格式
字幕檔案中的每一行都遵循一個特定的格式:image_name#caption_number caption_text
。其中,image_name
是影像檔案的識別符號,caption_text
是對應的描述文字。
圖表翻譯:
graph LR A[影像] --> B[字幕] B --> C[搜尋] C --> D[篩選] D --> E[結果]
此圖表示了影像字幕如何提高影像的可搜尋性和篩選效率。
影像字幕生成模型的資料準備
為了評估訓練後的影像字幕生成模型的效能和泛化能力,我們需要準備適當的資料。每一行資料對應於「Flickr8k_Dataset」資料夾中的一個影像識別碼。
請注意,實際的影像檔案(JPEG)存放在「Flickr8k_Dataset」資料夾中,而字幕檔案(文字)則存放在「Flickr8k.token.txt」和「Flickr_8k.trainImages.txt」等檔案中。這些檔案共同提供了訓練、驗證和測試影像字幕生成模型在Flickr8k資料集上所需的資料。字幕檔案中提供的影像識別碼可以用來將字幕與其對應的影像檔案在「Flickr8k_Dataset」資料夾中進行關聯。
資料預處理
在將資料餵入AI模型之前,我們需要預處理影像和文字資料。讓我們開啟一個Google Colab筆記本,首先下載資料使用以下程式碼:
!wget https://example.com/Flickr8k_Dataset.zip
!wget https://example.com/Flickr8k_text.zip
下載完壓縮檔後,我們需要解壓縮它們。請參考以下程式碼:
import zipfile
# 解壓縮影像資料集
with zipfile.ZipFile('Flickr8k_Dataset.zip', 'r') as zip_ref:
zip_ref.extractall()
# 解壓縮文字資料集
with zipfile.ZipFile('Flickr8k_text.zip', 'r') as zip_ref:
zip_ref.extractall()
資料解壓縮步驟:
- 下載「Flickr8k_Dataset.zip」和「Flickr8k_text.zip」。
- 使用
zipfile
模組解壓縮這兩個壓縮檔。 - 確保所有必要的資料都已經解壓縮並準備好供後續使用。
圖表翻譯:
flowchart TD A[下載資料] --> B[解壓縮影像資料] B --> C[解壓縮文字資料] C --> D[準備資料]
此圖表描述了下載、解壓縮和準備Flickr8k資料集的步驟。每一步驟都對應到上述程式碼和說明中的一個特定動作。
影像處理與資料分析
在進行影像處理與資料分析之前,需要先準備好相關的資料和工具。以下是步驟:
步驟1:解壓縮資料
首先,需要解壓縮下載的資料集,包括影像和文字資料。使用以下命令:
!unzip -q Flickr8k_Dataset.zip
!unzip -q Flickr8k_text.zip
步驟2:刪除壓縮檔
解壓縮完成後,可以刪除壓縮檔以節省空間:
!rm Flickr8k_Dataset.zip Flickr8k_text.zip
步驟3:匯入必要的函式庫
接下來,需要匯入必要的函式庫,包括 NumPy、Pandas、TensorFlow、PIL、OS、Joblib 和 Matplotlib:
import numpy as np
import pandas as pd
import tensorflow as tf
from PIL import Image
import os
import joblib
import matplotlib.pyplot as plt
from tqdm.notebook import tqdm
步驟4:掛載 Google Drive
掛載 Google Drive 以儲存和載入序列化物件:
drive.mount('/gdrive')
步驟5:讀取文字檔
使用 Pandas 函式庫讀取文字檔,包括 Flickr8k.token.txt
:
cap_df = pd.read_csv("Flickr8k.token.txt", sep="\t", header=None)
這些步驟完成後,就可以開始進行影像處理與資料分析了。
內容解密:
!unzip
命令用於解壓縮 zip 檔。!rm
命令用於刪除檔案。import
陳述式用於匯入必要的函式庫。drive.mount
函式用於掛載 Google Drive。pd.read_csv
函式用於讀取 csv 檔或其他分隔檔。
圖表翻譯:
flowchart TD A[開始] --> B[解壓縮資料] B --> C[刪除壓縮檔] C --> D[匯入必要的函式庫] D --> E[掛載 Google Drive] E --> F[讀取文字檔] F --> G[進行影像處理與資料分析]
這個流程圖展示了資料準備的步驟,從解壓縮資料到讀取文字檔。每個步驟都很重要,為後續的影像處理與資料分析奠定了基礎。
影像資料預處理
在進行影像資料分析之前,我們需要對資料進行預處理。這包括了對影像檔案名稱和影像描述的處理。
處理影像檔案名稱
首先,我們需要從影像檔案名稱中移除 “#” 字元和描述 ID。同時,我們也需要在檔案名稱前面增加 “./Flicker8k_Dataset/",以確保我們可以正確地讀取影像檔案。以下是實作這一步驟的程式碼:
cap_df["file_name"] = cap_df["file_name"].apply(lambda x: x.split("#")[0])
cap_df["file_name"] = cap_df["file_name"].apply(lambda x: "./Flicker8k_Dataset/" + x)
在這段程式碼中,第一行使用 split()
函式將檔案名稱分割為兩部分,以 “#” 字元為分割點,並只保留第一部分。第二行則是在檔案名稱前面增加了 “./Flicker8k_Dataset/",以確保檔案路徑的完整性。
處理影像描述
接下來,我們需要對影像描述進行預處理。這包括了移除非字母和非空白字元,轉換為小寫,並增加特殊的開始和結束符號。以下是實作這一步驟的程式碼:
cap_df["caption"] = cap_df["caption"].str.replace('[^\w\s]', '', regex=True)
cap_df["caption"] = cap_df["caption"].apply(lambda x: x.lower().strip())
cap_df["caption"] = cap_df["caption"].apply(lambda x: "[START] " + x + " [END]")
在這段程式碼中,第一行使用正規表示式移除非字母和非空白字元。第二行轉換描述為小寫,並移除任何前後空白字元。第三行增加特殊的開始和結束符號 “[START] " 和 " [END]” 到描述的開始和結束。
圖表翻譯:
flowchart TD A[原始資料] --> B[移除 "#" 字元和描述 ID] B --> C[增加檔案路徑] C --> D[移除非字母和非空白字元] D --> E[轉換為小寫] E --> F[增加開始和結束符號] F --> G[預處理完成]
這個流程圖展示了影像資料預處理的步驟,從原始資料開始,經過移除 “#” 字元和描述 ID、增加檔案路徑、移除非字母和非空白字元、轉換為小寫,最終增加開始和結束符號,完成預處理。
處理圖片標題資料的前處理
在進行圖片標題資料的分析之前,需要對資料進行前處理,以確保資料的品質和一致性。首先,我們需要定義最小和最大序列長度,分別為 MIN_SEQ_LENGTH
和 MAX_SEQ_LENGTH
。這兩個變數分別代表了允許的最小和最大標題長度。
MIN_SEQ_LENGTH = 5
MAX_SEQ_LENGTH = 30
接下來,我們需要篩選出那些標題長度超出此範圍的圖片。這可以透過以下程式碼實作:
images_to_remove = cap_df[cap_df["caption"].apply(lambda x: len(x.split()) <= MIN_SEQ_LENGTH or len(x.split()) > MAX_SEQ_LENGTH)]
這段程式碼建立了一個新的 DataFrame images_to_remove
,其中包含了那些標題長度不在允許範圍內的圖片。
移除不符合條件的圖片
為了從原始 DataFrame cap_df
中移除這些不符合條件的圖片,我們需要先將 images_to_remove
DataFrame 中的 “file_name” 欄位轉換為一個 Python 列表:
images_to_remove = images_to_remove["file_name"].to_list()
然後,我們可以使用 isin()
方法來篩選出那些不在 images_to_remove
列表中的圖片,並將結果重新指定給 cap_df
:
cap_df = cap_df[~cap_df["file_name"].isin(images_to_remove)]
這樣,就成功地從 cap_df
中移除了那些標題長度不在允許範圍內的圖片。
內容解密:
上述程式碼的主要目的是對圖片標題資料進行前處理,篩除那些標題長度不符合要求的圖片。這是為了確保資料的品質和一致性,以便於後續的分析和處理。透過定義最小和最大序列長度,然後篩選和移除不符合條件的圖片,可以有效地提高資料的可靠性和準確性。
圖表翻譯:
flowchart TD A[開始] --> B[定義最小和最大序列長度] B --> C[篩選不符合條件的圖片] C --> D[移除不符合條件的圖片] D --> E[更新原始DataFrame]
此圖表展示了對圖片標題資料進行前處理的流程,從定義最小和最大序列長度開始,到篩選和移除不符合條件的圖片,最後更新原始 DataFrame。
影像處理模型建立
在進行影像處理之前,我們需要準備好訓練和測試資料集。首先,我們已經有了 cap_df
DataFrame,其中包含所有影像檔案名稱,其字幕長度超過五個字且小於或等於 30 個字。接下來,我們需要讀取 Flickr_8k.trainImages.txt
檔案,以生成訓練資料集。
import pandas as pd
# 讀取訓練影像檔案名稱
train_df = pd.read_csv("Flickr_8k.trainImages.txt", header=None)
train_df.columns = ["file_name"]
# 讀取測試影像檔案名稱
test_df = pd.read_csv("Flickr_8k.testImages.txt", header=None)
test_df.columns = ["file_name"]
為了保持完整的檔案路徑,我們將 ./Flicker8k_Dataset/
附加到 train_df
和 test_df
中的檔案名稱上。
# 更新檔案路徑
train_df["file_name"] = train_df["file_name"].apply(lambda x: "./Flicker8k_Dataset/" + x)
test_df["file_name"] = test_df["file_name"].apply(lambda x: "./Flicker8k_Dataset/" + x)
接下來,我們根據 train_df
和 test_df
中的檔案名稱,篩選 cap_df
中的資料。
# 篩選訓練和測試資料
train_df = cap_df[cap_df["file_name"].isin(train_df["file_name"])]
test_df = cap_df[cap_df["file_name"].isin(test_df["file_name"])]
內容解密:
以上步驟主要是為了準備好影像處理的訓練和測試資料集。首先,我們讀取了 Flickr_8k.trainImages.txt
和 Flickr_8k.testImages.txt
檔案,然後更新了檔案路徑。最後,我們根據檔案名稱篩選了 cap_df
中的資料,以得到最終的訓練和測試資料集。
圖表翻譯:
flowchart TD A[讀取訓練影像檔案] --> B[更新檔案路徑] B --> C[篩選訓練資料] A --> D[讀取測試影像檔案] D --> E[更新檔案路徑] E --> F[篩選測試資料] C --> G[得到最終訓練資料] F --> H[得到最終測試資料]
此圖表展示了建立影像處理模型的步驟,從讀取訓練和測試影像檔案,更新檔案路徑,篩選資料,到得到最終的訓練和測試資料集。
影像特徵提取
在深度學習中,影像特徵提取是一個非常重要的步驟。為了從影像資料中提取有意義的特徵,我們將使用一個預先訓練好的模型。在將影像資料輸入模型之前,我們需要讀取影像並對其進行預處理。在這個例子中,我們將使用一個名為 Xception 的預訓練模型,該模型可在 tf.keras.applications.xception.Xception
中找到。
Xception 是對卷積神經網路中 Inception 模組的解釋。為了方便起見,我們將定義一個名為 extract_image_features
的函式,該函式接受預訓練模型和影像檔案名,然後讀取和預處理影像。以下是相關程式碼:
image_model = tf.keras.applications.xception.Xception(include_top=False, pooling='avg')
def extract_image_features(model, files):
features = {}
for filename in tqdm(files):
image = Image.open(filename)
image = image.resize((299, 299))
image = np.expand_dims(image, axis=0)
image = image / 255.0
內容解密:
- 載入預訓練模型:我們使用
tf.keras.applications.xception.Xception
載入 Xception 預訓練模型,並設定include_top=False
以移除模型的頂層分類器,同時設定pooling='avg'
以啟用平均池化。 - 定義影像特徵提取函式:我們定義了
extract_image_features
函式,該函式接受預訓練模型和影像檔案名列表作為輸入。 - 讀取和預處理影像:在函式內部,我們遍歷每個影像檔案,使用
Image.open
讀取影像,然後調整影像大小為 (299, 299) 以符合 Xception 模型的輸入要求。接著,我們使用np.expand_dims
在軸 0 上增加一個維度,以使影像能夠被模型接受。最後,我們將影像資料除以 255.0 進行歸一化。
圖表翻譯:
flowchart TD A[開始] --> B[載入預訓練模型] B --> C[定義影像特徵提取函式] C --> D[讀取和預處理影像] D --> E[調整影像大小] E --> F[增加維度] F --> G[歸一化] G --> H[傳回特徵]
此圖表描述了從載入預訓練模型到傳回影像特徵的整個過程,展示了每一步驟之間的邏輯關係。
影像特徵提取與模型建立
在進行影像特徵提取時,我們使用了預訓練的 Xception 模型,該模型已經在 ImageNet 資料集上進行了訓練。為了提取影像特徵,我們建立了一個名為 extract_image_features
的函式,該函式接收影像模型和影像檔案名列表作為輸入。
image_model = tf.keras.applications.Xception(weights='imagenet', include_top=False)
在這個函式中,我們首先讀取每個影像檔案,並使用 PIL函式庫將其重塑為 (299x299) 的大小,因為這是 Xception 模型的預設輸入大小。然後,我們使用 NumPy 的 expand_dims
函式為影像陣列增加一個額外的維度,以便將其轉換為 3D 陣列。接著,我們對影像進行預處理,包括將畫素值正規化到 [0, 1] 的範圍內。
image = Image.open(filename)
image = image.resize((299, 299))
image_array = np.array(image)
image_array = np.expand_dims(image_array, axis=0)
image_array = image_array / 255.0
然後,我們將預處理後的影像輸入 Xception 模型,以提取影像特徵。提取到的特徵向量儲存在一個字典中,字典的鍵是影像檔案名,值是對應的特徵向量。
feature = image_model.predict(image_array, verbose=0)
features[filename] = feature
由於使用 Xception 模型提取整個訓練資料集的影像特徵可能需要相當長的時間,因此一旦建立了訓練影像的特徵向量,我們就可以將包含所有向量的字典儲存到磁碟上,以便未來使用。
joblib.dump(features, "train_features.p")
圖表翻譯:
flowchart TD A[影像檔案] --> B[讀取影像] B --> C[重塑影像] C --> D[增加額外維度] D --> E[正規化影像] E --> F[提取影像特徵] F --> G[儲存特徵向量]
內容解密:
在這個過程中,我們使用了 Xception 模型來提取影像特徵。首先,我們讀取影像檔案,然後重塑它們以符合 Xception 模型的輸入要求。接著,我們增加一個額外的維度到影像陣列中,以便它可以被 Xception 模型處理。然後,我們對影像進行正規化,以確保所有畫素值都在 [0, 1] 的範圍內。最後,我們使用 Xception 模型提取影像特徵,並將提取到的特徵向量儲存到一個字典中。
建立文字向量器
除了影像資料外,我們還需要處理文字資料以進行字幕生成。為了將文字特徵對映到整數序列,我們需要建立一個文字向量器。
tokenizer = tf.keras.preprocessing.text.Tokenizer(num_words=5000)
tokenizer.fit_on_texts(captions)
內容解密:
在這個過程中,我們建立了一個文字向量器,以便將字幕文字轉換為整數序列。首先,我們定義了一個 Tokenizer
物件,並指定了要使用的最大單詞數量。然後,我們使用 fit_on_texts
方法將文字向量器適應到字幕文字資料上,這樣就可以將字幕文字轉換為整數序列了。
文字向量化
在深度學習中,文字資料需要被轉換為數值向量,以便模型可以處理它們。為了實作這一點,我們使用了TensorFlow的TextVectorization
層。
vectorizer = tf.keras.layers.TextVectorization(
standardize=None,
ragged=True
)
在這段程式碼中,我們建立了一個TextVectorization
層,該層用於將文字資料轉換為數值向量。由於我們已經將字幕文字轉換為小寫並刪除了標點符號,我們將standardize
引數設定為None
。ragged
引數指示輸入資料是否可以具有不同的長度(ragged tensors)。透過這種方式,TextVectorization
層可以處理不同長度的序列。
接下來,我們呼叫了adapt
方法來使向量化器學習給定資料的詞匯表。在適應過程中,TextVectorization
層對文字進行分詞,根據資料中的唯一標籤建立詞匯表,並為每個標籤分配一個唯一的整數索引。適應後,向量化器物件將準備好使用學習到的詞匯表和分詞方案將新文字資料轉換為數值向量。
vectorizer.adapt(list(cap_df["caption"]))
我們可以使用以下程式碼取得向量化器物件的詞匯表長度:
vocab_size = len(vectorizer.get_vocabulary())
讓我們列印預詞匯表中的前10個單詞,如下圖所示:
詞匯表樣本
如上所示,除了從字幕文字中提取的單詞外,還增加了兩個額外的標籤。一個是用於空字串,另一個是用於未知單詞。
我們可以將向量化器應用於一個示例句子,並獲得文字的向量化形式,如下圖所示:
對示例文字進行向量化
對於影像字幕模型,我們必須將影像和文字一起作為輸入傳遞。文字輸入應該以下一個單詞預測應用程式的形式框定。這裡,我們需要傳遞一組單詞來預測下一個單詞。為了實作這一點,我們將每個字幕文字分成塊,以便每個單詞都可以被預測。例如,如果字幕文字是“[START] 一個女孩進入一棟木屋 [END]”,我們將這個文字分成如下表所示的塊:
輸入文字 | 預測單詞 |
---|---|
[START] | a |
[START] a | girl |
[START] a girl | going |
[START] a girl going | into |
[START] a girl going into | a |
[START] a girl going into a | wooden |
[START] a girl going into a woo | den |
[START] a girl going into a woo den | building |
圖表翻譯:
此圖表展示瞭如何將字幕文字分成塊,以便每個單詞都可以被預測。這種方法使得模型可以學習字幕文字的語法和語義結構。
圖片字幕長度分析
為了了解給定資料集中的字幕長度,我們需要找出字幕中最長的那一個,或是說明字幕中最多的字數。以下程式碼展示瞭如何達到這個目的:
max_length = max(cap_df["caption"].apply(lambda x: len(x.split())))
內容解密:
這段程式碼的作用是計算資料集中所有字幕的最大長度。首先,cap_df["caption"]
這部分是從資料框架 cap_df
中選取名為 “caption” 的欄位。然後,.apply(lambda x: len(x.split()))
這部分是對每個字幕執行一個匿名函式,該函式將字幕以空白字元分割成單字,並計算單字的數量。最後,max()
函式用於找出所有字幕中最大的長度。
在這個過程中,我們使用了 apply()
方法對資料框架中的每一列執行一個函式,這是一種對資料進行操作的常見方法。同時,lambda
函式用於定義一個簡短的匿名函式,以便在 apply()
方法中使用。這種方法可以使程式碼更加簡潔和易於理解。
圖表翻譯:
flowchart TD A[開始] --> B[載入資料] B --> C[計算字幕長度] C --> D[找出最大長度] D --> E[輸出結果]
圖表翻譯:
這個流程圖描述了計算字幕最大長度的步驟。首先,載入資料集,然後計算每個字幕的長度,接著找出所有字幕中最大的長度,最後輸出結果。這個過程涉及資料的載入、處理和分析,最終得到字幕的最大長度。
影像字幕生成的資料預處理
在進行影像字幕生成之前,需要對資料進行預處理。這包括計算字幕的最大長度、分割字幕文字、以及建立模型的輸入和輸出資料。
從技術架構視角來看,影像字幕生成系統的發展,展現了深度學習在跨模態理解上的顯著進步。本文詳細闡述了從資料準備、影像特徵提取到文字向量化的完整流程,並深入探討了Xception模型、TextVectorization層等關鍵技術的應用。然而,目前的技術仍受限於場景的複雜性以及字幕生成的主觀性,模型在處理包含多個物體、關係和語境訊息的影像時,仍有很大的提升空間。對於模型的泛化能力和在特定領域的應用,也需要更進一步的研究。玄貓認為,未來可以透過結合更強大的視覺模型和更精細的語言模型,例如Transformer,並引入注意力機制等技術,來提升字幕生成的準確性和流暢度。同時,針對特定領域的資料集的構建和訓練,也是未來研究的重要方向。隨著技術的持續發展,我們預見影像字幕生成技術將在更多領域,例如電商、教育和醫療等,發揮更大的作用。