【多模态实战】在本地计算机上使用小型视觉语言模型【VLM】进行目标计数【附源码】

ops/2024/12/17 7:15:28/

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

一、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性能对比专栏【链接】,持续更新中~

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

目录

  • 引言
  • 使用模型:Molmo 7B
  • 引擎:MLX-VLM
  • MLX社区
  • 具体实现示例
    • 在MLX中运行Molmo
    • 绘制输出结果
    • 最终结果

引言

这篇文章重点介绍的是具有无数实际应用的功能:在智能手机、物联网设备和嵌入式系统等边缘设备上运行小型视觉语言模型(VLM)。这些模型在识别和指出物体方面变得越来越好。具体来说,它们擅长检测制造缺陷、计算可用停车位或发现癌细胞。本文将使用视觉语言模型对图中的钢管数量进行计数,效果如下。
img

使用模型:Molmo 7B

Molmo是由艾伦人工智能研究所创建的一组开放视觉语言模型。它们在PixMo上训练,PixMo是一个拥有100万个图像-文本对的数据集。基于Qwen 2 - 7 B和OpenAI CLIP构建的Molmo 7 B-D几乎与GPT-4V和GPT-4 o一样好用。

引擎:MLX-VLM

MLX-VLM是Prince Canuma(Blaizzy)开发的一款工具,用于在Mac上使用MLX运行和微调视觉语言模型(VLM)。它支持许多模型,如molmollavallava_bunnyllava_nextmllamamulti_modalitypaligemmaphi3_vpixtralqwen2_vl。这些模型可在MLX社区的Hugging Face上找到,您可以在那里免费下载。

MLX社区

Hugging Face上的MLX社区是一个分享Apple MLX框架的预转换模型权重的中心。它提供的模型可以用于训练、微调和部署大型语言模型(LLMs)和视觉模型等任务。已经实现的一些流行任务,如语音识别的耳语和图像生成的稳定扩散。用户还可以通过上传模型或在项目中使用MLX工具来做出贡献。

具体实现示例

我们将使用下面的图片来测试我们的工作流程。您可以替换图像并调整不同应用程序的提示。例如,您可以计算停车场中的汽车数量、人群中的人数或确定体育场中的空座位。本文将使用视觉语言模型对下图中的钢管数量进行检测计数。

img

首先,我们需要设置一个虚拟环境并安装所需的库。以下是步骤列表:

  1. 创建并激活虚拟环境。
  2. 安装必要的软件包:
pip install -U mlx-vlm
pip install einops
pip install torch torchvision
pip install matplotlib

在MLX中运行Molmo

在MLX中运行此模型非常容易。您可以复制并粘贴以下代码,然后就可以尝试这个模型了。请确保根据您的用例更改图像路径。对我来说,我将保留pipes_test.jpg,在提示符中,我只会简单地问:“Point the pipes in the images。"【指向图像中的管道】

from mlx_vlm import load, apply_chat_template, generate
from mlx_vlm.utils import load_image
import matplotlib.pyplot as pltmodel, processor = load("mlx-community/Molmo-7B-D-0924-4bit",processor_config={"trust_remote_code": True})
config = model.configimage_path = "pipes_test.jpg"
image = load_image(image_path)messages = [{"role": "user", "content": "Point the pipes in the images"}]prompt = apply_chat_template(processor, config, messages)output = generate(model, processor, image, prompt, max_tokens=1200, temperature=0.7)
print(output)

上面的代码片段的输出如下:

<points x1="12.3" y1="76.8" x2="17.0" y2="63.9" x3="19.8" y3="49.0" x4="20.7" y4="80.6" x5="24.9" y5="66.7" x6="26.8" y6="50.8" x7="30.9" y7="84.8" x8="33.6" y8="70.2" x9="40.0" y9="88.3" alt="pipes in the images">pipes in the images</points>

然而,为了验证这个输出,我们需要对这些点进行后处理并绘制在我们的图像之上。

绘制输出结果

让我们实现两个函数:第一个用于解析点坐标,第二个用于绘制它们。在解析点时,需要注意的是,坐标是根据图像的宽度和高度进行规范化的。如下面的代码片段所示,我们需要将归一化值除以100,然后分别乘以图像的宽度和高度。

def parse_points(points_str):# Function was taken from https://github.com/Blaizzy/mlx-vlmif isinstance(points_str, tuple):return points_strx_coords = []y_coords = []# Handle multi-point formatif 'x1="' in points_str:i = 1while True:try:x = float(points_str.split(f'x{i}="')[1].split('"')[0])y = float(points_str.split(f'y{i}="')[1].split('"')[0])x_coords.append(x)y_coords.append(y)i += 1except IndexError:breakelif 'x="' in points_str:x = float(points_str.split('x="')[1].split('"')[0])y = float(points_str.split('y="')[1].split('"')[0])x_coords.append(x)y_coords.append(y)try:labels = points_str.split('alt="')[1].split('">')[0].split(", ")item_labels = labelsexcept IndexError:item_labels = [f"Point {i+1}" for i in range(len(x_coords))]return x_coords, y_coords, item_labels

现在让我们使用Matplotlib来绘制图像顶部的点的位置。您也可以绘制标签。

def plot_locations(points: str | tuple, image, point_size=10, font_size=12):if isinstance(points, str):x_coords, y_coords, item_labels = parse_points(points)else:x_coords, y_coords, item_labels = pointsgrayscale_image = image.convert("L")img_width, img_height = grayscale_image.sizex_norm = [(x / 100) * img_width for x in x_coords]y_norm = [(y / 100) * img_height for y in y_coords]if len(item_labels) != len(x_norm):item_labels *= len(x_norm)plt.figure(figsize=(10, 8))plt.imshow(grayscale_image, cmap="gray")plt.axis("off")for i, (x, y, label) in enumerate(zip(x_norm, y_norm, item_labels), start=1):label_with_number = f"{i}"plt.plot(x, y, "o", color="red", markersize=point_size, label=label_with_number)plt.annotate(label_with_number,(x, y),xytext=(0, 10),textcoords="offset points",ha="center",color="red",fontsize=font_size,)plt.show()

最终结果

您可以看到管道被正确地标识,并且每个管道都有一个关联的ID。您可以修改代码并尝试许多其他用例。

img


在这里插入图片描述

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


http://www.ppmy.cn/ops/142582.html

相关文章

GB28181系列四:GB28181实战

我的音视频/流媒体开源项目(github) GB28181系列目录 目录 一、GB28181平台 二、IPC向BXC_SipServer注册 三、GB28181播放器 GB28181的基础理论已经介绍完毕&#xff0c;上篇文章也介绍了GB28181流媒体服务器ZLMediaKit&#xff0c;本篇文章将搭建一整套的GB28181框架&…

5G学习笔记之SNPN系列之ID和广播消息

目录 1. 概述 2. SNPN ID 3. SNPN广播消息 1. 概述 SNPN&#xff1a;Stand-alone Non-Public Network&#xff0c;独立的非公共网络&#xff0c;由NPN独立运营&#xff0c;不依赖与PLMN网络。 SNPN不支持的5GS特性&#xff1a; 与EPS交互 emergency services when the UE acce…

【C++】易混淆——多继承和多态,虚继承和虚函数用法示例

多继承不是多态 二者的区别如下&#xff1a; ①多继承 概念&#xff1a;指一个派生类可以同时继承多个基类的属性和方法。例如&#xff1a; class Base1 { public:void function1() {} };class Base2 { public:void function2() {} };class Derived : public Base1, public…

平衡二叉树

本节来学习判断一棵二叉树是否为平衡二叉树,并使用两种解决问题方法.第一种采用自顶向下的方式,效率不理想,第二种采用自下而上的方式,当发现不满足条件时终止.通过实例感受到程序设计思想对执行效率的重要影响. 问题描述: 给定一棵二叉树,判断该二叉树是否为平衡二叉树. 自顶…

VR虚拟展厅的实时互动是如何实现的?

VR虚拟展厅的实时互动是通过一系列技术和流程实现的&#xff0c;这些技术和流程共同确保了用户在虚拟环境中的互动体验能够及时响应和更新。 接下来&#xff0c;由专业从事VR虚拟展厅制作的圆桌3D云展厅平台为大家介绍一下实现VR虚拟展厅实时互动的几个关键要素&#xff1a; 高…

实验16 循环神经网络(3)

目录 1.数据处理 1.1.数据集下载 1.2.数据加载 1.2.1读取数据 1.2.2词表转换 1.2.3封装数据 2. 模型构建 2.1汇聚层算子 2.2模型汇总 3. 模型训练 3.1模型训练 3.2绘制准确率和损失函数图像 4. 模型评价 5. 模型预测 6. 基于Torch的单向LSTM 6.1模型修改-只返…

STUN服务器用于内网NAT的方案

在内网中部署 STUN 服务器的场景通常用于处理多层 NAT 或内网客户端之间的通信需求&#xff0c;尤其是在大企业或学校等复杂网络环境下。通过 STUN 服务器&#xff0c;可以帮助客户端设备检测和适配 NAT 转换规则&#xff0c;进而支持 WebRTC 或其他实时通信技术的正常运行。 …

深入探索 Flink DataStream API

Apache Flink 的 DataStream API 为处理无界数据流提供了强大而灵活的工具。以下将从五个模块详细介绍 DataStream API。 一、数据源模块 &#xff08;一&#xff09;数据读取方式 文件数据源&#xff1a; 支持多种文件格式&#xff1a;如文本文件&#xff08;.txt&#xff0…