引言
在我们的项目中,我们需要实现一个图像转文本的功能,即根据输入的图片自动生成描述性文字。
BLIP模型初尝试
最初,我尝试使用了Hugging Face提供的两个BLIP模型:
blip-image-captioning-base
blip-image-captioning-large
这两个模型都是基于BLIP架构的经典图像描述生成模型。
在实际测试中,我发现这两个模型存在以下问题:
- 生成的描述过于简短,缺乏细节
- 对于复杂场景的理解能力有限
- 对特定领域图片(如医学图像、技术图表)的适应性差
- 无法根据提示词(prompt)进行条件生成
尽管调整了生成参数(如
max_length
、num_beams
等),效果提升仍然有限,无法满足我们的项目需求。
比如在上面的测试中,该模型并无法识别ultraman,且描述的很简短
转向BLIP2模型
经过调研,我决定尝试BLIP2模型,BLIP2采用了创新的架构设计,将预训练的视觉模型和语言模型通过轻量级的Q-Former连接起来,实现了更强大的图像理解能力。
BLIP2的优势:
- 更大的模型规模:我们选择了
blip2-opt-2.7b
版本,相比之前的BLIP模型参数规模更大
- 多模态理解能力:能够更好地理解图像和文本之间的关系
- 条件生成:可以根据提示词(prompt)生成特定风格的描述
- 生成质量:描述更加详细、准确,符合人类语言习惯
实现代码
在我们的Flask后端服务中,我实现了BLIP2的服务类:
在具体实践中,为了使Flask 服务在 Docker Compose 中使用 GPU,需要修改
docker-compose.yml
文件,添加 GPU 支持相关的配置如下:
可以看到,该模型在基本差不多的生成速度下,生成的描述更为详细且能够正确识别ultraman