OFA Image Caption 扩展支持 WebP 格式与 EXIF 元数据保留
1. 引言
从手机或相机导出照片时,手动写描述费时费力。在做内容创作时,为大量图片配精准英文说明效率极低。
本文介绍的 ofa_image-caption 是一个纯本地运行的图像描述生成工具。基于 OFA 模型,输入图片即可输出英文描述。原有版本已支持 JPG、PNG 等常见格式,但面对日益普及的 WebP 格式及用户对原始拍摄信息(EXIF)的需求,我们进行了升级。
2. 项目回顾与升级目标
2.1 原有工具的核心功能
该工具是一个本地化的'看图说话'助手:
- 上传图片(原支持 JPG, PNG, JPEG)。
- 调用 OFA 模型(基于 COCO 数据集训练,输出英文)。
- 展示结果(通过 Streamlit 网页界面)。
基于 ModelScope 和 Streamlit 搭建,纯本地运行保障隐私,配合 GPU 推理速度快。
2.2 本次升级要解决的两个问题
用户反馈主要集中在:
- 格式支持:WebP 格式无法上传,需转换太麻烦。
- 信息关联:希望生成的描述能保留图片原始 EXIF 信息(如时间、相机型号)。
升级目标:
- 直接读取和处理 WebP 格式图片。
- 提取并保留图片原始的 EXIF 元数据。
3. 代码实战:扩展 WebP 格式支持
原文件上传组件限制如下:
uploaded_file = st.file_uploader("上传图片", type=['jpg', 'jpeg', 'png']) # 仅定义三种格式
解决方案:
在 type 列表中添加 webp:
uploaded_file = st.file_uploader("上传图片", type=['jpg', 'jpeg', 'png', 'webp']) # 新增 webp
此外,需确保后端 Pillow 库支持 WebP。建议在 requirements.txt 中指定较新版本:
streamlit>=1.28.0
modelscope>=1.9.0
pillow>=9.0.0
4. 代码实战:提取与保留 EXIF 元数据
EXIF 是嵌入图片中的'身份证',记录拍摄设备、时间等信息。
4.1 如何提取 EXIF 信息
使用 Pillow 库的 _getexif() 方法:
PIL Image
PIL.ExifTags
():
exif_data = {}
:
img = Image.(image_path)
info = img._getexif()
info:
tag, value info.items():
decoded_tag = PIL.ExifTags.TAGS.get(tag, tag)
exif_data[decoded_tag] = value
Exception e:
()
exif_data

