赞
踩
在人工智能的浪潮中,视觉语言模型以其独特的能力,将视觉感知与语言理解相结合,为图像内容的自动解析和描述提供了新的可能性。今天,我们将深入探讨一个名为Moondream的开源项目,这是一个小型但功能强大的视觉语言模型,它不仅在技术上具有创新性,而且因其轻量化的特性,能够在多种平台上灵活运行。
Moondream是一个由vikhyat维护的开源项目,以其轻巧的模型尺寸和高效的性能,在GitHub上迅速获得了超过2.8k的Star。该项目采用Apache License 2.0协议,确保了其开源性和可访问性。Moondream模型拥有18.6亿参数,通过SigLIP和Phi 1.5的权重初始化,展现了其在视觉语言处理上的强大潜力。
Moondream的技术亮点主要包括以下几个方面:
大规模参数模型:Moondream是一个拥有16亿参数的视觉AI模型,这样的规模使得它能够处理复杂的图像信息并提供详细的描述。
开源项目:它是一个开源项目,这意味着开发者和研究人员可以自由地访问、修改和使用这个模型,促进了技术的共享和创新。
深度学习和计算机视觉技术:Moondream利用深度学习技术,特别是SigLIP、Phi-1.5技术和LLaVa训练数据集,来实现图像内容的自动转述功能。
跨平台运行能力:该模型能够在任何平台上运行,提供了广泛的应用场景和灵活性。
图像转文字解读:Moondream能够深入理解图像中的物体、动作和情境关系等复杂视觉元素,并将它们转化为自然语言描述。
上下文情境理解:它具备上下文理解能力,能够结合文化背景和常识推理,生成符合逻辑且富有趣味性的文字说明,提升图像叙述的真实性和生动性。
多功能性:Moondream不仅可以作为开发人员集成到应用程序中的工具,也适用于学生学习和AI爱好者探索,能够将各种类型的信息转换为文本输出。
丰富的API接口和文档支持:为开发人员提供了便利,使得他们可以轻松地实现与Moondream的对接和集成。
Moondream的这些技术亮点使其在图像内容识别和解释方面展现出显著的技术飞跃,并在提高运算速度和降低资源消耗方面具有优势。尽管在某些极端复杂场景理解和高速实时响应上仍面临挑战,但其准确度和应用潜力已经得到了广泛认可。
评测
Release | VQAv2 | GQA | TextVQA | TallyQA (simple) | TallyQA (full) |
---|---|---|---|---|---|
2024-03-04 | 74.2 | 58.5 | 36.4 | - | - |
2024-03-06 | 75.4 | 59.8 | 43.1 | 79.5 | 73.2 |
2024-03-13 | 76.8 | 60.6 | 46.4 | 79.6 | 73.3 |
2024-04-02 | 77.7 | 61.7 | 49.7 | 80.1 | 74.2 |
2024-05-08 | 79.0 | 62.7 | 53.1 | 81.6 | 76.1 |
2024-05-20 | 79.4 | 63.1 | 57.2 | 82.1 | 76.6 |
Moondream模型具备以下核心功能:
Moondream的应用场景多样,包括但不限于:
为了使读者能够快速上手Moondream,以下是使用transformers库加载并运行Moondream模型的基本代码示例:
首先,需要安装必要的Python库。
pip install transformers timm einops
使用huggingface的transformers库加载Moondream模型。
from transformers import AutoModelForCausalLM, AutoTokenizer
from PIL import Image
model_id = "vikhyatk/moondream2"
revision = "2024-03-06"
model = AutoModelForCausalLM.from_pretrained(model_id, trust_remote_code=True, revision=revision)
tokenizer = AutoTokenizer.from_pretrained(model_id, revision=revision)
对给定图像进行编码并生成描述。
1)推理
image = Image.open('<IMAGE_PATH>')
enc_image = model.encode_image(image)
print(model.answer_question(enc_image, "Describe this image.", tokenizer))
2)批量推理
answers = moondream.batch_answer(
images=[Image.open('<IMAGE_PATH_1>'), Image.open('<IMAGE_PATH_2>')],
prompts=["Describe this image.", "Are there people in this image?"],
tokenizer=tokenizer,
)
3)运行模型的 CLI 接口
如果未提供参数,则脚本将允许您以交互方式提问。–prompt
python sample.py --image [IMAGE_PATH] --prompt [PROMPT]
python sample.py 代码如下:
import torch
import argparse
from PIL import Image
from moondream import Moondream, detect_device, LATEST_REVISION
from queue import Queue
from threading import Thread
from transformers import TextIteratorStreamer, AutoTokenizer
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("--image", type=str, required=True)
parser.add_argument("--prompt", type=str, required=False)
parser.add_argument("--cpu", action="store_true")
args = parser.parse_args()
if args.cpu:
device = torch.device("cpu")
dtype = torch.float32
else:
device, dtype = detect_device()
if device != torch.device("cpu"):
print("Using device:", device)
print("If you run into issues, pass the `--cpu` flag to this script.")
print()
image_path = args.image
prompt = args.prompt
model_id = "vikhyatk/moondream2"
tokenizer = AutoTokenizer.from_pretrained(model_id, revision=LATEST_REVISION)
moondream = Moondream.from_pretrained(
model_id,
revision=LATEST_REVISION,
torch_dtype=dtype,
).to(device=device)
moondream.eval()
image = Image.open(image_path)
image_embeds = moondream.encode_image(image)
if prompt is None:
chat_history = ""
while True:
question = input("> ")
result_queue = Queue()
streamer = TextIteratorStreamer(tokenizer, skip_special_tokens=True)
# Separate direct arguments from keyword arguments
thread_args = (image_embeds, question, tokenizer, chat_history)
thread_kwargs = {"streamer": streamer, "result_queue": result_queue}
thread = Thread(
target=moondream.answer_question,
args=thread_args,
kwargs=thread_kwargs,
)
thread.start()
buffer = ""
for new_text in streamer:
buffer += new_text
if not new_text.endswith("<") and not new_text.endswith("END"):
print(buffer, end="", flush=True)
buffer = ""
print(buffer)
thread.join()
answer = result_queue.get()
chat_history += f"Question: {question}\n\nAnswer: {answer}\n\n"
else:
print(">", prompt)
answer = moondream.answer_question(image_embeds, prompt, tokenizer)
print(answer)
Moondream作为一个开源的视觉语言模型,以其轻量化和高效性,为AI领域带来了新的活力。它的广泛应用前景和技术创新,不仅为开发者和研究人员提供了强大的工具,也为整个行业的发展注入了新的动力。随着技术的不断进步,我们有理由相信,Moondream将在未来的AI领域扮演更加重要的角色。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。