基于改进PointNet++的大规模猪体点云部位分割*

2023-08-31 08:39张素敏温志坤朱纪民林润恒
计算机与数字工程 2023年5期
关键词:八叉树猪体立方体

胡 昊 尹 令,2 张素敏,2 温志坤 朱纪民 林润恒

(1.华南农业大学数学与信息学院 广州 510642)

(2.国家生猪种业工程技术研究中心 广州 510642)

1 引言

点云分割作为三维点云处理任务中的关键技术,在三维计算机视觉场景下得到了非常广泛的应用。在通过激光雷达获取的城市场景点云中,将马路、建筑、路灯、花坛、行道树等场景中的元素进行区分,实现了对大规模场景中的各种物体进行精细化处理[1~2]。在医疗数据处理领域,使用基于深度学习的点云模型分割三维颈椎骨的各组成部分[3],在分割的基础上再进行生物力学分析,提高了医疗辅助诊断的自动化水平。在建筑建模领域,采用多视图CNN 能够将建筑元素类型进行自动化分类,并取得了良好的效果[4]。在无人机精准飞行领域,基于深度学习的点云网络对激光雷达扫描到的物体进行了精准分割,且具有良好的实时性[5]。在智慧农业领域,采用深度相机对植物点云进行采集,再将采集到的数据送入神经网络将植物的叶和茎进行分割,有助于选择育种以及性状分析[6]。一种基于二维图像以及深度信息的点云二次分割方法被提出用于在复杂背景中提取出水果的轮廓[7]。

基于三维点云的牲畜尺参数自动测量是目前智能养殖业的研究热点。但在现实场景中,通过深度设备获取的牲畜点云存在数据散乱、密度大的特点,因此数据处理的效果不佳。采用深度学习的方法先对猪体点云各部分进行分割,在分割的基础上再进行体尺测量点定位,将有助于提升测量的准确率。

基于深度学习的点云分割方法是计算机三维视觉的研究热点之一,按照其基本思想可分为以下三类[26~28]。第一类是将三维点云数据转化为二维图像的处理方法[8~11],其主要通过在不同角度将原始点云投影到二维平面,从而得到多个二维图像,再通过神经网络对多视图进行聚合,最后输出结果。第二类是基于体素网格的方法[12~14],该类方法将原始点云转化为了体素小立方体,再通过3D 卷积神经网络进行分割。前两种方法均需要消耗大量时间和资源进行数据预处理,而第三类方法是直接对原始点云进行处理。PointNet[15]首次采取了端到端的处理模式,主要解决了点云通过深度网络进行编码过程中,保证其原有的置换不变性,能够直接将原始点云作为深度网络的输入进行分割。然而,PointNet 不具备在度量空间点中捕捉布局信息的能力,极大地限制了对细节的识别能力以及对大规模复杂场景的普适性。为改进PointNet 的不足,PointNet++网络[16]增加了逐层抽象结构,通过计算度量空间中的距离,增加上下文比例来提取目标点云的局部空间特征,取得了更好的效果。马利等[17]通过在PointNet 中引入跳跃连接,提取不同层次的特征,更好地捕捉了三维手部姿态。姚钺等[18]在PointNet++的基础上加入了自顶向下的网络分支,将原网络的中间特征融入最终预测网络,获得了更好的分类效果。为了增强获取局部特征的能力,吴军等[19]将自注意力机制引入了PointNet++,提高了场景语义分割的精度。

活体牲畜获取的点云数量庞大,且局部会存在空洞或者缺失,不同姿态使得牲畜点云各部分分割特征不明显,因此为对猪体点云进行部分精确的分割,本文在PointNet++的基础上采用了Octree 结构改进了采样层和分组层,使其能够更好地在大规模点云数据中捕捉到猪体由于不用姿态所引起的非刚性变化,充分提取不同层次下的局部信息,获得了更好的部分分割效果。

2 方法

2.1 猪体点云获取与预处理

在试验场地采集通道的上、左、右三个方向分别设置Kinect相机,当目标猪体进入数据采集区域时,三个方向的相机会同时采集点云,再经过配准,去除背景以及去噪等预处理后,即可获得完整的猪体三维点云数据[20~21]。所获得的猪体点云因个体不同,在进入采集区域的姿态不同,因此数据之间存在较大差异。

2.2 PointNet++基本原理

PointNet++采用了逐层抽象结构,如图1 所示。相比于PointNet 结构,PointNet++具备了在不同尺度下提取空间信息的能力,代替了PointNet 直接提取整体点云特征的做法,能够在不同尺度局部区域使用PointNet 对点云进行特征提取,再进行特征拼接。PointNet++分割网络结构包括分层点集特征学习和集合分割点特征传播两个部分。分层点集特征学习分为两个集合抽象(Set Abstraction)模块,每个集合抽象模块又包含采样层(Sampling Layer)、分组层(Grouping Layer)、PointNet层[22]。其中,采样层使用最远点采样(Farthest Point Sampling,FPS)选取点云数据的部分特征点。分组层的作用是按照球查询(Ball Query)方法选取采样中心点的邻域点,将选出的各个子点云送入PointNet层,运用局部区域的信息编码成特征向量。

图1 PointNet++网络结构

2.3 基于改进PointNet++猪体点云分割网络

2.3.1 基于八叉树的点云划分与采样

PointNet++通过最远点采样的方法提取局部特征点进行编码,在ShapeNetCore[23]数据集上取得了很好的部分分割效果。然而,虽然与随机采样相比,在给定相同数量的采样点情况下,最远点采样方法能更好地提取ShapeNetCore 数据集中的特征点,但是对于在真实场景下通过Kinect相机所采集到的猪体点云数据,最远点采样无法精确捕捉不同姿态下猪体点云的非刚性形变,因为最远点采样更关注的是点与点之间的距离,而八叉树下采样法是基于空间结构的均匀采样,能够很好地保留猪体点云空间结构信息,其本身层次化的树结构不仅能划分出体素相邻点,且更适合后续PointNet 层进行逐层的局部特征提取。

采用八叉树进行猪体点云分组及采样算法步骤如下:

步骤1)采用最小立方体对猪体点云包围。

步骤2)设置最大八叉树深度即最多可细分的次数N,将初始点云包围盒的立方体划分为8个均匀大小的子立方体。

步骤3)判断没有子节点的立方体内是否包含点云。若包含点云且没有达到最大递归深度,继续对该立方体进行细分,划分到8 个子立方体。若没有或达到最大递归深度则停止细分。

步骤4)若子立方体所分配到的单位元元素数量为0或为1,则该子立方体停止划分。

步骤5)重复步骤3)和步骤4)进行递归划分直到达到最大递归深度,使用不同层数八叉树划分猪体点云过程如图2所示。

图2 不同层数八叉树结构划分猪体点云

步骤6)假设任意立方体内包含n个点,那么此立方体内第i个点的坐标则为(xi,yi,zi),计算中点pmid坐标(xmid,ymid,zmid)。

步骤7)计算体素内所有点到中点pmid的距离并进行排序,将距离中点pmid最近点作为特征点pfeature进行采样,选取第2 到k+1 个距离较小值点作为特征点pfeature的邻近点:

式(1)中Sort为排序函数,d为距离函数。如图3 所示,红色点为采样特征点,与红色点在同一立方体内的黑色点为其邻域点。

图3 采用八叉树进行猪体点云采样及分组

2.3.2 改进PointNet++的分割网络算法

采用八叉树改进PointNet++采样和分组方式的猪体点云部位分割网络具体结构如图4 所示,算法步骤如下:

图4 改进后的PointNet++具体网络结构

步骤1)输入为经过预处理后的单个完整猪体点云数据[ ]N×npoint×6 ,其中N为批处理输入猪体点云数据的数量,npoint为单个猪体点云的点云点数。

步骤2) 将猪体点云进行八叉树采样及分组。其中,采用5 层八叉树结构进行采样及分组,采样中心点的个数为n1,中心点邻域内的点的最大数量(nsample)为64。

步骤3)对同一分组内的局部点云进行卷积(Convolution,Conv),其中一维卷积公式如下:

式(2)中w1,w2…wk为滤波器,x1,x2…xk为信号序列,K为滤波器长度。为简单起见,这里假设卷积的输出yt的下标t从K开始。二维卷积的公式如下:

式(3)中X∈RM×N,滤波器W∈RU×V,一般U≪M,V≪N,这里假设卷积的输出Yij的下标(i,j)从(U,V)开始。

步骤4)采用批量归一化(Batch normalizaion,Bn)的方法提高网络的学习效率。假设有N个样本,对于每一维的特征x,先计算其均值和方差:

然后,将特征x(n)减去均值,再除以标准差,得到新的特征值x(n):

步骤5)采用Relu 函数对神经网络的线性层进行激活,再通过最大池化(Max Pooling)对卷积层提取到的局部特征的进行特征选择,降低特征维度,得到局部特征向量[N×1024×256] 。具体地,对于一个局部区域Rdm,n,选择该区域所有神经元的最大值表示该区域:

式(7)中xi为局部区域内每个神经元的值。

步骤6)重复步骤2)~5),这里采用4层八叉树结构进行采样及分组,采样中心点的个数为n2,中心点邻域内的点的数量为128,得到特征向量[N×256×512] 。

步骤7)采用PointNet 对整体点云进行全局特征向量编码。

步骤8)经过分层点集特征学习后,对输入的特征点进行二次抽样,利用IDW(Inverse Distance Weighted)插值算法,将采样点的特征传递回原始点集,得到[N×4096×256] 的数据。其中,IDW 插值的公式如下:

式(8)中,f为插值的特征值,d(x,xi)为x,xi的距离,p为d(x,xi)的指数,k为邻域点的个数(默认情况使用p=2,k=3),wi为x,xi距离平方的倒数,j为点云的索引编号,C为任意常数。

步骤9)再对原始点集特征向量进行卷积,批量标准化和激活函数处理,并使用反向传播(Back propagation,Bp)算法对卷积网络中参数进行调整,当l+1 为卷积层时,假设特征映射输入为Z(l+1)∈RM'×N'×P,其中第p( )1 ≤p≤P个特征映射的输入为

式(9)中W(l+1,p)和b(l+1,p)为第l+1 层的卷积核以及偏置,共有P×D个卷积核和P个偏置。第l层的第d个特征映射的误差项为

式(10)中⊗~为宽卷积,rot 180()· 表示旋转180°。

步骤10)使用Softmax回归对猪体点云每个点进行分类预测,其中类别标签y∈{ }1,2…,C,C=8分别对应着猪体的八个部位(左前腿、右前腿、左后腿、右后腿、耳朵、头部、尾巴、身体)。给定一个点x,采用Softmax回归预测的属于c的条件概率为

式(11)中wc是第c类的权重向量,则Softmax决策函数可以表示为

3 实验结果与分析

本文训练模型系统环境为Intel i5-11400 CPU,RTX2060 GPU,6GB 显存,深度学习框架Pytorch1.4,Cuda10.0。设置模型初始学习率(Learning Rate)为0.001,衰减率(Learning Rate Decay)为0.5,每20轮迭代轮数衰减一次,模型训练每次输入点云数量批尺寸(Batch Size)为4。图5对比了采用八叉树改进后的PointNet++网络与PointNet++基础网络训练过程的mIoU 与OA 变化。由图5 所示,改进后的PointNet++获得了更好的学习能力,在经过40 轮左右的训练后,几乎已经收敛,在100 轮的训练中最佳的mIoU 为88.27%,OA 为96.97%。而原PointNet++网络在60 轮训练后才逐渐收敛,在100轮的训练中最佳mIoU 为85.12%,OA 为94.45%。实验结果证明,改进后的PointNet++网络在猪体点云数据集上具有更强的学习能力。

图5 训练过程性能指标变化

采集的活体猪点云其姿态呈现多样性,从不同视角观察可以分为不同姿态,俯视图的猪体点云姿态可大致分为直线型、左扭头型、右扭头型,侧视图的猪体点云姿态可大致分为平视型、微低头型、重低头型,共9 种姿态。为了进一步验证本文采用八叉树结构对PointNet++网络改进的有效性,以9 种姿态的猪体点云为测试样本,在PointNet++基础上采用平面拟合的方法计算法向量(+Normal),在第一个逐层抽象模块使用Octree 的采样与分组方式(+Octree1),在第二个逐层抽象模块使用Octree 的采样与分组方式(+Octree2)进行不同模块组合下的消融实验,如表1 所示。表2 为在不同模块组合下的分割结果。由表2 可知,相比于基础模型PointNet++的分割结果,采用平面拟合的方法计算法向量信息(+Normal)后,除去Post8 外其他类别的mIoU 均有提升,法向量作为点云各点的属性包含了重要的空间信息。在第一个逐层抽象模块改用八叉树结构进行采样与分组(+Octree1)之后,对所有类别的分割精确度均有提高,尤其对于Post6,Post9 等扭头且低头的不规则姿态猪体点云的分割效果提升更为明显。第二个逐层抽象模块改用八叉树结构进行采样与分组(+Octree2)的方式,从各个姿态的分割结果上来看,相比于PointNet++基础结构虽有提高,但是提升效果不如前者(+Octree1),原因是第一次采样在原始猪体点云上进行的,基于八叉树的采样方式比最远点采样能保留更多猪体点云的空间结构信息,而第二次采样是在第一次采样的基础上再进行采样,是第一次采样更细节化,因此第一次采样更关键。两个逐层抽象模块均使用Octree 的采样与分组方式并使用法向量(Octree-PointNet++)的模型,在除了Post4 的其他姿态的猪体点云分割结果上均取得了最佳,总体的平均mIoU 和OA 相较于原PointNet++模型分别提升了3.04%、4.54%。

表1 用于消融实验的不同模块说明

表2 不同姿态的猪体点云数据的消融实验结果(单位:%)

注:粗体表示最优结果,Post1为直线平视型、Post2为直线微低头型、Post3为直线重低头型、Post4为左扭头平视型、Post5为左扭头微低头型、Post6为左扭头重低头型、Post7为右扭头平视型、Post8为右扭头微低头型、Post9为右扭头重低头型。

图6 所示为部分姿态猪体点云的可视化结果,图中每列表示一类姿态,每行表示对应结果。从第1、2 列相对简单的姿态来看,原始的PointNet++模型会把部分头部的点云分成是耳朵,还会把部分身体的点云分成是尾巴。+Normal 分割效果虽有提升,但是对于头部和耳朵的分割仍然不理想。+Octree1 和+Octree2 对于局部细节的捕捉能力明显更强,基本可以将耳朵与头部分割开来。第3、4 列为较复杂的扭头且重低头的姿态,PointNet++网络对于此类姿态的分割结果较为糟糕,由于猪在低头时腿部离头部很近,还会出现左右脚交叉的现象,因此会把部分头部点云看成是腿部,左腿分为了右腿。+Normal 的分割结果虽有所改善,但仍然不理想,会把头部分为了后腿。+Octree1 和+Octee2 分割的效果要明显由于前二者,但是对于一些细节的分割仍然存在不足。可以看出Octree-PointNet++无论是对于复杂姿态还是相对标准的姿态,其分割效果都理想,除去分割边界不如人工数据处理得平滑之外,基本与手工标记无异。

图6 部分姿态猪体点云部分分割可视化效果对比

不同的点云分割算法在我们采集的数据集上的分割效果如表3 所示。PointNet++根据其点云采样及分组方式的不同分为单一范围分组(ssg,single-scale grouping),即通过深度网络提取在相同半径下的点云局部空间特征,以及多尺度范围分组(msg,Multi-scale grouping),即在不同分组半径下提取点云局部信息,再编码成特征向量。从结果上看,msg版本的平均分割精确率要略优于ssg。相比于PointNet 直接对原始点云整体提取特征的方法,PointNet++的层次化特征提取模式具备了更好的分割效果。3D Point in 2D Space[24]是将三维点云降维为二维数据,再通过U-Net 网络进行分割,DG-CNN[25]则是先对原始输入点云构建图结构,增强了点之间的关联性,再送入Edge-Conv 进行处理。然而,在实际的猪体点云分割实验中,两者的分割效果均不如PointNet++网络算法。原因可能是其对不同姿态猪体点云变化不敏感,缺乏对非刚性形变目标物体的特征学习能力。

表3 各算法在我们数据集上的性能对比

4 结语

针对现有的PointNet++网络不能很好地提取不同姿态猪体点云数据的局部特征问题,采用八叉树结构改进了其采样及分组方式,实验结果表明,改进后的网络更加适合于大规模点云数据中提取猪体不同姿态的非刚性变化特征,能够更加精确地对不同姿态的猪体点云数据进行部位分割,尤其是对于复杂姿态的猪体点云数据,分割精确度的提升更为明显,且可视化效果与人工标记几乎无异。

猜你喜欢
八叉树猪体立方体
叠出一个立方体
三维十字链表八叉树的高效检索实现
夏季养猪要做好防暑降温
基于单视角点云镜像的猪只体尺测量方法
学会8招夏季养猪增膘等4则
图形前线
立方体星交会对接和空间飞行演示
折纸
夏季养猪增膘九招
散乱点云线性八叉树结构在GPU中的实现