我赌你还在用Bounding Box!大神早已用PixelRefer,让AI看懂每一个像素!

当前 MLLM 擅长全局场景级理解与推理,在像素级细粒度视觉理解任务上仍表现薄弱。

视觉语言理解已从整体场景级认知,迈向更细粒度的像素级目标级推理。然而,当下的研究工作多局限于单个物体的描述,难以深入理解多对象属性、交互关系及其时序演变,且牺牲了模型本身的通用理解能力。

研究人员给出创新的解决方案 PixelRefer:一个统一的时空像素级区域级理解框架,可实现任意粒度下的精细视觉指代与推理,在多项像素级细粒度理解任务取得领先性能表现,且模型推理时间、显存占用大幅优于现有工作。

PixelRefer 实现极小目标的准确语义理解以及时空物体区域理解。

一、核心看点

  • 对像素级区域模型进行深入的分析:(i)语义丰富的区域表征直接决定像素级语义理解的质量;(ii)在 LLM 深层阶段,全局视觉标记的作用显著减弱;
  • 引入 PixelRefer 与轻量化 PixelRefer-Lite 方法,实现高效像素级理解的同时,保持视觉语言模型本身通用视觉理解能力;
  • 构建大规模区域级指令数据集 PixelRefer-2.2M,包含细粒度物体感知与全局视觉指令微调数据。

二、原理与做法

构建 Vision-Object Framework与Object-only Framework。其中对于 Vision-Object Framework,把全局视觉 token + 像素级区域 token + 文本 token 一起送入 LLM,既保留场景语境,又在对象级上精细推理。对于 Object-only Framework,将全局特征在前处理阶段融合入对象 token 表示中。这样一来,LLM 无需再使用全局视觉标记,显著降低显存与时间消耗,同时保持语义一致性与理解精度。

Scale-Adaptive Object Tokenizer(SAOT)。该像素级物体编码器能自适应地调整不同大小目标的特征尺度,让微小物体不被忽略、巨大目标不冗余;同时引入掩膜特征聚合(Abundant Feature Aggregation)与相对位置编码,让目标区域的表征既紧凑又富含上下文信息。

Object-Centric Infusion Module(OCI),该模块采用分层注意力机制,在局部与全局两个层面逐步注入视觉特征。通过 Local-to-Object 和 Global-to-Object Attention,使目标的表征同时具备细节感知与全局语义,从而实现更完整的上下文融合。

构建 Foundational Object Perception(140 万样本):涵盖物体、部件、时序关系的识别与描述;Visual Instruction Tuning(80 万样本):覆盖区域 QA、视频 QA、多对象关系与未来事件预测。

三、性能结果

  • 对于图像像素级细粒度理解 benchmark

  • 对于视频像素级细粒度理解 benchmark

  • 对于推理时间与效率的计算

  • 对于区域 token 的表征个数

四、研究意义与总结

PixelRefer 的提出,为多模态大模型的精细化视觉理解提供了新的方向,让模型从“看懂一张图”,进一步迈向“精确理解图中对象在时间与空间上的语义关系与变化”。无论在机器人感知、自动驾驶场景、医疗影像分析,还是影视内容理解与视频检索,都有很大的应用潜力和拓展空间。

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线科技企业深耕十二载,见证过太多因技术卡位而跃迁的案例。那些率先拥抱 AI 的同事,早已在效率与薪资上形成代际优势,我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在大模型的学习中的很多困惑。我们整理出这套 AI 大模型突围资料包

  • ✅ 从零到一的 AI 学习路径图
  • ✅ 大模型调优实战手册(附医疗/金融等大厂真实案例)
  • ✅ 百度/阿里专家闭门录播课
  • ✅ 大模型当下最新行业报告
  • ✅ 真实大厂面试真题
  • ✅ 2025 最新岗位需求图谱

所有资料 ⚡️ ,朋友们如果有需要 《AI大模型入门+进阶学习资源包》下方扫码获取~
在这里插入图片描述

① 全套AI大模型应用开发视频教程

(包含提示工程、RAG、LangChain、Agent、模型微调与部署、DeepSeek等技术点)
在这里插入图片描述

② 大模型系统化学习路线

作为学习AI大模型技术的新手,方向至关重要。 正确的学习路线可以为你节省时间,少走弯路;方向不对,努力白费。这里我给大家准备了一份最科学最系统的学习成长路线图和学习规划,带你从零基础入门到精通!
在这里插入图片描述

③ 大模型学习书籍&文档

学习AI大模型离不开书籍文档,我精选了一系列大模型技术的书籍和学习文档(电子版),它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础。
在这里插入图片描述

④ AI大模型最新行业报告

2025最新行业报告,针对不同行业的现状、趋势、问题、机会等进行系统地调研和评估,以了解哪些行业更适合引入大模型的技术和应用,以及在哪些方面可以发挥大模型的优势。
在这里插入图片描述

⑤ 大模型项目实战&配套源码

学以致用,在项目实战中检验和巩固你所学到的知识,同时为你找工作就业和职业发展打下坚实的基础。
在这里插入图片描述

⑥ 大模型大厂面试真题

面试不仅是技术的较量,更需要充分的准备。在你已经掌握了大模型技术之后,就需要开始准备面试,我精心整理了一份大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余

图片

以上资料如何领取?

在这里插入图片描述

为什么大家都在学大模型?

最近科技巨头英特尔宣布裁员2万人,传统岗位不断缩减,但AI相关技术岗疯狂扩招,有3-5年经验,大厂薪资就能给到50K*20薪!

图片

不出1年,“有AI项目经验”将成为投递简历的门槛。

风口之下,与其像“温水煮青蛙”一样坐等被行业淘汰,不如先人一步,掌握AI大模型原理+应用技术+项目实操经验,“顺风”翻盘!
在这里插入图片描述
在这里插入图片描述

这些资料真的有用吗?

这份资料由我和鲁为民博士(北京清华大学学士和美国加州理工学院博士)共同整理,现任上海殷泊信息科技CEO,其创立的MoPaaS云平台获Forrester全球’强劲表现者’认证,服务航天科工、国家电网等1000+企业,以第一作者在IEEE Transactions发表论文50+篇,获NASA JPL火星探测系统强化学习专利等35项中美专利。本套AI大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。

资料内容涵盖了从入门到进阶的各类视频教程和实战项目,无论你是小白还是有些技术基础的技术人员,这份资料都绝对能帮助你提升薪资待遇,转行大模型岗位。
在这里插入图片描述
在这里插入图片描述

以上全套大模型资料如何领取?

在这里插入图片描述

<think>根据用户提供的引用和问题,用户希望在Python中处理ROS的DetectionArray消息并提取BoundingBox中的class_id。具体来说,用户想要订阅并解析ROS中的DetectionArray消息(可能是darknet_ros_msgs或类似包中定义的消息类型),并从中提取每个检测到的目标的类别ID(class_id)。 步骤分析: 1. 需要确认消息类型:用户提到了DetectionArray,但根据引用[1]和引用[4],可能使用的是darknet_ros_msgs中的BoundingBoxes消息(包含一个BoundingBox数组)或者是vision_msgs中的DetectionArray。这里需要根据用户实际使用的消息类型来编写代码。 2. 根据引用[1]的示例,用户展示了一个订阅`/darknet_ros/bounding_boxes`话题的例子,该话题的消息类型是`darknet_ros_msgs.msg.BoundingBoxes`。而引用[2]和[4]则提到了自定义的BoundingBox消息。 3. 假设用户使用的是`darknet_ros_msgs.msg.BoundingBoxes`,那么每个消息包含一个`bounding_boxes`列表,每个元素是一个`BoundingBox`对象,该对象有`Class`属性(注意是大写C)表示类别。 4. 但是用户问题中提到了“DetectionArray”,这可能是另一个消息类型。在ROS中,有一个标准消息包`vision_msgs`,其中定义了`DetectionArray`消息(包含多个`Detection`,每个`Detection`包含一个`bbox`和`results`)。因此,我们需要明确用户使用的是哪个消息类型。 5. 由于用户没有明确,这里提供两种情况的代码: 情况1:使用darknet_ros_msgs(如引用[1]) 情况2:使用vision_msgs(标准DetectionArray) 由于用户上一次的问题中引用了darknet_ros,我们先按情况1处理,同时给出情况2的代码。 步骤: 1. 导入必要的ROS消息类型。 2. 创建订阅者,订阅相应的话题。 3. 在回调函数中解析消息,提取class_id。 情况1:darknet_ros_msgs 消息结构: BoundingBoxes消息包含一个header和一个bounding_boxes列表(每个元素是BoundingBox类型)。 BoundingBox类型包含:Class(字符串)、probability(浮点数)以及坐标。 情况2:vision_msgs 消息结构: DetectionArray消息包含一个header和一个detections列表(每个元素是Detection类型)。 Detection类型包含一个bbox(通常是BoundingBox2D)和一个results(包含id和score等)。 由于用户问题中明确提到了“DetectionArray”,我们重点考虑情况2,但为了全面性,两种都给出。 代码示例: 情况1:使用darknet_ros_msgs(假设消息类型为darknet_ros_msgs.msg.BoundingBoxes) ```python #!/usr/bin/env python import rospy from darknet_ros_msgs.msg import BoundingBoxes def callback(data): # 遍历所有检测到的边界框 for box in data.bounding_boxes: class_id = box.Class # 注意:在darknet_ros_msgs中是大写的Class probability = box.probability rospy.loginfo("Detected class: %s with probability: %.2f", class_id, probability) def listener(): rospy.init_node('bounding_box_subscriber') # 订阅的话题名称和消息类型 rospy.Subscriber('/darknet_ros/bounding_boxes', BoundingBoxes, callback) rospy.spin() if __name__ == '__main__': listener() ``` 情况2:使用vision_msgs(假设消息类型为vision_msgs.msg.DetectionArray) 注意:需要确保安装了vision_msgs包(可以通过apt安装:`sudo apt install ros-<distro>-vision-msgs`,或者从源码编译) ```python #!/usr/bin/env python import rospy from vision_msgs.msg import DetectionArray, Detection from vision_msgs.msg import ObjectHypothesisWithPose # 用于results def callback(data): # 遍历所有检测结果 for detection in data.detections: # 每个detection可能包含多个假设(results),但通常我们取最高分的那个 if len(detection.results) > 0: # 通常results是一个ObjectHypothesisWithPose数组,我们取第一个 hypothesis = detection.results[0] class_id = hypothesis.id # 这个id可能是整数,但通常我们使用字符串表示,需要从数据库映射,或者直接是类别名 score = hypothesis.score rospy.loginfo("Detected class id: %s with score: %.2f", class_id, score) else: rospy.logwarn("Detection without any hypothesis!") def listener(): rospy.init_node('detection_subscriber') # 假设话题名为/detections rospy.Subscriber('/detections', DetectionArray, callback) rospy.spin() if __name__ == '__main__': listener() ``` 注意:在情况2中,`ObjectHypothesisWithPose`的id通常是整数,表示类别的id(需要映射到类别名),但有时也可能是字符串。这取决于发布该消息的节点是如何填充的。 如果用户使用的是自定义的消息(如引用[2]中自己创建的包),则需要导入自定义的消息类型。例如,如果用户自定义的消息包名为`cornernet_ros_msgs`,消息类型为`BoundingBoxes`,那么导入方式为: ```python from cornernet_ros_msgs.msg import BoundingBoxes ``` 然后回调函数的写法与情况1类似,但需要根据自定义消息的具体结构来提取class_id。 总结: 1. 确定实际使用的消息类型和话题名称。 2. 导入相应的消息类型。 3. 在回调函数中遍历检测结果,提取class_id。 如果用户不确定消息类型,可以通过以下命令查看消息结构: ``` rostopic info /your/topic/name rosmsg show your_package/MessageType ``` 请根据实际情况选择代码示例并调整。</think>### 在Python中订阅并解析ROS的DetectionArray消息提取class_id 以下是完整的解决方案,通过创建ROS订阅者来处理DetectionArray消息并提取BoundingBox中的class_id: ```python #!/usr/bin/env python import rospy # 导入必要的消息类型(根据实际消息包名调整) from vision_msgs.msg import DetectionArray, Detection, BoundingBox2D # 如果使用darknet_ros_msgs包: # from darknet_ros_msgs.msg import BoundingBoxes, BoundingBox def detection_callback(msg): """处理DetectionArray消息的回调函数""" rospy.loginfo(f"收到 {len(msg.detections)} 个检测结果") # 遍历所有检测对象 for i, detection in enumerate(msg.detections): try: # 提取class_id - 根据实际消息结构调整 class_id = detection.results[0].id # 标准vision_msgs结构 # 如果是darknet_ros_msgs结构: # class_id = detection.bounding_box.Class # 提取边界框信息 bbox = detection.bbox center = bbox.center size = bbox.size rospy.loginfo(f"检测对象 #{i+1}:") rospy.loginfo(f" 类别ID: {class_id}") rospy.loginfo(f" 中心坐标: ({center.x:.2f}, {center.y:.2f})") rospy.loginfo(f" 尺寸: {size.x:.2f} x {size.y:.2f}") # 在此添加您的处理逻辑... except IndexError: rospy.logwarn(f"检测对象 #{i+1} 缺少结果数据") except AttributeError: rospy.logerr("消息结构不匹配,请检查消息类型") def main(): rospy.init_node('detection_processor', anonymous=True) # 订阅DetectionArray消息(根据实际话题名调整) rospy.Subscriber( '/detection_topic', # 替换为实际话题名,如:/darknet_ros/detections DetectionArray, # 消息类型 detection_callback, # 回调函数 queue_size=10 # 消息队列大小 ) rospy.loginfo("检测处理器已启动,等待消息...") rospy.spin() # 保持节点运行 if __name__ == '__main__': try: main() except rospy.ROSInterruptException: pass ``` ### 关键步骤解析: 1. **消息类型确认**: - 标准`vision_msgs/DetectionArray`结构: ```python DetectionArray.detections[] → Detection → results[] (ObjectHypothesis) → id (class_id) bbox (BoundingBox2D) → 位置和尺寸信息 ``` - `darknet_ros_msgs/BoundingBoxes`结构[^1]: ```python BoundingBoxes.bounding_boxes[] → BoundingBox → Class (class_id) xmin, ymin, xmax, ymax (边界框坐标) ``` 2. **消息调试技巧**: ```python # 打印完整消息结构(调试用) rospy.loginfo(rospy.get_caller_id() + f" 收到消息: {msg}") # 查看消息类型 rospy.loginfo(f"消息类型: {msg._type}") ``` 3. **自定义消息处理**: 如果使用自定义消息(如引用[2]的`cornernet_ros_msgs`): ```python from cornernet_ros_msgs.msg import DetectionArray ``` 4. **常见问题解决**: - **消息未收到**: ```bash rostopic list # 确认话题名称 rostopic echo /your_detection_topic # 验证消息发布 ``` - **属性错误**: 使用`rosmsg show vision_msgs/DetectionArray`检查消息结构 - **消息延迟**: 增加`queue_size`参数或使用多线程处理 ### 数据处理扩展: ```python # 提取所有class_id到列表 class_ids = [detection.results[0].id for detection in msg.detections] # 按class_id分组统计 from collections import defaultdict class_count = defaultdict(int) for detection in msg.detections: class_id = detection.results[0].id class_count[class_id] += 1 ``` ### 与深度信息融合(引用[3]): ```python # 在回调函数中添加深度处理 def detection_callback(msg): for detection in msg.detections: center = detection.bbox.center # 获取该位置的深度值(需订阅深度话题) depth = depth_image[round(center.y), round(center.x)] rospy.loginfo(f"类别 {class_id} 深度: {depth:.2f}m") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值