Image Captioning Model
模型概述
模型特點
模型能力
使用案例
🚀 圖解基於Transformer模型的圖像描述生成
本項目利用視覺Transformer實現圖像描述生成,結合計算機視覺與Transformer技術,在圖像理解和描述生成方面取得了不錯的效果,為圖像描述任務提供了新的解決方案。
🚀 快速開始
本項目旨在利用Vision Transformers實現圖像描述生成。以下是快速開始的步驟:
- 安裝必要的依賴和環境。
- 準備數據集。
- 運行代碼進行訓練和推理。
✨ 主要特性
- 先進技術融合:採用Vision Transformers、注意力機制、語言建模、遷移學習等先進技術。
- 多評估指標:使用BLEU、METEOR、CIDEr等評估指標對圖像描述進行評估。
- 用戶友好界面:通過Gradio平臺部署到Hugging Face Spaces,提供直觀的Web界面。
📦 安裝指南
安裝COCO API
- 克隆倉庫:
git clone https://github.com/cocodataset/cocoapi.git
- 配置COCO API:
cd cocoapi/PythonAPI
make
cd ..
- 下載特定數據:從官網下載以下數據:
- 註釋數據:
- 2017 Train/Val註釋 [241MB]:提取
captions_train2017.json
和captions_val2017.json
,分別放置在cocoapi/annotations/captions_train2017.json
和cocoapi/annotations/captions_val2017.json
。 - 2017測試圖像信息 [1MB]:提取
image_info_test2017.json
,放置在cocoapi/annotations/image_info_test2017.json
。
- 2017 Train/Val註釋 [241MB]:提取
- 圖像數據:
- 2017訓練圖像 [83K/13GB]:提取
train2017
文件夾,放置在cocoapi/images/train2017/
。 - 2017驗證圖像 [41K/6GB]:提取
val2017
文件夾,放置在cocoapi/images/val2017/
。 - 2017測試圖像 [41K/6GB]:提取
test2017
文件夾,放置在cocoapi/images/test2017/
。
- 2017訓練圖像 [83K/13GB]:提取
- 註釋數據:
環境準備
注意:本項目在Mac上開發,在Windows和Linux上稍作修改也可運行。
- 克隆倉庫並進入目錄:
git clone https://github.com/CapstoneProjectimagecaptioning/image_captioning_transformer.git
cd image_captioning_transformer
- 創建並激活新環境:
conda create -n captioning_env python=3.7
source activate captioning_env
- 安裝依賴:
pip install -r requirements.txt
- 返回倉庫目錄:
cd image_captioning
- 打開Jupyter Notebook:
jupyter notebook
- 打開項目Notebook後,確保選擇正確的環境:點擊
Kernel > Change Kernel > captioning_env
。
💻 使用示例
基礎用法
# 代碼示例保持不變
# 這裡可以根據實際情況補充基礎用法的代碼示例
高級用法
# 高級場景說明
# 這裡可以根據實際情況補充高級用法的代碼示例
📚 詳細文檔
代碼解釋步驟
1. 數據加載與預處理
- 加載註釋:從COCO 2017數據集中加載圖像-描述對,使用JSON文件(
captions_train2017.json
)。 - 圖像與描述配對:創建列表
img_cap_pairs
,將圖像文件名與對應的描述配對。 - 描述數據框:使用pandas DataFrame組織數據,方便操作,包括創建圖像文件路徑。
- 數據採樣:隨機採樣70,000個圖像-描述對,使數據集更易於管理。
2. 文本預處理
對描述進行預處理,包括小寫化、去除標點符號、替換多個空格為單個空格,並添加[start]
和[end]
標記。
3. 分詞
- 詞彙表設置:創建分詞器(
TextVectorization
),詞彙表大小為15,000個單詞,最大標記長度為40。將描述分詞,轉換為整數序列。 - 保存詞彙表:將詞彙表保存到文件,以便後續重用。
- 單詞與索引映射:創建
word2idx
和idx2word
映射,實現單詞與索引的相互轉換。
4. 數據集準備
- 圖像-描述映射:使用字典將每個圖像映射到其描述列表,然後打亂圖像順序,進行訓練-驗證分割(80%訓練,20%驗證)。
- 創建TensorFlow數據集:使用
load_data
函數,調整圖像大小、預處理圖像,並將描述分詞為張量。將張量分批進行訓練和驗證,提高內存效率和並行處理能力。
5. 數據增強
對訓練圖像應用基本的圖像增強(隨機翻轉、隨機旋轉和隨機對比度),幫助模型更好地泛化。
6. 模型架構
- CNN編碼器:使用在ImageNet上預訓練的InceptionV3模型處理圖像並提取特徵,作為Transformer的輸入。
- Transformer編碼器層:使用多頭自注意力和歸一化層的
TransformerEncoderLayer
學習圖像特徵之間的關係。 - 嵌入層:添加位置嵌入,使模型能夠捕捉描述中單詞的順序。
- Transformer解碼器層:
TransformerDecoderLayer
生成描述,包括多頭注意力、前饋神經網絡和Dropout,防止過擬合。使用掩碼確保在預測下一個單詞時,標記不會“看到”未來的標記。
7. 圖像描述模型類
ImageCaptioningModel
類將編碼器、解碼器和CNN編碼器封裝為一個統一的模型,用於訓練和推理。自定義函數計算損失和準確率,跟蹤模型性能。
8. 訓練
- 損失函數:使用稀疏分類交叉熵計算預測標記和實際標記之間的差異,排除填充標記。
- 早停策略:監控驗證損失,若驗證集性能在一定時期內沒有改善,則停止訓練。
- 模型編譯與訓練:編譯模型,進行優化,並在多個時期進行訓練,同時應用早停策略。
9. 評估與描述生成
使用generate_caption
函數為新圖像生成描述,通過迭代預測標記,直到生成[end]
標記或達到最大長度限制。
10. 保存模型
將模型權重保存到文件(Image_Captioning_Model
),以便後續重用,無需重新訓練。
模型訓練
訓練和驗證階段的損失和BLEU-4分數表明,模型在第8個時期左右開始過擬合,第20個時期後BLEU-4分數和損失值不再改善。過擬合的原因可能包括:
- 訓練數據不足:CPTR的編碼器使用預訓練的ViT模型初始化,但本項目中模型權重隨機初始化,且訓練圖像少於18,500張。
- 特徵處理不當:將Resnet101學習的圖像特徵分割成N個大小為
P x P
的塊,可能不是最佳設計,將特徵扁平化可能更好。 - 網絡調優問題:預訓練的Resnet101從一開始就進行調優,而詞嵌入層在訓練初期可能會扭曲圖像特徵。
- 超參數不合適:模型的超參數可能需要調整。
推理輸出
生成描述的長度分佈表明,模型傾向於生成較短的描述。訓練描述長度的分佈呈正偏態,模型生成的最大描述長度(21個標記)佔訓練集長度的98.66%。
🔧 技術細節
模型和技術使用
方法和技術
- 視覺Transformer(ViTs)
- 注意力機制
- 語言建模
- 遷移學習
- 圖像描述評估指標(如BLEU、METEOR、CIDEr)
庫使用
- PyTorch
- Transformers
- TorchVision
- NumPy
- NLTK
- Matplotlib
模型架構
CPTR由圖像補丁器、Transformer編碼器和解碼器組成。圖像補丁器將圖像轉換為補丁序列,添加位置嵌入後輸入到12層相同的Transformer編碼器。最後一層編碼器的輸出輸入到4層相同的Transformer解碼器。解碼器還接收帶有正弦位置嵌入的單詞。
訓練
使用交叉熵損失和雙重隨機注意力正則化訓練模型。使用Adam優化器,批量大小為32。訓練100個時期,若跟蹤的評估指標(BLEU-4)連續20個時期沒有改善,則停止訓練;若連續10個時期沒有改善,則將學習率降低0.25%。每2個時期對模型進行驗證評估。
推理
使用大小為5的束搜索為測試集中的圖像生成描述。生成從輸入圖像和“句子開始”特殊標記開始,每次迭代選擇得分最高的5個標記,直到生成“句子結束”標記或達到最大長度限制。
評估指標
屬性 | 詳情 |
---|---|
模型類型 | 基於Transformer的圖像描述生成模型 |
訓練數據 | MS COCO 2017數據集 |
測試數據集上的性能指標均值和標準差如下:
bleu1 | bleu2 | bleu3 | bleu4 | gleu | meteor | |
---|---|---|---|---|---|---|
mean ± std | 0.7180 ± 0.17 | 0.5116 ± 0.226 | 0.3791 ± 0.227 | 0.2918 ± 0.215 | 0.2814 ± 0.174 | 0.4975 ± 0.193 |
注意力可視化
檢查Transformer編碼器-解碼器注意力的最後一層,對注意力權重進行平均。從測試集中隨機選擇14個樣本,將注意力權重疊加到樣本圖像上,輸出保存為GIF或PNG格式,保存到images/tests
文件夾。
📄 許可證
本項目使用Apache 2.0許可證。
8. 參考文獻
[1] Liu, W., Chen, S., Guo, L., Zhu, X., & Liu, J. (2021). CPTR: Full transformer network for image captioning. arXiv preprint arXiv:2101.10804. [2] Lin, T. Y., Maire, M., Belongie, S., Hays, J., Perona, P., Ramanan, D., ... & Zitnick, C. L. (2014, September). Microsoft coco: Common objects in context. In European conference on computer vision (pp. 740-755). Springer, Cham. [3] A. Vaswani et al., 'Attention is all you need', Advances in neural information processing systems, vol. 30, 2017. [4] M. Z. Hossain, F. Sohel, M. F. Shiratuddin, and H. Laga, 'A Comprehensive Survey of Deep Learning for Image Captioning', arXiv:1810.04020 [cs, stat], Oct. 2018, Accessed: Mar. 03, 2022. [Online]. Available: http://arxiv.org/abs/1810.04020. [5] S. Hochreiter and J. Schmidhuber, ‘Long short-term memory’, Neural computation, vol. 9, no. 8, pp. 1735–1780, 1997. [6] A. Dosovitskiy et al., 'An image is worth 16x16 words: Transformers for image recognition at scale', arXiv preprint arXiv:2010.11929, 2020. [7] K. He, X. Zhang, S. Ren, and J. Sun, 'Deep Residual Learning for Image Recognition', arXiv:1512.03385 [cs], Oct. 2015, Accessed: Mar. 06, 2022. [Online]. Available: http://arxiv.org/abs/1512.03385. [8] K. Xu et al., 'Show, Attend and Tell: Neural Image Caption Generation with Visual Attention', arXiv:1502.03044 [cs], Apr. 2016, Accessed: Mar. 07, 2022. [Online]. Available: http://arxiv.org/abs/1502.03044. [9] K. Papineni, S. Roukos, T. Ward, and W.-J. Zhu, 'Bleu: a method for automatic evaluation of machine translation', in Proceedings of the 40th annual meeting of the Association for Computational Linguistics, 2002, pp. 311–318. [10] S. Banerjee and A. Lavie, 'METEOR: An automatic metric for MT evaluation with improved correlation with human judgments', in Proceedings of the acl workshop on intrinsic and extrinsic evaluation measures for machine translation and/or summarization, 2005, pp. 65–72. [11] A. Mutton, M. Dras, S. Wan, and R. Dale, 'GLEU: Automatic evaluation of sentence-level fluency', in Proceedings of the 45th Annual Meeting of the Association of Computational Linguistics, 2007, pp. 344–351. [12] J. Pennington, R. Socher, and C. D. Manning, 'Glove: Global vectors for word representation', in Proceedings of the 2014 conference on empirical methods in natural language processing (EMNLP), 2014, pp. 1532–1543. [13] A. Karpathy and L. Fei-Fei, 'Deep visual-semantic alignments for generating image descriptions', in Proceedings of the IEEE conference on computer vision and pattern recognition, 2015, pp. 3128–3137. [14] Oriol Vinyals, Alexander Toshev, Samy Bengio, Dumitru Erhan; Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 2015, pp. 3156-3164. [15] Hugging Face Spaces Forum about image captioning model. https://huggingface.co/docs/transformers/main/en/tasks/image_captioning [16] QuickStart Guide to GitHub pages https://docs.github.com/en/pages/quickstart [17] Microsoft COCO: Common Objects in Context (cs.CV). arXiv:1405.0312 [cs.CV] https://doi.org/10.48550/arXiv.1405.0312 [18] Show, Attend and Tell: Neural Image Caption Generation with Visual Attention arXiv:1502.03044v3 [cs.LG] 19 Apr 2016 https://doi.org/10.48550/arXiv.1502.03044 [19] Deep Residual Learning for Image Recognition arXiv:1512.03385v1 [cs.CV] 10 Dec 2015 [20] Gradio Quickstart Guide https://www.gradio.app/guides/quickstart








