【实战教程】在本地计算机上运行AI视觉语言模型:通过文本实现目标检测任务【附源码】

发布于:2024-12-18 ⋅ 阅读:(80) ⋅ 点赞:(0)

《------往期经典推荐------》

一、AI应用软件开发实战专栏【链接】

项目名称 项目名称
1.【人脸识别与管理系统开发 2.【车牌识别与自动收费管理系统开发
3.【手势识别系统开发 4.【人脸面部活体检测系统开发
5.【图片风格快速迁移软件开发 6.【人脸表表情识别系统
7.【YOLOv8多目标识别与自动标注软件开发 8.【基于YOLOv8深度学习的行人跌倒检测系统
9.【基于YOLOv8深度学习的PCB板缺陷检测系统 10.【基于YOLOv8深度学习的生活垃圾分类目标检测系统
11.【基于YOLOv8深度学习的安全帽目标检测系统 12.【基于YOLOv8深度学习的120种犬类检测与识别系统
13.【基于YOLOv8深度学习的路面坑洞检测系统 14.【基于YOLOv8深度学习的火焰烟雾检测系统
15.【基于YOLOv8深度学习的钢材表面缺陷检测系统 16.【基于YOLOv8深度学习的舰船目标分类检测系统
17.【基于YOLOv8深度学习的西红柿成熟度检测系统 18.【基于YOLOv8深度学习的血细胞检测与计数系统
19.【基于YOLOv8深度学习的吸烟/抽烟行为检测系统 20.【基于YOLOv8深度学习的水稻害虫检测与识别系统
21.【基于YOLOv8深度学习的高精度车辆行人检测与计数系统 22.【基于YOLOv8深度学习的路面标志线检测与识别系统
23.【基于YOLOv8深度学习的智能小麦害虫检测识别系统 24.【基于YOLOv8深度学习的智能玉米害虫检测识别系统
25.【基于YOLOv8深度学习的200种鸟类智能检测与识别系统 26.【基于YOLOv8深度学习的45种交通标志智能检测与识别系统
27.【基于YOLOv8深度学习的人脸面部表情识别系统 28.【基于YOLOv8深度学习的苹果叶片病害智能诊断系统
29.【基于YOLOv8深度学习的智能肺炎诊断系统 30.【基于YOLOv8深度学习的葡萄簇目标检测系统
31.【基于YOLOv8深度学习的100种中草药智能识别系统 32.【基于YOLOv8深度学习的102种花卉智能识别系统
33.【基于YOLOv8深度学习的100种蝴蝶智能识别系统 34.【基于YOLOv8深度学习的水稻叶片病害智能诊断系统
35.【基于YOLOv8与ByteTrack的车辆行人多目标检测与追踪系统 36.【基于YOLOv8深度学习的智能草莓病害检测与分割系统
37.【基于YOLOv8深度学习的复杂场景下船舶目标检测系统 38.【基于YOLOv8深度学习的农作物幼苗与杂草检测系统
39.【基于YOLOv8深度学习的智能道路裂缝检测与分析系统 40.【基于YOLOv8深度学习的葡萄病害智能诊断与防治系统
41.【基于YOLOv8深度学习的遥感地理空间物体检测系统 42.【基于YOLOv8深度学习的无人机视角地面物体检测系统
43.【基于YOLOv8深度学习的木薯病害智能诊断与防治系统 44.【基于YOLOv8深度学习的野外火焰烟雾检测系统
45.【基于YOLOv8深度学习的脑肿瘤智能检测系统 46.【基于YOLOv8深度学习的玉米叶片病害智能诊断与防治系统
47.【基于YOLOv8深度学习的橙子病害智能诊断与防治系统 48.【基于深度学习的车辆检测追踪与流量计数系统
49.【基于深度学习的行人检测追踪与双向流量计数系统 50.【基于深度学习的反光衣检测与预警系统
51.【基于深度学习的危险区域人员闯入检测与报警系统 52.【基于深度学习的高密度人脸智能检测与统计系统
53.【基于深度学习的CT扫描图像肾结石智能检测系统 54.【基于深度学习的水果智能检测系统
55.【基于深度学习的水果质量好坏智能检测系统 56.【基于深度学习的蔬菜目标检测与识别系统
57.【基于深度学习的非机动车驾驶员头盔检测系统 58.【太基于深度学习的阳能电池板检测与分析系统
59.【基于深度学习的工业螺栓螺母检测 60.【基于深度学习的金属焊缝缺陷检测系统
61.【基于深度学习的链条缺陷检测与识别系统 62.【基于深度学习的交通信号灯检测识别
63.【基于深度学习的草莓成熟度检测与识别系统 64.【基于深度学习的水下海生物检测识别系统
65.【基于深度学习的道路交通事故检测识别系统 66.【基于深度学习的安检X光危险品检测与识别系统
67.【基于深度学习的农作物类别检测与识别系统 68.【基于深度学习的危险驾驶行为检测识别系统
69.【基于深度学习的维修工具检测识别系统 70.【基于深度学习的维修工具检测识别系统
71.【基于深度学习的建筑墙面损伤检测系统 72.【基于深度学习的煤矿传送带异物检测系统
73.【基于深度学习的老鼠智能检测系统

二、机器学习实战专栏【链接】,已更新31期,欢迎关注,持续更新中~~
三、深度学习【Pytorch】专栏【链接】
四、【Stable Diffusion绘画系列】专栏【链接】
五、YOLOv8改进专栏【链接】持续更新中~~
六、YOLO性能对比专栏【链接】,持续更新中~

《------正文------》

引言

对于小型LLMs生态系统,其在边缘设备上实现应用程序中有巨大的潜力。例如在医学和建筑,商业,监控等许多行业中,应用程序是无穷无尽的。

本文将介绍如何在PC上运行的小型视觉语言模型(LLM)moondream,并运行它做一些对象检测的实验。

img

实现步骤

运行模型

首先,让我们从如何运行模型开始,它非常简单。只需确保安装依赖项并下载模型(它不到2GB,很小但很强大)。此处使用的是开源的轻量级AI视觉语言模型Moondream。

模型简介:
Moondream是一个免费开源的小型的人工智能视觉语言模型,虽然参数量小(Moondream1仅16亿Moondream2为18.6亿)但可以提供高性能的视觉处理能力,可在本地计算机甚至移动设备或Raspberry Pi 上运行,能够快速理解和处理输入的图像信息并对用户提出的问题进行解答。该模型由开发人员vikhyatk推出,使用SigLP、Phi-1.5和LLaVa训练数据集和模型权重初始化进行构建。Moondream基于宽松的Apache 2.0许可证,允许商用。

from transformers import AutoModelForCausalLM, AutoTokenizer
from PIL import Image

model_id = "vikhyatk/moondream2"
revision = "2024-07-23"
model = AutoModelForCausalLM.from_pretrained(
    model_id, trust_remote_code=True, revision=revision
)
tokenizer = AutoTokenizer.from_pretrained(model_id, revision=revision)

image_path = "images/test.jpeg"
image = Image.open(image_path)
enc_image = model.encode_image(image)

测试样本

为了测试模型,我们将使用下面的图片,其中有一只可爱的狗和一只猫。

img

我们将提示模型询问图像中有多少动物,让模型进行回答:

print(model.answer_question(enc_image, "how many animals are in the picture?", tokenizer))
# Answer 
'There are two animals in the picture: a dog and a cat.'

而且是正确的!但是这个任务很容易,所以让我们把它变得更难一点。

目标检测示例

随着模型的最新版本,对象检测能力越来越好,似乎我们将得到更多的改进。所以,让我们试着从图像中识别猫!

print(model.answer_question(enc_image, "Detect the cat and return the bounding box", tokenizer))
# Output:
[0.00, 0.23, 0.50, 0.99]

我们有答案了,但先别急着下结论。至少我们得到了一个答案。让我们也来问问狗的位置:

print(model.answer_question(enc_image, "Detect the dog and return the bounding box", tokenizer))
# Output: 
[0.32, 0.09, 0.99, 0.98]

现在让我们创建一个辅助函数来绘制边界框。代码很简单,你可以复制粘贴!

def draw_bounding_box(image_path, bbox):
    """
    Draws a bounding box on an image and displays it.

    Parameters:
    - image_path (str): Path to the image file.
    - bbox (list): Normalized bounding box coordinates [x_min, y_min, x_max, y_max], where
                   each value is between 0 and 1.
    """
    # Open the image
    image = Image.open(image_path)
    draw = ImageDraw.Draw(image)

    # Get image dimensions
    img_width, img_height = image.size

    # Convert normalized bounding box coordinates to absolute pixel values
    x_min = int(bbox[0] * img_width)
    y_min = int(bbox[1] * img_height)
    x_max = int(bbox[2] * img_width)
    y_max = int(bbox[3] * img_height)

    # Draw the bounding box
    draw.rectangle([x_min, y_min, x_max, y_max], outline="red", width=3)

    # Display the image
    image.show()

让我们使用相同的图像并传递边界框:

image_path = "images/test.jpeg"
bbox = [0.00, 0.23, 0.50, 0.99] # Bounding box coordinates for the cat
draw_bounding_box(image_path, bbox)

bbox = [0.32, 0.09, 0.99, 0.98] # Bounding box coordinates for the dog
draw_bounding_box(image_path, bbox)

正如你在下面的图片中看到的,模型能够正确地识别边界框。

img

总结

这些微小的模型具有巨大的应用潜力。您甚至可以对它们进行微调,使它们更适合您的自定义应用程序。考虑到它们甚至可以在Raspberry Pi上运行,可能性是无限的。如果文章对你有帮助,感谢点赞关注!


在这里插入图片描述

好了,这篇文章就介绍到这里,喜欢的小伙伴感谢给点个赞和关注,更多精彩内容持续更新~~
关于本篇文章大家有任何建议或意见,欢迎在评论区留言交流!