Skip to main content

8. 多模态视觉定位应用

8. 多模态视觉定位应用1. 概念介绍1.1 “多模态视觉定位”是什么?1.2 实现原理简述2. 代码解析关键代码1. 工具层入口 (largemodel/utils/tools_manager.py)2. 模型接口层 (largemodel/utils/large_model_interface.py)代码解析3. 实践操作3.1 配置在线LLM3.2 启动并测试功能

1. 概念介绍

1.1 “多模态视觉定位”是什么?

多模态视觉定位 是一种结合了多种传感器输入(如摄像头、深度传感器、IMU等)和算法处理技术,以实现对设备或用户在环境中的精确位置和姿态的识别与跟踪的技术。这种技术不仅依赖于单一类型的传感数据,而是整合了来自不同感知模式的信息,从而提高了定位的准确性和鲁棒性。

1.2 实现原理简述

  1. 跨模态表示学习 :为了使LLM具备处理视觉信息的能力,需要开发一种机制,将视觉信号转换为模型可以理解的形式。这可能涉及使用卷积神经网络(CNNs)或其他适合图像处理的架构提取特征,并将其映射到与文本相同的嵌入空间中。
  2. 联合训练 :通过设计适当的损失函数,可以在同一个框架内同时训练文本和视觉数据,使得模型学会在这两种模式之间建立联系。例如,在一个问答系统中,既可以根据提供的文本问题,也可以根据相关的图片内容给出答案。
  3. 视觉引导的语言生成/理解 :一旦建立了有效的跨模态表示,就可以利用视觉信息来增强语言模型的功能。比如,当给定一张照片时,模型不仅可以描述图中发生了什么,还可以回答关于该场景的具体问题,甚至根据视觉线索执行指令(如导航到某个地点)。

2. 代码解析

关键代码

1. 工具层入口 (largemodel/utils/tools_manager.py)

此文件中的visual_positioning函数定义了该工具的执行流程,特别是它如何构建一个包含目标物体名称和格式要求的Prompt。

# From largemodel/utils/tools_manager.py class ToolsManager : # ... def visual_positioning ( self , args ): """ Locate object coordinates in image and save results to MD file. 定位图像中物体坐标并将结果保存为MD文件。 :param args: Arguments containing image path and object name. :return: Dictionary with file path and coordinate data. """ self . node . get_logger (). info ( f"Executing visual_positioning() tool with args: {args}" ) try : image_path = args . get ( "image_path" ) object_name = args . get ( "object_name" ) # ... (路径回退机制和参数检查) # Construct a prompt asking the large model to identify the coordinates of the specified object. / 构造提示,要求大模型识别指定物品的坐标。 if self . node . language == 'zh' : prompt = f"请仔细分析这张图片,用一个个框定位图像每一个{object_name}的位置..." else : prompt = f"Please carefully analyze this image and find the position of all {object_name}..." # ... (构建独立的message上下文) result = self . node . model_client . infer_with_image ( image_path , prompt , message = message_to_use ) # ... (处理和解析返回的坐标文本) return { "file_path" : md_file_path , "coordinates_content" : coordinates_content , "explanation_content" : explanation_content } # ... (错误处理)

2. 模型接口层 (largemodel/utils/large_model_interface.py)

此文件中的infer_with_image函数是所有图像相关任务的统一入口。

​ x # From largemodel/utils/large_model_interface.py ​ class model_interface : # ... def infer_with_image ( self , image_path , text = None , message = None ): """Unified image inference interface. / 统一的图像推理接口。""" # ... (准备消息) try : # 根据 self.llm_platform 的值,决定调用哪个具体实现 if self . llm_platform == 'ollama' : response_content = self . ollama_infer ( self . messages , image_path = image_path ) elif self . llm_platform == 'tongyi' : # ... 调用通义模型的逻辑 pass # ... (其他平台的逻辑) # ... return { 'response' : response_content , 'messages' : self . messages . copy ()}

代码解析

视觉定位功能的核心在于通过精确的指令引导大模型输出结构化数据 。它同样遵循了工具层与模型接口层的分层设计。

  1. 工具层 (tools_manager.py):

    • visual_positioning函数是此功能的业务核心。它接收两个关键参数:image_path(图像路径)和object_name(要定位的物体名称)。
    • 这个函数最核心的操作是构建一个高度定制化的Prompt 。它不仅仅是简单地请求模型描述图片,而是将object_name嵌入到一个精心设计的模板中,明确要求模型“定位图像中每一个{object_name}的位置”,并隐式或显式地要求以特定格式(如坐标数组)返回结果。
    • 构建好Prompt后,它调用模型接口层的infer_with_image方法,将图像和这个定制化的指令一同传递过去。
    • 在从模型接口层拿到返回的文本后,它还需要进行后处理 :使用正则表达式等方法从模型的自然语言回复中解析出精确的坐标数据。
    • 最后,它将解析出的结构化坐标数据返回给上层应用。
  2. 模型接口层 (large_model_interface.py):

    • infer_with_image函数依然扮演着“调度中心”的角色。它接收来自visual_positioning的图像和Prompt,并根据当前配置(self.llm_platform)将任务分发给正确的后端模型实现。
    • 对于视觉定位任务,模型接口层的职责与视觉理解任务时基本相同:将图像数据和文本指令正确打包,发送给所选的模型平台,然后将返回的文本结果原封不动地交还给工具层。所有特定于平台的实现细节都被封装在这一层。

总结来说,视觉定位的通用流程是:ToolsManager接收目标物体名称并构建一个精确的、要求返回坐标的Prompt -> ToolsManager调用模型接口 -> model_interface将图像和该Prompt一起打包,并根据配置发送给相应的模型平台 -> 模型返回包含坐标信息的文本 -> model_interface将文本返回给ToolsManager -> ToolsManager解析文本,提取出结构化的坐标数据并返回。这个过程展示了如何通过Prompt Engineering技术,让通用的视觉大模型完成更具体、更结构化的任务。

3. 实践操作

3.1 配置在线LLM

  1. 先从前面教程的任意一个平台中获取API Key之后获取API Key

  2. 然后需要更新配置文件中的key,打开模型接口配置文件large_model_interface.yaml:

xxxxxxxxxx vim ~/yahboom_ws/src/largemodel/config/large_model_interface.yaml 3. 填入你的API Key : 找到对应的部分,将你刚刚复制的API Key粘贴进去。这里以通义千问配置为例

xxxxxxxxxx # large_model_interface.yaml ​ ## 通义千问 qianwen_api_key : "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" # 粘贴你的Key qianwen_model : "qwen-vl-max-latest" # 可以根据需要选择模型, 如qwen-turbo, qwen-plus 4. 打开主配置文件yahboom.yaml:

xxxxxxxxxx vim ~/yahboom_ws/src/largemodel/config/yahboom.yaml 5. 选择要使用的在线平台 : 修改llm_platform参数为你想要使用的平台名称

xxxxxxxxxx # yahboom.yaml ​ model_service : ros__parameters : # ... llm_platform : 'tongyi' #可选平台: 'ollama', 'tongyi', 'spark', 'qianfan', 'openrouter'

3.2 启动并测试功能

  1. 准备图片文件 :

将一个要测试的图片文件放置到以下的路径: /home/jetson/yahboom_ws/src/largemodel/resources_file/visual_positioning

然后将图片命名为 test_image.jpg

  1. **启动 largemodel 主程序:

打开一个终端,然后运行下面的指令:

xxxxxxxxxx ros2 launch largemodel largemodel_control.launch.py text_chat_mode:=true 3. 发送文本指令 : 再次打开另一个终端,运行下面的指令,

xxxxxxxxxx ros2 run text_chat text_chat

然后开始输入文本:“分析一下图片中恐龙的位置”。

  1. 观察结果 : 在第一个运行主程序的终端中,你将看到日志输出,显示系统接收到指令,调用visual_positioning工具,提示visual_positioning执行完成,并且将坐标保存到了文档。

我们可以到 ~/yahboom_ws/src/largemodel/resources_file/visual_positioning 路径下找到这个文档。