
Semantic-SAM Repository Application
My repository: https://github.com/Chen-Yulin/Semantic-SAM
My venv: ssam
测试过的python版本:3.8,3.10
官方步骤:
1 | pip3 install torch==1.13.1 torchvision==0.14.1 --extra-index-url https://download.pytorch.org/whl/cu113 |
根据[[Cuda+Torch]],需要先安装cudatoolkit
和cuda-toolkit
1 | conda install nvidia/label/cuda-11.7.0::cuda-toolkit -c nvidia/label/cuda-11.7.0 |
然后按照torch官网的安装指令:
1 | conda install pytorch==1.13.1 torchvision==0.14.1 torchaudio==0.13.1 pytorch-cuda=11.7 -c pytorch -c nvidia |
第二行直接运行可能会报错,提示系统gcc版本过高,安装gcc=11.2.0
1 | conda install -c conda-forge gcc=11.2.0 |
如果编译时出现ld: cannot find -lcudart: No such file or directory collect2: error: ld returned 1 exit status
报错,只是因为没有安装cudatoolkit
^ ^
安装完成后直接import semantic_sam
会报错ModuleNotFoundError: No module named 'MultiScaleDeformableAttention'
^ ^
提示:
1 | Please compile MultiScaleDeformableAttention CUDA op with the following commands: |
需要手动make一下 Mask2Former
:
1 | cd Mask2Former/mask2former/modeling/pixel_decoder/ops/ |
一些版本问题
1 | pip install gradio==3.37.0 |
1 | python demo.py --ckpt ./weights/swinl_only_sam_many2many.pth |
Comment: 效果相较于SAM更多体现了语义的一致性,而不是基于texture进行分割。
1 | python demo_auto_generation.py --ckpt ./weights/swinl_only_sam_many2many.pth |
原图:
.png)Instance identification:
Part segmentation
在人机协作的工作环境中,准确地理解与推理工作场景至关重要。传统方法往往依赖静态感知技术,难以处理动态变化的场景信息。随着深度学习和大语言模型的进步,结合场景大模型与知识图谱的多模态推理技术,将为环境理解提供更强的动态感知和智能推理能力。
本研究的目标是提出一种结合场景大模型(Scene-LLM)与知识图谱的动态工作环境理解方法,利用深度学习的图像处理、物体检测和推理能力,优化人机协作的效率和安全性。具体目标包括:
知识图谱是机器人了解工人与工件之间关系的重要凭依,所以第一步需要构建工人任务的知识图谱。(融合持续学习和推理的思想)
知识图谱的结构(表格的形式表示关系和实体的类型****)通常是由实体(Nodes)和关系(Edges)组成的图。在人机协作工作环境,本方案构建的知识图谱的结构包括以下几个主要组件:
Nodes
工件:每个工件都作为一个节点,节点包含工件的属性(如形状、尺寸、材质等,也可以包括多角度的图片),注:工件不一定是单独的零件,可以是装配体,也因此,整个装配任务可以被组织为一个树状的装配流程
工具:每种工具作为一个节点,节点包含工件的属性(如形状、尺寸、材质等,也可以包括多角度的图片)。
人员:描述工人或操作人员的节点,包含技能、工作任务等信息。
Edges
包含(Part-of):表示某个工件是另一个工件的组成部分。
依赖(Depends-on):描述任务或工具之间的依赖关系。例如,某个装配任务依赖于特定工具或工件。
执行(Performs):表示人员与任务之间的执行关系,指示某个人员执行特定的任务。
有选择地更新(亮点)
场景语义化的核心目标是从原始场景数据中提取出有意义的实体(如工件、工具等)和它们之间的关系,并为这些实体和关系赋予语义标签,并输出给下游的推理模块生成任务。
主要分为以下几个步骤:
场景数据采集
全局的像素级特帧点云 M
由一系列点构成,每个点都由顶点位置,法向向量,置信度数量,颜色和概念向量(concept vector)组成
想要生成这样的像素级特征点云M
,首先需要进行帧(单张输入图片)预处理:通过一系列输入的深度图片获取顶点法相maps和相机方位,再通过计算获得每张图片中每个像素的语义上下文嵌入。其中,语义上下文的嵌入是通过结合局部和全局的CLIP features获得的。
然后再进行特征融合:通过相机的方位将每个帧的顶点和法相图映射到全局坐标系。对于帧$X_{t}$中的每个像素$(u,v)_t$,都在全局的点云图中具有相应的点$P_k$
以下是将不同帧$X_t$中的特征集合在M
中特征点的公式:
通过ConceptFusion的预处理和语义上下文嵌入,就获得了精确的场景语义点云信息。
场景Token化:由于场景语义点云的信息过于密集,导致信息长度不可控,不利于输入大模型,所以使用Scene-LLM中的体素均匀下采样方法,将图像数据转化为统一的tokens格式,确保数据可以与prompt一起输入Scene-LLM模型进行推理,同时也便于将场景进行动态更新。
具体来说,这里首先将空间分为具有尺寸x×y×z的固定分辨率体素网格,其中x,y,z代表沿着各个轴的素数。由于这种固定的分辨率,在不同场景中的体素数量有所不同。其次,对于每个体素,使用K近邻(KNN)方法将所有包含的点聚类。每个点的特征包括语义属性和空间坐标。由此可以获得特征的体素网格:
其中D是语义特征的维度,而3是空间坐标的维度。
最后,计算可见性映射V∈{0,1} x×y×z,表明每个体素中的点存在(1)或不存在(0)。仅使用可见体素的特征用作视觉tokens。这种 hybrid-representation 通过均匀地采样点云信息设置来保留密集的空间信息,同时促进了语义特征空间的动态更新。
语义体素网络的动态更新可以通过如下方式实现:为了更新场景以状态t的 $f^{vox}_t$ 到状态t + 1,我们首先从当前的摄像头视图渲染3D 帧。该帧的语义特征F被投影到3D点的特征映射Fˆ,并将其体素化为F^^{Vox}并且生成 visibility map Vˆ。然后使用以下方式更新语义体素网络
如此便可以确保3D场景的语义表示与任何场景状态变化保持同步。
Scene-LLM生成语义空间信息
CLIP(Contrastive Language-Image Pre-training)是一种基于对比学习的模型,旨在同时处理图像和文本数据,并将它们映射到一个共享的特征嵌入空间中。其训练过程包括对图像和文本对的学习,其中每一对图像和文本(如图像的描述)都会被处理成特征向量,图像由视觉编码器(通常是卷积神经网络或视觉Transformer)处理,文本则通过一个Transformer模型编码。模型的核心思想是通过对比学习的方式优化图像和文本之间的关系,使得正确配对的图像和文本在共享的嵌入空间中距离较近,而不相关的图像和文本则距离较远。这一过程通过对比损失函数(如InfoNCE)进行优化,模型逐渐学习到图像和文本之间的语义对应关系。CLIP在大规模图像-文本数据集上进行训练,通常涉及数百万对图像-文本配对,从而使其能够进行跨模态推理。训练完成后的CLIP能够在零-shot的情况下执行任务,即在没有专门训练的情况下处理新的计算机视觉和自然语言处理任务,如通过文本描述检索相关图像,或者根据图像检索相关文本。
想要比对裁剪图和物品的文字描述,可以通过使用预先使用CLIP预训练好的ViT图编码器和Transformer 文字编码器,分别用于编码物体的裁剪图和知识图谱中对于每一个工件的描述(并不需要每次识别都进行编码,可以预编码之后保存用于后续每次对比)。再使用裁剪图和文字的特征向量进行似然性评估,找到最贴合裁剪图的文字特征向量并由此获得裁剪图对应的具体工件或者工具序号。
语义空间最终输出:场景中所有关键的工具、零件的标签(ID和专业名称)+精确位置坐标(场景中有啥,在哪)
基于知识图谱的推理和任务生成方法在智能系统中扮演着关键角色,特别是在需要理解复杂场景和动态调整任务的应用中。
在获取了语义空间的信息后,知识图谱的应用主要分为以下几个步骤:
通过工人的手部位置+语义空间的信息->判断当前正在装配的工件(检索/搜索过程)+工人在用的工具
正在装配的工件+工人在用的工具+知识图谱->判断下一步需要装配的零件以及需要的工具,并据此生成机器人需要执行的具体任务(比如抓取某区域的关键物体并放置到特定位置,更具体一些?)
具体任务可能包括以下几种:
GRASP
任务描述:机器人需要抓取某一特定区域(
生成任务:结合语义空间的信息,系统会确定物体的精确位置(例如,某个工件的位置),并且会根据工件的形状、尺寸、重量等属性选择适当的抓取策略和工具。系统会向机器人发送抓取任务,指示其准确抓取目标物体。
PLACE
任务描述:机器人将物体放置到指定位置(
生成任务:根据知识图谱和工人正在装配物体的位置,推理出工件的目标位置,例如,物体需要放置在某个工作台上的特定位置。
示例:将抓取的零件放置到工人需要的位置上,确保其放置的位置正确。
GOTO
任务描述:机器人末端移动到指定位置(
生成任务:一般用于机器人执行完PLACE
Momentum Contrast for Unsupervised Visual Representation Learning
伪代码:
1 | # f_q, f_k: encoder networks for query and key |
在使用key encoder(momentum encoder)创建负样本,并把encode过的负样本存在一个queue(FIFO)中方便后续对比时直接使用,每次训练都会使用一个新的mini batch,此时会将此mini batch中的样本encode之后加入queue并删除存在最久的那个mini batch的样本(因为考虑到最老的mini batch使用的encoder是最过时的,所以FIFO是非常合理的),这样可以有效控制负样本的数量,也就是公式中的K。
因为负样本数量(字典/队列)很大,所以没办法给key encoder回传梯度,所以可以考虑把query encoder的参数直接复制给key encoder,但过快改变的key encoder会导致样本字典的特征不一致,所以使用动量更新的方式。
> queue这个字典越大,那么理论上这个m就需要越大,保证字典中key的一致性b)
只有一个编码器进行学习。Memory bank存下了所有样本的key。每当梯度回传后,会把memory bank被本次训练中被采样过的key使用新的encoder进行更新。
MoCo和memory bank 更接近,但是使用了queue dictionary和momentum update
AN IMAGE IS WORTH 16X16 WORDS- TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE
https://www.youtube.com/watch?v=j3VNqtJUoz0&t=16s
核心思想: