OpenBMB / MiniCPM-V

MiniCPM-V 2.6: A GPT-4V Level MLLM for Single Image, Multi Image and Video on Your Phone
Apache License 2.0
11.82k stars 829 forks source link

[BUG] 只要prompt出现"100%确认"、“不要乱说”,MiniCPM-Llama3-V-2_5就识别不出来任何图片 #329

Closed ArlanCooper closed 2 months ago

ArlanCooper commented 2 months ago

是否已有关于该错误的issue或讨论? | Is there an existing issue / discussion for this?

该问题是否在FAQ中有解答? | Is there an existing answer for this in FAQ?

当前行为 | Current Behavior

我跑了官方的示例图片,一架飞机。

如果我不告诉MiniCPM-Llama3-V-2_5这个图片里面有一架飞机,只是问图片中有什么,他的回答就会非常的随意,比如:

im_64 = img2base64('./assets/airplane.jpeg')

# First round chat 
msgs = [{"role": "user", "content": "请将图片中的物品表述出来。"}]

inputs = {"image": im_64, "question": json.dumps(msgs)}
answer = model.chat(image=inputs['image'],
            msgs=inputs['question'],
            tokenizer=tokenizer,
            temperature=0.5)
print(answer)

输出:


图片中包含了以下物品:
1. 一个白色的碗
2. 一些绿色的蔬菜,可能是西兰花或菠菜
3. 一些红色的蔬菜,可能是番茄或红椒
4. 一些黄色的蔬菜,可能是南瓜或胡萝卜
5. 一些黑色的食物,可能是豆子或黑米
6. 一些棕色的食物,可能是面包或糙米
7. 一些白色的食物,可能是鸡肉或鱼肉
8. 一些橙色的食物,可能是橙子或柑橘类水果
9. 一些紫色的食物,可能是紫甘蓝或紫薯
10. 一些粉色的食物,可能是粉色糖果或粉色水果

但是,如果你提到了,需要"100%确认的内容",则无结果返回:

im_64 = img2base64('./assets/airplane.jpeg')

# First round chat 
msgs = [{"role": "user", "content": "请将图片中你100%确认正确的物品表述出来。"}]

inputs = {"image": im_64, "question": json.dumps(msgs)}
answer = model.chat(image=inputs['image'],
            msgs=inputs['question'],
            tokenizer=tokenizer,
            temperature=0.5)
print(answer)

答案:

由于您没有提供图片,我无法确认任何物品。请上传图片以便我能够帮助您。

而且,换成英语,它竟然说自己只是语言模型,而不能识别图片!!!

im_64 = img2base64('./assets/airplane.jpeg')

# First round chat 
msgs = [{"role": "user", "content": "Please state the item in the picture that you are 100% sure is correct."}]

inputs = {"image": im_64, "question": json.dumps(msgs)}
answer = model.chat(image=inputs['image'],
            msgs=inputs['question'],
            tokenizer=tokenizer,
            temperature=0.1)
print(answer)

结果:

I'm sorry, but I am an AI language model and do not have the ability to see or analyze images. Can you please provide more context or information about the image so that I can assist you better?

只有告诉模型图片中有"飞机",它才能描述清楚:


im_64 = img2base64('./assets/airplane.jpeg')

# First round chat 
msgs = [{"role": "user", "content": "请描述图片中的飞机"}]

inputs = {"image": im_64, "question": json.dumps(msgs)}
answer = model.chat(image=inputs['image'],
            msgs=inputs['question'],
            tokenizer=tokenizer,
            temperature=0.5)
print(answer)

结果:

图片中的飞机是一架大型商用客机。它有两个巨大的翼展,表明其设计用于长途飞行。飞机的机身呈圆柱形,尾部有一个垂直的稳定器。机头是尖锐的,有一个透明的驾驶舱窗户,可以看到飞行员。飞机的涂装主要是白色和蓝色,可能代表航空公司的品牌。

期望行为 | Expected Behavior

可以正确识别图片中有什么,然后进行描述

复现方法 | Steps To Reproduce

im_64 = img2base64('./assets/airplane.jpeg')

# First round chat 
msgs = [{"role": "user", "content": "Please state the item in the picture that you are 100% sure is correct."}]

inputs = {"image": im_64, "question": json.dumps(msgs)}
answer = model.chat(image=inputs['image'],
            msgs=inputs['question'],
            tokenizer=tokenizer,
            temperature=0.1)
print(answer)

im_64 = img2base64('./assets/airplane.jpeg')

# First round chat 
msgs = [{"role": "user", "content": "请将图片中你100%确认正确的物品表述出来。"}]

inputs = {"image": im_64, "question": json.dumps(msgs)}
answer = model.chat(image=inputs['image'],
            msgs=inputs['question'],
            tokenizer=tokenizer,
            temperature=0.1)
print(answer)

运行环境 | Environment

- OS:ubuntu 16.04
- Python:2.10.12
- Transformers:4.40.0
- PyTorch: 2.1.2
- CUDA (`python -c 'import torch; print(torch.version.cuda)'`):12.1

备注 | Anything else?

No response

LDLINGLINGLING commented 2 months ago

感谢您bad case的反馈,我想问一下,您这边都是对这一张图片进行的测试么?以上在其他图片上有相同问题出现么?

ArlanCooper commented 2 months ago

感谢您bad case的反馈,我想问一下,您这边都是对这一张图片进行的测试么?以上在其他图片上有相同问题出现么?

对的,只在官方提供的这一个图片上进行的测试,我再测试几张图片给您反馈

ArlanCooper commented 2 months ago

感谢您bad case的反馈,我想问一下,您这边都是对这一张图片进行的测试么?以上在其他图片上有相同问题出现么?

我这边看了一下代码,是我这边调用的问题,就是image我直接将base64的编码给到了llm进行识别,所以导致算法返回结果比较随机。我看是需要将图片直接输入给到LLM。


image = Image.open(io.BytesIO(base64.b64decode(inputs['image']))).convert('RGB')