
Eval bug: server/MTMD ignores jpeg EXIF orientation metadata
快速结论:当使用 llama.cpp server 或 MTMD(Multi-Modal Tokenizer & Decoder)对包含 EXIF Orientation 元数据的 JPEG 图片进行视觉模型推理时,模型看到的图片方向是错误的。优先排查底层图片解析库 stb_image 是否支持 EXIF,或临时在 webui 侧预处理图片。
问题场景
用户在 llama.cpp 的 server 模式下(或 MTMD 组件)使用视觉模型(如 Qwen3.5 35B, Qwen3.5 27B, Gemma 3 12B qat)处理图片,该图片的显示方向由 JPEG 的 EXIF Orientation 元数据决定(例如手机拍摄的照片)。用户期望模型看到的图片方向正确,但实际模型看到的是未经方向校正的原始像素数据。
报错原文
Eval bug: server/MTMD ignores jpeg EXIF orientation metadata
原因分析
可能原因:llama.cpp 底层使用的图片解析库 stb_image 不支持读取 JPEG 的 EXIF Orientation 元数据。因此当图片的 EXIF Orientation 标签(取值 1-8)指示需要旋转/翻转时,stb_image 直接返回原始像素数据,不进行方向校正,导致视觉模型看到的图片方向错误。
环境排查
- 确认使用的 llama.cpp 版本:build 8468 (3306dbaef) 或更早版本
- 确认后端:Vulkan(问题可能跨后端,但 Vulkan 环境下更容易暴露)
- 确认图片格式:仅影响 JPEG 图片(PNG 等格式通常不包含 EXIF Orientation)
- 确认视觉模型:Qwen3.5 35B、Qwen3.5 27B、Gemma 3 12B qat 等均可能受影响
解决步骤
- (最优先尝试)在将图片发送到 llama.cpp server 之前,在 webui 或客户端侧对图片进行预处理:读取 EXIF Orientation 标签,根据标签值对像素数据进行旋转/翻转,然后移除 EXIF Orientation 标签或将其重置为 1(正常方向),最后将处理后的图片发送给 server。
- (仅作为备选)如果希望保持 JPEG 图片的无损直通,可以在处理逻辑中先检测 EXIF Orientation 标签,仅当 Orientation > 1 时才执行重编码(通过 canvas 重新绘制),未旋转的 JPEG 保持 bit-perfect。
- (长期方案)关注 llama.cpp 社区是否计划替换或升级 stb_image,或增加针对 EXIF 的单独处理逻辑。
- (可选)如果 issue 中提到的 resize 功能(PR #22849)已合并,可考虑在 resize 环节加入 EXIF 方向校正逻辑。
验证方法
选取一张包含 EXIF Orientation 标签(如 Orientation=6,旋转 90° CW)的 JPEG 测试图片,分别用原始图片和经过方向校正的图片向视觉模型提问“描述图片中的文字/内容方向”。如果原始图片回答错误,校正后回答正确,说明问题已解决。
也可使用 issue 中提供的 Python 脚本生成一组 EXIF Orientation 测试图片(orientation 1-8),确保所有图片在视觉上看起来方向一致,然后检查模型对它们的描述是否一致。

![[Question]: Failed to build knowledge graph](https://www.chat-gpts.plus/wp-content/uploads/2026/06/6886-32ff5dfd-768x403.jpg)

