纯图像识别流程

本章主要介绍纯图像识别流程的算法图搭建思路。

流程概述

纯图像识别的流程主要有以下几个步骤:

  1. 输入数据。

  2. 对输入数据进行预处理。

  3. 使用目标检测或实例分割对图像进行感知,也可以用形状模版进行匹配。

  4. 进行结果后处理,基于感知结果,结合点云,进行过滤和位姿估计,生成最终的抓取目标。

流程详解

预处理流程

预处理的目的是优化输入的数据,使得后续操作更加快速,精确。

在纯图像识别流程中,较为常见的是ROI的选取,这里有两种可能的选取设计:

  • 使用配置3维ROI节点进行手动选取,或通过Epic Pro输入节点输入3维ROI,然后使用点云ROI节点或点云ROI(保持有序)节点对点云做ROI,用得到的点云输入到点云生成2D ROI节点,得到2维ROI。

  • 直接进行二维的ROI选取,通过“配置2维ROI”算子进行实现。

由于需要检测结果去对应点云进行点云提取,最后得到的检测结果需要是基于相机得到的图像的,则需要在图像ROI节点中打开保持形状这个参数开关,或者关掉这个开关后,将检测结果通过ROI后检测结果对齐节点来让检测结果跟点云位置对应。

image only process roi 1
image only process roi 2

针对此类场景,由于需要点云和图像形状对齐,若要对点云和图像进行ROI,则需要选择保持形状的ROI,或者在点云ROI节点参数中打开保持有序和保持原大小的开关,如下图:

image only process roi 3

若输入为本地读取的点云和图像,当其形状不对齐时,可使用点云对齐图像形状来进行处理。

若使用的模型不是针对当前数据训练的,识别效果不好的话,可以通过图像特征的一些操作进行处理,如下图中的一些算子:

image only process roi 4

目标检测模型,实例分割模型,形状模版匹配的选择

可选方法节点如下,下图中前面的六个节点对应的模型可在训练服务中下载。

image only process yolo

目前ATOM具有 YOLO检测以及分割的模型,这两个模型都能够进行目标检测,选取标准为:

  • 当处理的物体是比较规则的长方体或者正方体时,可以使用YOLO检测。

  • 当处理的物体的投影是比较规则的矩形时,使用YOLO检测。

  • 对于比较复杂形状或者非刚体的物体,则需要使用实例分割模型。

  • 针对目标特征明显,受光照影响小,且不出现形变的情况,可使用2d形状模版匹配,针对此场景,预处理中的图像特征处理往往可以更好地提取特征,提高匹配效果。

后处理流程

后处理的目的是,对结果进行优化,排除掉一些异常或者错误的结果,该流程可以被分为几个类别:

结果过滤

1.2.0版本去除了搬运位姿类型和相关节点,对结果的过滤主要是利用检测结果提取出点云,对点云进行过滤操作。

image only process result filter

结果生成

深度学习的结果生成主要通过检测结果生成抓取物位姿和点云对应检测结果生成抓取物位姿两个节点,此时生成的位姿PoseList包含了检测结果里面的相关信息。在这个结果之后,可以通过计算每个结果对应点云的法向或者包围框来更新每个结果的位姿。

image only process result generate 1
image only process result generate 2

参数调优

ROI选取的参数调优

对“配置3维ROI”和“配置2维ROI”算子进行可视化编辑。

1.2.0版本增加了“点云生成2D ROI”和“深度图生成ROI”算子。通过3D ROI后的点云来获取对应的2D ROI,跟3D ROI进行对应,避免3D ROI的高度影响2D ROI。

image only process roi set

模型参数调优

以下深度学习相关节点的模型基本都可以通过训练服务获取。

以下节点的返回值均为DetectInstance的结构,是包含dict的列表:

  • "score":检测结果置信度。

  • "class_name":检测结果类别。

  • "polygon":检测结果Mask。

  • "angle":检测结果的角度,只有带旋转的箱子检测2D形状匹配节点有这个结果,一般为0。

袋子分割

  • GPU运行时间约340ms,CPU运行时间约2200ms(测试环境为1650显卡,8核32G)。

  • 置信阈值:取值范围为[0,1],当结果数量较少时,可以将该值下调。

Caffe2袋子分割

  • 模型可用pth模型在训练服务测试与导出页面中转换得到,或在查看模型页面已有导出模型中下载,得到的是.zip的压缩包,里面包含的是其中导出时选择了GPU则导出的是GPU模型,会以_cuda.zip结尾去命名压缩包,若导出时未选择GPU则导出的是CPU模型,会以_cpu.zip去命名压缩包。在节点中用的是哪个模型,就会对应去使用CPU或GPU运行。

  • GPU运行时间约240ms,CPU运行时间约1000ms(测试环境为1650显卡,8核32G)。

  • 模型文件:模型文件,存储的模型中各个层训练好的数据,从训练服务中下载的zip包进行解压后的model.pb文件。

  • 模型参数文件:模型参数文件,存储的是模型的结构,从训练服务中下载的zip包进行解压后的model_init.pb文件。

  • 置信阈值:取值范围为[0,1],当结果数量较少时,可以将该值下调。

箱子检测

  • GPU运行时间约80ms,CPU运行时间约5500ms(测试环境为1650显卡,8核32G)。

  • 置信阈值:取值范围为[0,1],当结果数量较少时,可以将该值下调。

  • 是否旋转:当物体会出现不定的旋转角度时打开,注意对应模型的选择。

旧版标注模型:这一参数只在旋转检测的时候生效,是为了将之前旋转检测标注规则训练的模型与现有旋转矩形标注规则区分开,用于结果绘制,若设置错误可能会导致模型识别对了,但结果显示错误。

箱子检测Onnx

  • 模型可用pth模型在训练服务测试与导出页面中转换得到,或在查看模型页面已有导出模型中下载。

  • GPU运行时间约70ms,CPU运行时间约3800ms(测试环境为1650显卡,8核32G)。

  • 置信阈值:取值范围为[0,1],当结果数量较少时,可以将该值下调。

  • 是否旋转:当物体会出现不定的旋转角度时打开,注意对应模型的选择。

旧版标注模型:这一参数只在旋转检测的时候生效,是为了将之前旋转检测标注规则训练的模型与现有旋转矩形标注规则区分开,用于结果绘制,若设置错误可能会导致模型识别对了,但结果显示错误。

YOLO分割

  • GPU运行时间约160ms,CPU运行时间约1000ms(测试环境为1650显卡,8核32G)

  • 置信阈值:取值范围为[0,1],当结果数量较少时,可以将该值下调

YOLO检测

  • GPU运行时间约70ms-180ms,CPU运行时间约150ms~600ms(测试环境为1650显卡,8核32G),这个与训练时的预训练模型有差别。

  • 置信阈值:取值范围为[0,1],当结果数量较少时,可以将该值下调。

形状模版匹配

  • 强制训练:若强制训练,则每次初始化都会训练一次模板,否则若已存在模板则不会训练模板图。

  • 模板图片:根据待匹配场景,可用生成模板图片节点输入相机内参和目标高度范围来生成一个图片下载后上传到此处,同时,该节点输出的缩放范围可以作为缩放范围参数。

  • 模板生成路径:可默认也可以指定,若指定则会在指定路径下生成两个.yaml文件,默认则是在当前ATOM图路径下生成该文件。

  • 模板名字:可用默认值,也可指定,指定是为了多模板情况进行设置。

  • 是否缩放:缩放是对图像和模板进行缩放,以减少训练时间,但可能会造成精度不够的情况。

  • 缩放比例:取值范围为[0,正无穷],为缩放定值,会对输入图像进行固定比例的缩放。

  • 缩放范围:是一个数组,长度为2,表示一个缩放区间,比如 [0.8,1.2]。

  • 缩放步长:取值范围为[0,区间长度],在缩放范围内逐步进行搜索,越小越精细,同时也更加耗时。

  • 旋转角度范围:是一个数组,长度为2,表示一个旋转范围区间,比如 [0,360],单位是度。

  • 旋转角度步长:取值范围是 [0,区间长度],在角度区间内逐步进行搜索,越小越精细,同时更加耗时。

  • 特征点数量:是一个整数,取值范围是 [1,正无穷],数量越多匹配越精确,但也更加耗时。

  • 图像金字塔层级:是一个数组,每一个元素表示图像金字塔的比例,为2的幂次,越小匹配像素精度越高,也越费时。

  • 得分阈值:得到的结果分数阈值,越大则留下的结果越多。

  • NMS阈值:会根据此值过滤掉重叠过大的结果。

  • 类别名:根据场景设定类别名称,用于后续过滤操作。

结果生成参数调优

生成抓取点(参数生成)

  • 原理:通过设置X、Y、Z轴的平移和沿X、Y、Z轴对称离散的数量来得到一系列对称的抓取点。

  • 参数:

    • 叠加X轴平移:抓取点的x值偏移对应值(+或-)。

    • 叠加Y轴平移:抓取点的y值偏移对应值(+或-)。

    • 叠加Z轴平移:抓取点的z值偏移对应值(+或-)。

    • 沿X轴对称(角度离散数目):若设为a,则会将360度等分为a份,得到一个角度360/a,将抓取点绕X轴旋转,每360/a度生成一个抓取点。

    • 沿Y轴对称(角度离散数目):若设为b,则会将360度等分为a份,得到一个角度360/a,将抓取点绕Ys轴旋转,每360/a度生成一个抓取点。

    • 沿Z轴对称(角度离散数目):若设为c,则会将360度等分为a份,得到一个角度360/a,将抓取点绕Z轴旋转,每360/a度生成一个抓取点。

若对称的参数不全为0,则先旋转,再按照抓取点的坐标轴平移对应的值,最后生成的抓取点个数为a+b+c个。

如下左图结果对应的参数为右图中,Y轴平移-90,沿X轴对称离散10个:

image13

image14

在本流程中,大部分只需要设置沿X轴或Y轴对称离散2个抓取点,然后根据实际抓取设置Z轴平移即可。

抓取点排序

  • 原理:

    通过添加不同的排序策略对生成的抓取点进行排序。

  • 参数:

    • 抓取点个数:针对每一个结果,保留几个抓取点,可保留多个,然后到Epic Pro中进行碰撞检测和路径规划。

    • 抓取点生成策略:参考抓取点生成策略

抓取点生成策略

多种策略通用参数

  • 排序顺序:可设置为"HIGHEST"或"LOWEST"。指定对计算得到的距离的排序顺序,设置为"HIGHEST"为距离较大的抓取位姿排序靠前,设置为"LOWEST"相反。

  • 差异阈值:指定该项排序生效的阈值。

  • 分组阈值:排序分组间隔。

按抓取点XYZ坐标值排序

按照抓取点在Target Frame下的某个坐标轴的分量大小进行排序,常可用于按Z轴高度进行排序。

  • 参考系坐标轴(String):被抓取物坐标轴,指定物体坐标系的某一轴,可设置为"X_AXIS","Y_AXIS"和"Z_AXIS"。

  • 排序顺序(String):[HEIGHTST,LOWEST]

  • 差异阈值(Float):如果计算得到两个抓取位姿间沿指定axis_of_target_frame距离小于该阈值,则认为两抓取点在此排序规则下优先级相同。

  • 分组阈值(Float):排序分组间隔。

按抓取点与目标轴夹角排序

按照抓取点的某个坐标轴(X or Y or Z)在Target Frame下的指定轴的夹角大小进行排序。

  • 抓取点坐标轴(String):指定抓取点坐标系的某一轴,可设置为"X_AXIS","Y_AXIS"和"Z_AXIS"。

  • 目标轴(List):指定空间中某一向量作为目标轴计算旋转角度,常设为[0,0,-1]。

  • 排序顺序(String):[HEIGHTST,LOWEST]

  • 角度阈值(Float):夹角阈值,抓取点计算得到夹角大于(小于)该阈值时,不使用该抓取点。

按抓取点与指向抓取点射线夹角排序

按照抓取点的某个坐标轴(X or Y or Z)与 指向抓取点的射线(由Target Frame下一个给定的viewPoint确定)的夹角大小进行排序,即抓取位姿某一轴与抓取点和所设置参考点之间连线的夹角排序。

  • 抓取点坐标轴(String):指定抓取点坐标系的某一轴,可设置为"X_AXIS","Y_AXIS"和"Z_AXIS"。

  • 参考点(List):一般设置为料筐上方机械臂末端起始规划点。

  • 排序顺序(String):[HEIGHTST,LOWEST]

  • 角度阈值(Float):夹角阈值,抓取点计算得到夹角大于(小于)该阈值时,不使用该抓取点。

按抓取点与参考点间距排序

按照抓取点与Target Frame下给定点的距离进行排序。

  • 指定参考点位置(List):该参考点为抓取点坐标系下x,y,z值。

  • 排序顺序(String):[HEIGHTST,LOWEST]

  • 差异阈值(Float):抓取点计算得到距离大于(小于)该阈值时,不使用该抓取点。

  • 角度阈值(Float):夹角阈值,抓取点计算得到夹角大于(小于)该阈值时,不使用该抓取点。

按抓取点得分排序

按抓取点得分进行排序。

  • 得分阈值(Float):得分大于(小于)该阈值时,不使用该抓取点。

按抓取点优先级排序

按照priority进行排序,priority数值越小,优先级越高,顺序越靠前,抓取点priority可从Epic Pro进行设置。

image15
  • 优先级差异阈值(Float):优先级差异大于(小于)该阈值时,不使用该抓取点。

按抓取点与料筐壁位姿距离排序

按照抓取与料筐壁之间的距离关系进行排序,该策略仅适用于料筐无序抓取,根据抓取点到料筐边缘的距离排序。

  • 料筐中心点位置(List):矩形料筐的位姿矩阵,原点位于料筐的几何中心,位姿矩阵的x轴和y轴与料筐的两边平行。

  • X方向比较阈值(Float):料筐模型X方向一半长度。

  • Y方向比较阈值(Float):料筐模型Y方向一半长度。

按抓取点与料筐壁位姿夹角排序

按照抓手到达抓取点时正方向与料筐壁法向量之间的关系进行排序,当料筐为矩形时,建议使用该策略,根据抓取位姿某一轴与最近的料筐壁法向量夹角排序。

  • 抓取点坐标轴(String):抓取点坐标轴,指定抓取点坐标系的某一轴,可设置为"X_AXIS","Y_AXIS"和"Z_AXIS"。

  • 料筐中心点位置(List):料筐中心点在抓取点所在坐标系下位姿,抓取点所在坐标系一般为机器人基坐标系。

  • 料筐X方向一半长度(Float):料筐模型X方向一半长度。

  • 料筐Y方向一半长度(Float):料筐模型Y方向一半长度。

  • X方向比较阈值(Float):料筐模型X方向阈值,在该阈值内的抓取点优先级相同,不进行比较。

  • Y方向比较阈值(Float):料筐模型Y方向阈值,在该阈值内的抓取点优先级相同,不进行比较。

按机器人转动大小排序

按照抓取点位姿与规划开始点位姿之间的差异进行排序(位置差异,姿态差异),该策略仅适用于料筐无序抓取,首先根据料筐尺寸(boundary_in_x_dir,boundary_in_y_dir)过滤料筐边缘的抓取点,优先抓取料筐中心的抓取点,然后工具末端初始位姿与抓取点位姿的姿态差异(角度)进行排序。

  • 工具初始位置(List):工具末端初始位姿,一般为规划的初始位姿。

绘制抓取点

  • 主要是用于调试阶段查看实际抓取点结果,输入为场景点云和抓取点位姿。

  • 针对本流程可通过绘制抓取点节点在使用搬运位姿估计节点后查看抓取的法向朝向是否计算准确,也可以在生成搬运位姿节点参数使用检测结果角度设置为false时,查看抓取点的X轴或Y轴与目标长边是否平行。