Category: AI/ML/DL/CV/NLP/RL/Robotics/BigModels/AIGC

  • SLAM系列之ORB-SLAM3开源系统代码解析-mono(+imu)tracking

    这篇文章将向大家介绍orbslam3开源系统中的单目(+惯导)跟踪算法模块的实现逻辑分析。 跟踪模块在orbslam3中作为计算频率最高的算法模块,在实现中也作为程序的主线程来运行,其他的模块如局部建图(LocalMapping),回环检测(LoopClosing)以及可视化模块(Viewer)均以其他背景线程来并发运行。跟踪模块的主要作用为相机的运动模型(位姿)的实时跟踪和优化。 跟踪模块作为整个系统的入口,其接收从感知传感器捕获的环境数据,如图像数据,IMU,Lidar等,这里将以单目(+imu)场景,且以跟踪+定位(也有只跟踪的模式)的模式为例来进行分析介绍。 一、接收图像并进行处理的函数调用路径(以mono_euroc的example为例)为mono_euroc.cc文件中的SLAM.TrackMonocular(im,tframe)->system.cc文件中的mpTracker->GrabImageMonocular(imToFeed,timestamp,filename)->tracking.cc文件中的GrabImageMonocular函数将图像先转换成灰度图,然后构建Frame类的对象,最后调用Track()函数进行跟踪。这里对Frame构造数据帧对象做一下补充说明:Frame类支持多态的构造函数以支持多个应用场景,如单目,双目,深度相机等,在构造函数里首先直接在畸变的图像上进行ORB特征点和特征描述符的计算提取,然后对特征点进行去畸变的处理。 二、跟踪过程初始化:跟踪过程先判断当前的跟踪状态,跟踪的状态候选有[NOT_INITIALIZED, LOST, RECENTLY_LOST, OK],当判断到系统当前跟踪状态还尚未初始化时(状态为NOT_INITIALIZED),则首先进行单目的初始化工作,其实现函数为MonocularInitialization,初始化的状态由mbReadyToInitializate变量来表示,系统启动时为false,其状态的判别和转换的逻辑详见[1],完整的初始化过程需要两个间隔较短的图像帧且两帧的特征点的数量都超过了设定的阈值。当满足这样的条件时,根据这前后临近的两帧的匹配特征点集合基于对极几何和三角化测量方法(ReconstructWithTwoViews)去初始化相机位姿和地图点坐标,如果成功初始化相机位姿,则调用函数CreateInitialMapMonocular创建初始地图,将初始帧和当前帧作为关键帧加入到当前地图里,同时更新对应的地图点和关键帧之间的关联关系,并进行全局的BA优化以进一步优化相机初始位姿。 三、当跟踪状态为OK时,如果运动模型不可用,则调用TrackReferenceKeyFrame,如果运动模型可用,则先调用TrackWithMotionModel,如果用运动模型跟踪不成功,则回退到用TrackReferenceKeyFrame进行跟踪。其中: (1)、TrackReferenceKeyFrame将当前帧和参考关键帧(临近创建的关键帧)进行特征点匹配(如果匹配的特征点不够,则返回跟踪失败,需要进行重定位),并基于此通过Optimizer的PoseOptimization函数对当前帧进行位姿优化;(2)、TrackWithMotionModel根据运动模型预测当前的相机位姿,并将当前帧和上一帧进行投影搜索,如果匹配点过少,将加大阈值再次将当前帧和上一帧进行投影搜索,满足匹配条件则跟踪成功调用PoseOptimization函数进行优化,否则如果有IMU辅助预测,直接返回true,如果既搜索失败又没有IMU辅助预测,则返回false。TrackReferenceKeyFrame和TrackWithMotionModel分别基于参考关键帧和运动模型对当前帧的特征点进行匹配,并得到和参考关键帧或上一帧所匹配的特征点对应的地图点,Optimizer的PoseOptimization函数主要采用了前面帧得出的地图点世界坐标和对应的当前帧关键点的运动映射所建立的最小化重投影误差模型对相机的位姿和地图点进行联合优化,其具体采用了李代数和g2o的图优化方法,具体的介绍见后续的相关博文。 四、当跟踪的状态为RECENTLY_LOST,如果有IMU,则用IMU进行状态的辅助预测,保持状态为RECENTLY_LOST不变;否则调用Relocalization函数进行重定位,如果重定位成功,则状态转换为OK,否则状态转换为LOST。这里对重定位函数的实现也做一下说明,其主要基于当前帧从地图里查找候选关键帧(调用mpKeyFrameDB->DetectRelocalizationCandidates去检测),然后基于每个候选帧分别和当前帧进行位姿优化(先采用的MLPnPSolver的优化求解方法,实时速度快,只优化相机位姿,找到匹配较优秀的结果作为初始值,和PoseOptimization相结合去进行进一步的更高精确度的位姿优化,具体的实现逻辑参考[2]。 五、当跟踪的状态为LOST,则重新创建新的地图,开始进入新的跟踪初始化状态。 六、当前帧本身的跟踪任务完成后,接下来需要调用TrackLocalMap对局部地图进行跟踪和相关的位姿和地图点的优化,在上一篇文章里也介绍过,局部地图没有专门的封装类,其主要的信息数据在Tracking类的两个变量中,分别为mvpLocalKeyFrames和mvpLocalMapPoints,在实现内部,其通过UpdateLocalMap函数的调用实现了局部关键帧和局部地图点的更新(只对当前的参考帧的匹配的地图点作为约束,约束量偏少,在更大的局部地图点中去搜索更多的匹配点,从而有更多的地图点加入到重投影误差的计算中来,对当前帧的位姿优化也更加准确),然后通过函数SearchLocalPoints去搜索匹配和当前帧在视锥体范围内的匹配的特征点,并基于这些特征点和地图点以及相机位姿等信息进行相机位姿优化。 七、接下来需要通过函数NeedNewKeyFrame来判断是否需要加入关键帧,根据多种条件,比如时间,比如有足够多的新的“接近点”等等,如果需要创建关键帧则调用CreateNewKeyFrame函数来创建关键帧,并将关键帧插入到局部建图器以便进行局部建图的工作。其中局部建图器的大体作用有:1、从尚未处理的关键帧队列里取出关键帧,对关键帧的地图点相关信息进行更新;2、更新关键帧的共视关键帧的图连接;3、将关键帧加入到地图集的当前地图中。这些具体的内容将会在局部建图器的文章中专门介绍。 问题:TrackLocalMap也是通过地图点和特征点的重投影误差采用的Optimizer的PoseOptimization函数进行的相机位姿和地图点的联合优化,为什么在当前帧的跟踪后面还要加上这个过程,其利用了更多的关键帧搜索地图点,因此优化会更准确些吗?回答:在 跟踪阶段,位姿优化依赖当前帧与前一帧(或参考关键帧)之间的特征点匹配关系,但 TrackLocalMap 可以通过当前帧的地图点去搜索局部的多个共视关键帧,查找更多的匹配的地图点。以从更多的视角来优化进一步提升定位精度和地图精度,使得SLAM系统在面对动态场景或挑战性环境时更加稳健。 References

  • SLAM系列之ORB-SLAM3开源系统代码解析-基本数据结构简介

    感谢读者的关注,近期准备向大家介绍ORB-SLAM3的源码解读,准备主要从基本的数据结构、跟踪模块、局部建图模块、回环检测和回环纠正模块、可视化模块以及系统概览这些主题内容分别向大家介绍。欢迎大家的反馈和意见建议以便纠错和补充更新。 这篇短文将向大家介绍ORBSLAM3的基本关键的数据及相关计算的抽象,具体表现为以下几个有代表性的类, 帧(Frame),图像帧数据结构,是视觉slam中基本的传感器单元数据,在单目场景下,一帧的数据为camera某个时间戳对应的图像数据。帧的类中还包含对图像进行ORBExtractor所获取的特征点,特征描述符以及BOW(bag of words,将特征描述符向量根据k叉树结构的词汇表模型进行遍历搜索获得,便于后面的回环检测算法的需要)。帧的类实现中还包括保存优化后当前帧对应的相机的位姿(mTcw),在优化的过程中还有关键点对应的地图点(成员mvpMapPoints,见MapPoint部分的介绍),帧中也维护了camera的内参信息,以及如果是双目立体视觉场景,一帧的数据中还包含右侧camera的图像数据,以及对应的特征点等相关数据。 关键帧(KeyFrame),并不是所有的帧都作为关键帧(这里借鉴了视频压缩里类似的概念,由于camera的帧率一般较高,进行局部和全局相机位姿和地图点优化时一般以关键帧的数据为优化对象),在跟踪逻辑里,会检查是否需要将当前帧作为关键帧的逻辑,比如根据时间和跟踪效果等(具体在跟踪逻辑在NeedNewKeyFrame函数里进行的实现[1])。关键帧主要用于局部地图位姿优化和全局位姿优化,也是构成地图数据的基本单元。keyframe的类实现中也对共视关键帧进行了维护,通过地图点结构就可以得出共视的关键帧,具体的函数实现为UpdateConnections函数,其根据和当前关键帧共视地图点的数量对共视的关键帧进行排序,其中变量mvpOrderedConnectedKeyFrames按和当前关键帧共视的地图点数量的多少将共视关键帧进行排序存放到数组里,mvOrderedWeights存放对应的共视的地图点的权重(数量),mConnectedKeyFrameWeights记录共视关键帧和共视地图点数量的映射关系(以STL中的字典map容器实现)。并根据需要建立关键帧之间的父子关系(父子关键帧通常共享大量的地图点,如果当前关键帧为第一次建立连接且不是地图的初始关键帧则选择排序中的第一个共视关键帧为父关键帧),关键帧按照先后顺序构建成双向的链表,CreateNewKeyFrame的函数里有对这个双向链表进行维护的操作。 关键帧数据库(KeyFrameDatabase),存放了关键帧的集合,并且实现了基于BOW等信息的关键帧查找的一系列方法函数供相关模块使用,比如在回环检测模块,提供了基于根据当前帧查找相似度较大的回环匹配帧候选集合和合并关键帧候选集合等。 地图点(MapPoint),地图点为物理世界中的具体位置点的抽象,包括地图点的世界坐标,观测到该地图点的关键帧集合(mObservations),以及对应的每个关键帧图像中的哪个特征点和该地图点相关联等信息(双目的时候分左右camera的特征点的关联索引)。 地图(Map),地图管理的类里包含了关键帧集合(mspKeyFrames)和地图点的集合(mspMapPoints)[2],在orbslam3中没有专门的类用来抽象局部地图,局部地图的相关数据的维护和更新体现在tracking模块(代码见tracking.cc)的两个相关的成员变量:局部关键帧(mvpLocalKeyFrames)和局部地图点(mvpLocalMapPoints)中,通过TrackLocalMap()函数根据当前帧进行更新和维护[3]。 地图集(Atlas),多个地图的集合(mspMaps),地图集会维护多个map,当系统初始化的时候,或者跟踪出现了LOST状态时,一般也会创建新的map,会生成新的地图并加入到地图集中。关于地图的合并,将在回环检测和全局优化的部分做专门介绍。 ORBVocabulary,为ORB特征的词汇表,其结构为一个KD树(k-dimensional tree),基于大量的多样的场景数据(如KITTI,EUROC,TUM RGB-D等)经过层次聚类而生成,这个词典是离线已经构建好的,直接加载使用就可以。 References

  • 机器学习基础技术系列原理摘要总结

    这篇短文对最近梳理的机器学习基础技术系列做一个摘要总结,以备后续复习和查阅,也希望能够对相关感兴趣的读者有所帮助,如有问题,欢迎读者联系作者勘误修订。感谢大家一直以来的关注和鼓励,后续将继续向大家分享计算机基础核心课程的知识技能和AI基础算法以及相关前言方向进展。 1、线性模型以及广义线性模型,如线性回归,逻辑回归,SoftmaxRegression等,都属于广义上的线性模型(广义线性模型形式上统一为指数分布的公式,上述分布实例都可以写成广义线性模型的公式表示),多项式回归也可以看成是经过了特征映射(feature mapping,类似于核方法)后的线性模型。线性模型基于统计概率的联合概率分布最大似然的原理去求解模型参数(线性模型得出用MSE损失函数,逻辑回归用SigmoidLoss,多分类用SoftmaxLoss,并根据loss可以求得梯度后采用梯度下降求解),优化的方法还有解析解(直接通过矩阵的计算得出参数解,在属性和参数量很大,样本量很大的场景下不适合),还可以基于牛顿法去求解,类似的原因,由于求解Hessian矩阵以及其逆矩阵的代价,牛顿法一般也限于参数量不大的时候去求解。 2、生成学习算法和判别学习算法,直接学习从属性x映射到目标y的函数及其参数学习到后验概率p(y|x)的学习算法称为判别学习算法;而通过概率建模学习条件概率p(x|y)(属性生成的过程特征)以及先验概率p(y)的算法,然后通过贝叶斯规则求解后验概率p(y|x)=argmax(y)p(x|y)p(y)的方法称为生成学习算法,其中GDA(Guassian Determinant Analysis)算法假设p(x|y)服从多元高斯分布,并通过对数似然函数最大化根据样本统计出相关分布的参数,如先验分布和条件分布的概率(如服从高斯分布则参数为均值向量和和协方差矩阵和先验概率)。GDA是比线性回归模型等更强的假设,其假设p(x|y)服从多元高斯分布,而线性回归模型中没有此要求。朴素贝叶斯算法是生成学习算法的一种特例应用,并根据邮件分类和收入预测进行了实际场景应用示例的算法具体化的实现和说明。 3、核方法,核方法是将数据属性通过feature map函数映射到高维空间从而提升算法performance但同时计算量没有显著增加的一种计算策略,有形如参数求解过程中在所有样本上计算<x(i),x(j)>这种内积形式的算法都可以采用核方法。常见的核函数有多项式核函数和高斯核函数(RBF),通过高斯核函数的指数形式的泰勒展开可得高斯核经数据原始属性映射到了无穷维,高斯核函数在可以用到核方法的算法中通常表现不错。 4、SVM,介绍了函数间隔和几何间隔的定义以及之间的关系,其中几何间隔有空间的几何意义是确定的,而函数间隔可以任意scaling因子有任意性。找出对所有样本分类置信度高的决策平面的问题转化为最小几何间隔最大化,这时的分类器又称为最优间隔分类器(The optimal margin classifier)。最后转化为基于线性不等式约束的二次函数优化问题。通过拉格朗日乘数子和朗格朗日对偶优化,在对偶问题中采用KKT条件实现快速优化算法SMO,该方法采用类似于coordinate ascent方法进行alpha参数的优化,由于alpha之间存在着约束,这时采用同时更新两个alpha进行。采用核函数的SVM算法,松弛变量处理在决策边界存在的线性不可分的样本点 5、统计学习理论,假设类(假设空间),根据统计概率的相关引理(1、多个事件至少发生一个的概率最多为每个事件发生的概率和,2、霍夫丁不等式,期望和统计均值之间的差距gamma和样本数量满足不等式关系,当n越来越大时,统计均值可以看成是期望的近似)。根据上述的引理,我们将经验风险最小化(训练误差),泛化误差(generalization error)分别看作为统计均值和期望并采用上述的霍夫丁不等式得出训练样本和两个误差间距的不等式关系(同时得出假设空间中假设函数个数k得出的训练误差最小化和泛化误差最小化的模型之间的关系中的bias和variance的平衡的形式化描述)。描述了假设类打散(shatter)样本数据集的定义,如果存在着样本标签的所有可能的分配,都能在假设类(假设空间)中找到一个假设函数,实现正确的预测,则称假设类打散数据集。VC维定义为假设类打散数据集的最大的样本数量。最小化经验风险和模型泛化误差的置信度关系,bias和variance的关系以及之间的tradeoff。 6、模型选择和验证,介绍了cross validation方法,k-fold cross validation算法性能验证策略。模型选择部分主要前向搜索和后向搜索以及基于互信息(KL散度的)属性重要性得分高低作为重要性进行排序。 7、结构分析(structure analysis,KMeans,DBSCAN,Hierarchical Clustering),KMeans的收敛和局部最小化,KMeans的K超参搜索方法,Kmeans在非凸集数据上表现不好的问题,基于密度的聚类算法,核心样本,边界样本和离群点,层次聚类的聚类时的依据,层次聚类从最细粒度的每个样本一个类别到最粗粒度的一个大簇的中间每一次聚合(两个簇合并)的结果都有展现,通过dendrogram树状图进行可视化展示,方便看到不同层次聚类的结果状态。 8、EM算法,在有隐变量的模型场合,隐变量没有在观测数据中体现,通过对含有隐变量的似然概率建模的情况下,并通过相关的等式(设计出每个样本基于隐变量的概率分布的表达式并进行相关的等式变换和)不等式(jesen不等式)变换去求解对数似然函数的下界,在下界成立时得出相关的条件即为E-step,下一步去最大化这个下界M-step,通过这两个步骤的不停迭代,最后求出包含隐变量的相关模型参数的解。 9、因素分析(Factor analysis)。通过少数的几个因素建模大量属性之间的关系,假设少数维度的隐向量满足高斯分布,通过仿射变换矩阵Lambda将隐变量映射到属性x的空间,通过学习这个仿射变换,x均值u,以及x的噪声协方差矩阵就可以通过z和模型参数构建属性x,而模型参数的学习方法主要是通过EM去迭代,这里主要用到了多维高斯分布以及对矩阵变量的求导方法;PCA: 将样本进行归一化(如z-score normalization之后,相当于平移到原点,不同维度按标准差缩放到差不多可比较的量纲)然后根据属性的协方差去进行特征值特征向量的计算,并将特征值排序后前面的k个向量作为主向量进行降维;ICA:独立成分分析,主要解决从混合后的信号重建原始信号的问题。 10、神经网络,介绍了多层感知机的前向推理和基于链式规则的后向传播算法(以及基于矩阵计算的实践实现) 11、树系列的相关算法,包括决策树(ID3,ID4.5,CART)以及决策树节点分裂的度量方法(信息增益,信息增益率,基尼系数,和方差等),集成学习方法(随机森林,AdaBoost,梯度提升树及其增强版XGBoost),随机森林基于Bagging的集成学习方法,采用Bootstrap有重复的放回采样方法,而且每个决策树都会选择属性的子集进行树的生成,随机森林的测试数据可以基于袋外数据进行;Adaboost为{-1,1}的二分类,基于指数损失函数,基于样本权重训练弱分类器,每个弱学习器也有对应的权重,其权重为其错误率的相关函数,同时每个样本的权重也在学习器的效果上逐步随之更新(分类错误的样本的权重更高,相当于分配更高的注意力);梯度提升树利用泰勒一节展开每一步回归前些步骤集成结果的残差,XGBoos采用二阶泰勒展开,利用二阶导数信息进行每个树的生成,其生成采用贪心算法,以及基于树的复杂度的正则化方法。 12、HMM为概率图模型的一个特殊应用实例,之前在语音识别中用到的比较多,模型参数为隐状态的初始概率,隐状态之间的转移概率矩阵A,隐状态到显示状态的B,隐马尔可夫模型的三个问题:1,基于模型参数和观测序列求得观测序列的概率;2,基于模型参数和观测序列解码出最可能的隐序列状态;3,根据观测序列X,求解模型参数的问题,基于EM算法的迭代过程,具体会使用到前向函数和后向函数等。 References

  • 强化学习基础技术系列原理摘要总结

    最近在制作强化学习方面的分享内容,这里做一个文字的摘要总结版本,可以方便关键知识的复习和记忆检索。也希望对相关方向感兴趣的读者有所帮助,同时引文的链接中有详细的视频内容分享,欢迎从事相关方向的读者朋友们多提意见和建议。 1、MDP,马尔可夫决策过程,是基于状态(state, observation)、行为(action)、状态行为转移概率矩阵(state transition probability, 可以定义为维度为3的多维数组,如第1个维度为当前状态,第2个维度为下一个状态,第3个维度为所有行为)以及即时奖励reward,和策略pi(policy),马尔可夫决策过程描述了一个随机过程控制的场景,有actor,agent,environment等,actor和environment进行交互,agent是actor背后的大脑,负责帮助actor进行决策。当马尔可夫决策过程中状态行为转移概率矩阵和即时reward已知的时候,我们可以采用bellman方程的动态规划迭代方法去采用策略迭代或价值迭代去求解最优决策。当模型状态未知时,也可以采用免模型的算法,如蒙特卡咯和时间差分的方法去求解。 2、当马尔可夫决策过程的状态未知时,我们一般采用免模型法,如基于蒙特卡洛的基于整个回合序列的统计近似方法,以及基于更小step的时间差分方法,如Sarsa和q learning都可以基于时间差分法去迭代优化Q函数,不同点在于Sarsa为on policy的方法,也就是同策略方法,而Q learning为异策略方法。同策略(on policy)可以理解为基于当前的同一个训练的网络去学习error(如Sarsa中下一个状态也会通过智能体执行当前策略行为获取相应的Q值),而异策略(off policy)可以理解为当前训练网络(训练网络)和基于之前的网络获取的动作价值函数的状态(目标网络)结合去学习error。 3、DQN网络算法,介绍了其目标网络和训练网络的异策略训练方法以及算法代码流程描述,并基于CartPole模拟器环境用MLP网络进行了DQN算法的实现,这里有基于队列实现的一个ReplayBuffer(经验回放池,基于双端队列数据结构实现),经验回放池的数据进行采样会随机抽取数据返回,保证训练时数据之间的独立性,易于网络的训练,不会使得网络过于拟合最近的采样数据(经验回放池的早期数据在池满被移除之前也可以复用多次),早期的数据将会自动从队列中移除也满足了采样数据的时效性。在实现过程中,训练网络用于采集收据放入ReplayBuffer,目标网络顾名思义用于计算训练网络所需要回归的目标,其基于回放池中取出的reward和nextstate,并将nextstate输入给目标网络并计算出最大的action的输出,经过公式计算得出训练网络需要回归的target。具体的相关代码实现可以参考引文3 4、PolicyGradient和actor-critic算法,基于Policy network的基于期望回报的最大化,根据蒙特卡洛采样方式将完整回合轨迹的累积回报与其概率进行加权,通过采集很多个轨迹得出回报的期望,并使期望最大化来优化策略网络。原始的公式中,是对整个轨迹的回报进行的期望的计算,整个轨迹中每一个时刻的状态行为分配相同的权重会存在一些不合理的因素,关于具体的推导过程可以参考视频分享,其中要说明的是基于蒙特卡洛的REINFORCEMENT算法中的公式通过一些列的考虑进行的调整,比如对于某个状态下的行为的“好坏”将考虑其从该状态下执行行为后的期望回报作为因子(之前发生的事情与执行这个动作没有关系,和-logp_theta(s|a)去相乘去算损失,如果期望回报较大,增大概率p_theta(s|a)会获得更大的回报,这是-logp_theta(s|a)为正值而且会随着p_theta(s|a)增大变小,所以总体的loss变小,达到我们期望回报增大的目的。在策略梯度算法中,为了减小回报的方差,引入了基线的概念,可以理解对回报做了归一化处理,使得训练的结果更加稳定(有的游戏中所有步骤的即时回报都是正值),而将价值函数作为基线的策略梯度的改进算法称为actor-critic算法。actor-critic算法为一种框架算法,后续的PPO以及TRPO都用到了策略网络和价值网络进行的联合的训练,也归属于这一类算法。 5、PPO算法,策略梯度是同策略算法,其采集的数据只能利用一次,采集数据的成本过高,为了能够更高效率复用数据,PPO算法采用了异策略的方案,提供了训练网络和参考网络,并且对参考网络上采集的数据进行了多次复用,为了限制训练网络和参考网络的参数差异不要太大(能更好利用重要性采样进行数据复用),这里采用了一种软约束(加了KL散度约束两个网络的参数,同时还可以动态调整设置重要性因子阈值对KL散度约束项进行自适应的调整)。广义优势函数基于多步时序差分的思想,将不同步骤的优势函数进行加权求和。 6、TRPO算法,TRPO算法出现在PPO算法之前,和PPO算法有不少的思想是相同的(也基于重要性采样原理多次复用采集数据),为了限制新旧策略网络的参数不要差异太大,这里使用了硬约束,和软约束不同,硬约束显示要求两个策略网络参数的差异范围(亦即Trust Region一词的由来)。大体的思路是分别基于目标函数和约束函数的一阶和二阶泰勒展开,采用共轭梯度的方法去求解(共轭梯度用于求解大规模对称正定的线性方程组,这里为H(detlta_theta)=g),最终求得更新的方向delta_theta,用于更新策略参数。 以上内容内容的视频分享内容请参考引文1,相关代码实现请参考引文2。 References

  • EmbodiedAI原理和技术摘要汇总

    这篇文章对最近学习的关于具身智能相关的技术原理和实现知识做一下摘要汇总,欢迎大家提出意见和建议,具体详细的介绍请参考文末的链接参考1。 1、TR-1模型算法,基于Transformer decoder结构,对结构稍微具体一点的分解为:输入数据预处理模块:输入为ImageToken(经过基于ImageNet预训练的efficientnet-b3的feature extractor提取成9*9*512的张量,flatten为81*512的imagetoken表示)和instruction文本通过FiLM layer(Feature wise Linear Modulation)进行融合,然后经过TokenLearner进行压缩形成8*512的张量形状。然后6张图片(a short history of images)concat一起形成48个token,和positional embedding结合作为Transformer解码器的输入,输出层的多个token进行平均池化,如8个token的hidden_state取平均池化,接出11(action的个数)* action_vocab_size(256)然后计算loss。 2、TR-2模型算法,基于web的图像文本对数据集预训练的Vision Language Model将web数据和robot数据一起进行co-finetune。并且将action建模为值为数字或词汇表中最少用的256个token的文本输出,形成Vision Language Action model用于机器人的闭环控制。 3、多模态大模型ViLT算法,文本和图像分别通过linear projection浅层网络转换为text embedding和visual embedding,然后通过concat不同模态的embedding以单流模式(Single Stream,要区分不同模态的类型,类似于BERT里的segment embedding,还有两个模态开始的special token等),其预测任务为ITM和MLM,其中ITM任务为是否匹配的分类任务和WPA(文本对齐任务,采用的是OT算法去优化文本视觉对齐信息,开源代码实现中任务的loss_weight分别为1和0.1)的结合,通过可视化可以观察高亮的文本和对应的视觉patch的关联度。ViLT可以用于VQA视觉问答任务,以及文本图片(text-to-image retrival and image-to-text retrival)检索任务等。 4、openx-embodiment数据集及TR-X算法及实验,openx-embodiment收集了来自全球20多家机构的20多种机器人的60个子数据集,并将其按照RLDS格式进行了统一格式化处理(episodes[steps[step[observation, action, reward….]]]处理,文章中对收集的机器人数据的特性做了分析,并在此基础上基于9个数据集对RT-1和RT-2模型进行了扩展训练,并回答了相关的模型泛化,模型完成新出现任务,以及模型得参数量,训练迭代次数等相关模型得能力和模型设计决策时的参考量。 5、occupancy networks. 一类以预测连续三维点坐标位置的占用状态的网路,通过学习函数映射的方式预测三维点的占用值(occupancy value)。一般包括编码器和解码器,也可能包含隐空间编码器。编码器对输入的observation状态进行编码,如图像,RGBD,点云数据等,解码器接受预测点的三维坐标以及编码器的输出,输出输入点的预测occ值,如果有隐空间编码器,则解码器同时还要对隐空间进行采样作为输入参数之一给解码器。训练的样本点需要对三维空间目标进行采样,可以针对三维目标的表面mesh及采样数据均衡特性进行采样,这些样本点可以在训练之前通过数据集预处理提前生成。 关于具身智能方面的技术介绍将在后续的分享中进行不定期的更新,我们将会将前言的相关的最新的论文和开源技术向大家持续分享,这些相关内容如有理解上的出入欢迎读者联系我们进行勘误纠正。也欢迎其他方面使得我们做的更好的建议。 References

  • LLM原理和技术系列内容摘要总结

    NLP技术发展有较长时间的历史了,这篇文章主要介绍最新的基于Transformer网络架构的语言模型相关的最近几年的较新的技术,以下为相关的技术摘要和总结,如有问题和疑问或不正确的地方,欢迎一起讨论沟通并更新,同时欢迎读者提出改进的意见和建议,希望去做的更好。 1、基于文本数据的预处理,包括各种分词方法实现的分词器(Tokenizer),从简单的基于标点符号的分词,到复杂一些的基于词根词源处理以及一些数据的清理操作的高级分词,再进一步到基于WordPiece(主要在BERT中使用)和Byte Pair Encoding(主要在GPT中使用)的基于统计特性的面向大模型应用的词汇表构建方法,特备是后两者可以支持未登录词(OOV)的处理,而且是大语言模型常用的分词器,基于分词器就可以基于nn.Embedding(vocab_size, embedding_dim)层去构建词嵌入层(Module)以支持大模型的输入了,这种嵌入层和大模型的其他关键模块如Self Attention等一起参与参数的更新。 2、Attention is all you need. 介绍了Transformer在构建序列关系的双向上下文特性建模方便的优势,基于多头自注意力(Multi-head Attention Head)机制的编码器和(Masked Multi-head Attention Head和Multi-head Attention交叉注意力机制相结合)的解码器组成的自编码器应用结构或编码器解码器实现的seq2seq应用架构成为了NLP领域的最先进模型技术的关键技术创新和发明,为后续的BERT和GPT系列大模型创造了基础技术架构。 3、BERT为基于Transformer的自注意力机制的编码器架构,其基于两个训练任务进行的多任务训练,1为从句子中mask掉15%的token,然后从head中对应的位置进行预测出mask的原始的词汇;2为判单上下句子是否是自然连续的。BERT使用特殊词汇如“[CLS]”,“[SEP]”,”[MASK]”等以方便输入数据的表示。BERT的作用主要是提供预训练模型对语言上下文进行特征提取(embedding)将输出数据提供给下游的NLP任务如文本分类,问答系统等。 4、GPT模型为语言自回归任务,通过当前上下文预测下一个token,并不断将生成的token加入到当前上下文中继续预测后续的token的递推过程称为语言自回归任务。其网络模型为独立的Transformer的解码器结构,且和自编码器中的解码器不同的是,每一个Transformer block中只有一个Masked Multihead Attention的实现,GPT的模型的不同版本的参数量差别大,训练数据集大小差异也挺大。GPT-3模型支持的输入上下文token数目最大有2048个,embedding_dim也达到了12288,有96个Transformer block组成,参数量达到了千亿级别。 5、GPT-3.5(Instruct GPT)及以后版本,利用到了RLHF算法,即为基于人类反馈的强化学习算法,采用了PPO的两个policy network和价值网络去更新模型参数,其中policy netwrok的网络结构和GPT模型本身的一致,不同的token可以理解为不同的action,而价值网络的结构在head处加了一个线性层,输出价值标量值,策略网络和价值网络可以是共享Tranformer的基础结构,接出不同的head分别实现token预测和价值预测的任务。训练数据可以离线提前准备好,包括通过参考模型基于prompt生成的多个completion以及对应的基于reward model的打分等。 采用了基于优势函数的剪切的目标函数进行的PPO训练,其中在开源库TRL的实现中,reward为基于Reward Model的打分模型和基于Token Level的MDP建模中的参考模型(如SFT模型)和策略模型的每个token(时间点)的KL散度惩罚项作为综合的激励,因此在TRL的实现中,同时实现了基于KL散度的惩罚和基于策略更新幅度的裁剪相结合的两方面的约束。 以上内容已经做了相关的视频的录制,内容请参考引文2。 References

  • Stable Diffusion的几种支持特定场景应用的算法扩展

    这些天花时间梳理了一下Latent Diffusion Models相关的文献,在线文档和相关代码,已经制作了相关PPT,录制了相关内容,这里做一下总结以备后需查阅。 1、基于矩阵低秩的适配,LoRA(Low-Rank Adaption)方式是采用低秩矩阵对模型的预训练的权重进行调整,从而实现高效的模型微调。其大体的过程可以分为:(1)、将模型关键部分的参数的residual部分进行低秩分解,将其权重矩阵分解为两个较小的低秩矩阵的乘积;(2)、微调方法:只更新低秩矩阵的参数,而不是整个模型权重矩阵,大大减少训练时需要更新的参数量;(3)矩阵重构:通过低秩矩阵的乘积来恢复原始的权重矩阵,在加载的时候将重构的矩阵参数和原先预训练的模型的参数对应的部分进行相加得到最终的模型参数; 2、Dreambooth,是一种支持某个类别(如cat,dog等)特殊的subject(如Hally dog)的丰富多样性场景生成的Latent Diffusion Model的扩展,为了克服language drift等现象,提出了用类别的preservation loss和基于unique identifier的类别下subject的联合loss训练,即保证了类别的多样性和泛化能力,也支持特定subject的丰富多样的产经生成。支持全模型微调和基于LoRA的微调。 3、Textual Inversion,基于文本嵌入模型的微调,产生一个特殊的新的需要训练的风格或特性的图片的token,扩展文本嵌入模型的embedding层的输入,多加一个token,在训练时其他的参数冻结(包括DDPM,以及VAE和Text Embedding),只更新多加的token相关的embedding转换的参数,训练的过程实现了特殊的token的embedding和风格特性图片之间的关联关系的建立。 4、ControlNet,在模型的结构上有较大的扩展,在文生图的应用场景下,提供了额外的更加个性化多样化的约束控制,如基于深度图,canny算子边缘图,语义分割图,human pose等等额外的约束,而且ControlNet本身是对Stable Diffusion模型的扩展,和Stable Diffusion模型本身独立保存,加载时和StableDiffusion模型进行融合。而且针对某个特殊的额外约束,一般时需要单独的ControlNet模型,这样各种各样的ControlNet模型就有多个,ControlNet主要由零卷积和UNet中的编码层的block组成,零卷积保证了一开始的训练和原始模型的输出保持一致,保证了训练的稳定性。由于复用了Stable Diffusion模型中UNet的编码层的相关结构,而且初始化时直接将预训练好的Stable Diffusion模型对应的参数拷贝过来作为初始化,因此ControlNet的版本要和Stable Diffusion的基础模型版本要一致以实现加载后兼容。 关于这些内容的实现实验,可以参考引文3中的代码实现细节,在diffusers库的examples目录下,这些天学习的效率进步还不错,技术的素材和内容也在不断积累和进步中,希望能保持下来后面有更多的输出,也希望能和相关的同行有更多的机会交流最新的技术进展的机会。 参考文献

  • LDM算法实验实践记录-Diffusion Models系列5

    上篇文章向大家介绍了LDM算法的多个应用生成场景,这篇文章将记录LDM的实践过程中需要注意的一些细节。我们将以训练lsun数据集中lsun_churches子数据集为例进行说明。 LSUN(Large-scale Scene Understanding)数据集是一个用于图像理解和生成的广泛使用的数据集。我们基于LSUN数据集的church子数据集进行LDM相关实验,LSUN数据集采用了lmdb的格式进行的打包,在下载到本地后需先用unzip解压,然后用python的脚本程序进行导出。关于LSUN数据集的使用方式可以参考引文2。 关于LDM算法的开源实现这里加以说明几点:1、AutoEncoderKL类实现了一个扩展版本的VAE模型,增加了感知损失函数和GAN相关损失函数;2、CrossAttention等基于空间图像的Attention实现首先对四阶张量进行变形为三阶张量后和NLP中的transformer中的自注意机制的计算方式一样,其中crossattention中多了一个context的变量,如果没有传入context则自动退化为self attention的计算;3、DDPM和DDIM的采样均有实现,DDPM主要用于训练,DDIM主要是推理过程中进行采样;4、configs目录和models目录都定义了两个阶段模型的训练的配置文件,都可以作为–base这个选项的值传入,main.py是作为训练VAE和LDM两个模型的统一启动桥本文件,通过yaml文件的配置进行了训练任务的定义,main.py通过解析这个配置文件以支持不同的训练任务;5、可以通过conda创建特定的env来搭建实验环境,其中需要注意的是transformer的版本需要再补充定义一下(经验证transformer==3.0.0版本满足实验要求),可能当时开源这个代码的时候是和代码兼容的,但最新的transformer版本出现了不兼容的问题;6,在ddpm.py的1030行加上一句self.logvar = self.logvar.to(self.device),实现变量在同样的设备上,否则可能出现一个在cpu设备上一个在gpu设备上的运行时error。实验过程的一些问题记录可以参考引文3。 References

  • LDM算法原理和多个生成应用场景介绍-Diffusion Models系列4

    Latent Diffusion Model是DDPM算法的基础上做了多个方面的优化和改进,具体表现在: 1、其采用了隐空间(Latent Space)进行的扩散模型的训练和推理,在二维图像域隐空间可以将图像的分辨率降低为原来的1/4,1/8甚至更高,在更小的尺度上进行扩散模型的训练,使得模型训练和推理的速度和算力上具有很大的优势; 2、这里采用了一个高效的VAE模型(autoencoderkl)将图像的原始空间转换为隐空间,其在原始的VAE模型的基础上使用了更多的loss,包括生成对抗的loss,图像质量的感知loss,以及图像重建的mse loss和约束隐空间服从标准对角正态分布(协方差只在对角线上有值,独立正态分布)的KL loss(Kullback-Leibler divergence)。 3、条件注入的有几种可行的方式:1、将条件数据(context embedding)和噪声数据相拼接做为输入,在条件拼接中:(1)、训练时网络的输入为基于真值 x0​ 的原始图像数据对应的潜空间表示 z0​和时间t以及variance schedule信息采样后形成的zt 和条件的 context embedding c 拼接在一起的结果,即为[zt,c];(2)、推理时的输入为潜空间上的对角高斯分布zT和条件数据c以及时间信息的Positional Embedding的拼接[zt, c, PE(t)],预测的结果为z(t-1),网络的输出为z空间的error,和真实的采样error算loss,和DDPM算法本身一样。2、将条件数据(context embedding)作为跨注意力机制中的y作为条件输入并通过参数模块进行跨注意力机制的计算,这里有两种方式:(1)仅仅使用跨注意力机制,这时的模型就不再将条件嵌入和隐空间数据zt进行拼接,而仅仅作为条件输入y,zt作为跨注意机制的q;(2)将跨注意力机制和条件拼接相结合,其中条件拼接和第一方面描述的总体情况类似。3、CBN(条件的批处理归一化,将条件作为信息的调制),这里不做特别说明。 4、针对第3点描述的条件注入的方式,这里将根据几个特殊的条件约束生成的应用场景做一下详细说明。1、超分辨率图像生成,以一个低分辨率图像LR_image(low resolution image)作为条件,训练数据支持低分辨率和对应高分辨率的图像对作为一个真值元组;2、semantic,这个可以作为基于语义分割图的条件约束图像生成,和原始图像一起作为真值元组;3、layout,基于布局结构的约束生成,和上述条件类似;4,inpainting,为了满足更强的编辑功能,还可以加上对编辑区域的文字约束,以实现约束更强的图像编辑,如“文本引导的图像编辑”(text-guided image editing),要满足这个功能,在训练数据上要有支持这种条件生成图片,掩码区域和约束文字的三元组训练数据。在实现细节上可以按如下的思路:(1)将不带有mask的原始图像编码为隐空间的z0,将带有mask的图像编码为隐空间的z_mask,将原始图像编码为条件嵌入c(可以沿用隐空间编码的方式,这时等价为z0),以及时间信息嵌入。(2)原始图像的嵌入作为cross attention参与交叉注意力的信息计算,原始图像的嵌入方法可以用隐空间编码的方式,也可以利用多层丰富的卷积特征图信息。其中z_mask的生成的方式可以值得讨论,1种是在原始数据中将mask区域进行遮罩进行隐空间编码,然后在隐空间中在更小的尺寸上对缩小的mask区域再次进行遮罩操作(对应的区域设置为0)。 5、在条件生成的LDM模型中,采样过程q_sample只对隐空间z0进行,其他条件嵌入信息如文本嵌入图像嵌入,以及时间信息嵌入等只和采样的zt拼接作为输入的一部分,输出的直接结果为e_t(和隐空间一样大小的误差空间)预测的结果为z(t-1),条件信息不参与去噪,只作为输入信息的一部分指导去噪训练的过程。

  • DDIM算法原理简介-Diffusion Models系列3

    这篇文章将向大家简要介绍DDIM算法相关原理。前两篇已经简要的向大家介绍了DDPM算法的基本原理,在DDPM算法中,前向的扩散过程和逆向的去噪过程是“对称”的,而且一般迭代次数都比较高,比如从纯高斯噪声到清晰图片需要成千次的迭代。每一次迭代一般称为一次采样(sample,根据概率分布的特性,通过随概率函数的特性生成随机数),每一次采样都要运行一次去噪网络模型,这样对整个推理的性能有很大的影响(GAN方法生成图像只需要运行 一次网络模型就可以输出最终的结果)。 针对上面DDPM的逆向生成过程的效率和性能问题,DDIM算法在逆向采样方面进行了重新的建模,支持在不需要重新训练DDPM已经训练好的模型的基础上,通过新的采样方式,减少采样步骤,同样能够达到生成高质量图片的效果。通过拟合条件概率分布,得出的结果为: 对上述概率建模推导计算的具体过程在参考引文1中有较为清晰的说明。基于上述公式的采样策略为: 上式中,s为当前的需要采样的step,而k时上次采样的step,其不需要满足近邻关系,只需要满足s<k即可。由于k时刻的已知,加上需要满足前向时的重参化的公式: 即通过转换,可以通过公式的变换,基于已经训练的网络的推理的error输出epsilon和xt,得出x0。 上面的式子中将sigma设为0,也可以设为其他的值,具体可以参看引文1中的说明,下面的代码就是对上述最后两个公式的实现,具体可以参考引文2。 References