基于A-Unet 的牛体尺测量方法研究
2023-08-31张显宇杨晶安
石 炜,张显宇,杨晶安,赵 岩
(内蒙古科技大学机械工程学院,内蒙古 包头 014010)
牛体尺数据对于养殖户监测牛的生长及健康状态有着重要意义[1]。此外,在肉品质评价、选种以及科学育种等方面,牛体尺数据也是重要参数之一[2]。牧场通常以人工使用皮尺直接测量的方式确定牛体尺数据。但是,这种传统的方法存在着测量结果不准确、工作量大、容易引起牛的应激反应等诸多问题,因此,亟须研究人员开发出更为精准、高效、安全的牛体尺测量方法。
随着智慧农牧业技术的发展与应用,在畜牧业现代化大背景下[3],应用机器视觉技术提升牛体尺测量的精准性和效率,成为众多学者研究的热点方向。在国内,石炜等[4]使用基于边缘的图像分割技术获取牛体尺参数。然而,当牛只的毛色与周围环境色彩相似时,该方法无法有效地将目标牛体区分出来。朱林等[5]采用OpenCV 机器视觉库获取牛体尺参数,虽有一定效果,但稳定性不够,在复杂场景下应用受到限制。赵建敏等[6]使用Mask R-CNN 双阶段目标检测算法提取牛体轮廓曲线,虽然这种双阶段算法能够实现较高的精度,但需要更多的计算资源和时间来完成2 个阶段的计算。此外,由于需要进行2 个阶段的计算,双阶段算法可能会受到第一阶段区域生成的误差影响,从而导致检测结果不准确。
在牧场采集牛体图像时,常常会受到背景噪声的干扰,导致难以获得符合测量标准的完美图像。为了更加精确地获取牛的身体轮廓和体尺数据,笔者提出了一种基于U-Net[7]的单阶段网络模型,用于建立自动测量牛体高、体长和体斜长的方法。经典U-Net 是一种基于全卷积网络分割模型的算法,由编码阶段、解码阶段以及预测网络三部分构成。它能够利用较少的图像进行端到端的训练,实现牛体轮廓曲线的快速分割。然而,由于牧场采集的牛体图像中存在较多干扰因素,U-Net算法对图像中牛体轮廓的分割能力尚且不足。为了解决这些问题,笔者在U-Net 的基础上,提出一种A-Unet(Attention-Unet)算法,在U-Net 基础上引入了CBAM 注意力机制 (Convolutional Block Attention Module,CBAM)[8]来增强U-Net 算法对牛体轮廓曲线分割精度。利用A-Unet 算法提取牛体轮廓后,使用动态网格法提取牛体尺测量点,并通过摄像头标定参数计算牛体尺数据,这为牧户在养殖过程中有效监测牛的健康生长状态提供了解决方案。
1 材料与方法
1.1 数据采集
该研究以内蒙古自治区锡林郭勒盟苏尼特左旗某牧场的牛群为研究对象,选取21 头年龄在1~3 周岁的牛,采集站姿图片,并进行人工体尺测量。将选取的牛只编号为1~21,用于后续试验的准备工作。
1.2 体尺测量系统设计方案
体尺测量系统试验平台由摄像头和服务器构成,其主要用途是采集牧场牛体的图像。该测量系统的算法包括图像分割算法和体尺测量算法,通过图像分割算法提取出牛体轮廓曲线后,再利用体尺测量算法测量出牛体的体尺数据。体尺测量系统的流程和原理如图1 所示。
图1 牛体尺测量系统流程
具体流程如下:
①通过在牧场使用摄像头采集牛的站姿图像,并结合超高频射频识别技术识别牛的RFID 耳标[9],实现每张图像牛只编号的标注。
②将采集的图像送入A-Unet 算法,用于牛体轮廓的分割,并生成带有牛体掩模信息的图像。
③利用边界寻找函数findContours,从带有掩模信息的图像中提取牛体的轮廓曲线[10],针对提取出的牛体轮廓曲线,运用动态网格法提取轮廓曲线上的体尺测点,并根据这些测点计算当前牛的体尺数据[4]。
牛体尺测量点位置详见图2。其中,A 点为鬐甲点,B 点为牛尻点,C 点为肩胛前端点,D 点为A点的垂点。体长为A、B 两点的水平距离,体高为A、D 之间的垂直距离,体斜长为B、C 两点的直线距离。
图2 牛体尺测量点示意图
1.3 A-Unet 算法
1.3.1 A-Unet 算法整体结构
经典的U-Net 是一种深度神经网络架构,常用于图像语义分割任务。该网络采用编码器-解码器结构,能够从原始图像中提取出高层次的特征并进行像素级别的预测。U-Net 还采用了跳跃式连接,将编码器和解码器中对应的特征图相连接,实现了多层次、多尺度的信息传递和融合,从而提高了模型的准确性和泛化能力。该研究提出一种将CBAM 注意力机制模块集成进U-Net 的智能牛体尺测量算法,增强U-Net 神经网络的牛体轮廓曲线分割精度,提高了牛体尺测量的准确性。
图3 展示的是改进后的网络结构,由于注意力机制模块的权值是随机初始化的,因此将其添加到加强特征提取部分中可以取得更佳的效果。CBAM 注意力机制,可以自适应地控制特征图中各个通道的权重,以提高模型的表现力和鲁棒性。具体而言,CBAM 模块由两部分组成:通道注意力和空间注意力。通道注意力模块利用全局平均池化操作对每个通道的特征图进行压缩,并通过2个全连接层学习每个通道的重要性权重,从而提高通道之间的相关性和互补性。空间注意力模块通过在不同空间维度上应用多个卷积核和池化操作,以学习每个像素的重要性权重,并提高不同空间位置的特征的互补性和区分性。因此,引入CBAM 注意力机制的A-Unet 算法可以提高网络对不同尺度、不同位置和不同特征的适应性,从而在牛体图像分割任务中取得更好的性能表现。
图3 融合CBAM 模块的A-Unet 算法模型结构
1.3.2 CBAM 注意力机制
注意力机制的核心重点在于引导网络关注更加重要的地方。在U-Net 算法模型的基础上嵌入CBAM 模块,引入注意力机制可以改变资源分配的方式,使更多的资源倾斜到目标对象上。CBAM将通道注意力机制和空间注意力机制结合,在输入的特征层上首先使用通道注意力模块进行加权,然后使用空间注意力模块进行加权,既关注通道的重要性,又关注每个像素点的重要性。在AUnet 算法的训练过程中,为图像中的牛体目标对象分配更多的权重参数,提高目标特征提取性能,同时减少背景噪声的影响。
CBAM 注意力机制首先使用通道注意力模块来计算特征图中每个通道的权重,然后将计算得到的权重乘以原始特征图,得到一个加权后的特征图。接着,空间注意力模块将对加权后的特征图进行处理,以计算每个像素点的权重,最终得到一个基于通道和空间注意力的加权特征图。
CBAM 注意力机制可以用公式(1)描述:
式中,x 是输入特征图,c1和s1分别表示通道数和空间大小,c2和s2分别表示通过通道注意力模块s2空间注意力模块处理后的特征图的通道数和空间大小。W1和b1是通道注意力模块中的权重和偏置项,W2是空间注意力模块中的权重。δ 表示ReLU 激活函数。注意力机制模块如图4 所示。
图4 注意力机制模块
①CBAM 注意力机制中的通道注意力机制,可以自适应性地调整每个通道的权重,以提高模型在不同任务中的表现。图5 是通道注意力机制的具体实现方式。
图5 通道注意力机制模块
CBAM 的通道注意力机制主要由2 个子模块?组成:通道最大值池化(MaxPool)和通道平均池化(AvgPool)。这2 个子模块共同构成了一个通道注意力模块,用于学习每个通道在不同空间位置上的重要性和相关性,并根据这些权重进行特征融合。首先,通道最大值池化模块可以学习每个通道在不同空间位置上的最大响应,即学习通道间的重要性。其次,通道平均池化模块可以学习通道间的相关性,即学习每个通道在不同空间位置上的平均响应。然后,将上述2 个模块的输出拼接起来,并使用一个全连接层和一个sigmoid 激活函数进行加权平均。
CBAM 的通道注意力机制可以用公式 (2)来描述:
最终得到的MC(F)是一个通道注意力向量,它将每个通道的权重调整为适当的值。通过引入通道注意力机制,CBAM 可以学习每个通道在不同空间位置上的重要性和相关性,并根据这些权重进行特征融合,从而提高模型的性能。
②CBAM 的空间注意力机制是另一个子模块,用于学习每个空间位置上的重要性,并对输入特征图进行加权平均。图6 是空间注意力机制的具体实现方式。
图6 空间注意力机制模块
CBAM 的空间注意力机制主要由2 个子模块组成:空间最大值池化(MaxPool)和空间平均池化(APool)。这2 个子模块共同构成了一个空间注意力模块。
CBAM 的空间注意力机制可以用公式 (3)来描述:
式中,σ 表示sigmoid 函数,f7×7表示滤波器大小为7×7 的卷积运算。对经过通道注意力机制的特征层F'=1×H×W 经过全局平均池化和全局最大池化得到Favg'=1×H×W 和Fmax'=1×H×W,之后将这2个结果进行一个基于通道的堆叠拼接,得到一个Favg+max'=2×H×W 的特征图,使用通道数为1 的7×7卷积核进行卷积运算,压缩成通道数为1 的特征图。通过sigmoid 函数运算得到空间注意力特征Ms=1×H×W。
1.3.3 训练参数与分割精度评估指标
试验硬件平台为AMD5600X 处理器 (主频3.70 GHz)和一块英伟达RTX3060 显卡(显存为12 GB)。训练数据采用开源的COCO 数据集中的2 055 张牛体图片,并通过缩放、裁剪等预处理实现了数据增强,能有效地降低由于数据量不足而导致的过拟合现象[11]。
该试验在显存为12 GB 的英伟达RTX3060显卡上运行,使用Python 编程语言在Pytorch 框架内实现。批量大小设为16。初始学习率设为0.001,迭代次数为200,并将网络分类数设为2,以区分牛体区域和非牛体区域。
语义分割的评价指标包括像素准确率(Pixel Accuracy,PA)、平均像素准确率(Mean Pixel Accuracy, mPA)、平均交并比(Mean Intersection over Union,mIU)。可以通过这些评价指标来评估所提出的A-Unet 算法的性能[12]。这些评价指标的计算公式如下所示:
式中,TP 表示模型正确预测为牛体的像素点数量,FP 表示模型错误地将背景像素点预测为牛体的数量,FN 代表模型错误地将牛体像素点预测为背景的数量,TN 表示模型正确预测为背景的像素点数量。
将U-net 与A-Unet 进行对比试验,所有试验均采用相同的损失函数与训练参数。最后,比较各项指标的得分情况。由表1 可知,A-Unet 算法在PA、mPA 和mIoU 方面的表现优于原始网络。这表明,融入注意力机制模块对提高网络性能有实质性的作用。
表1 不同的算法分割结果对比表
1.4 轮廓及体尺测量点的提取
1.4.1 轮廓曲线的提取
牛体轮廓提取首先是通过A-Unet 算法处理原始图像生成掩码图像,再对掩码图像进行二值化处理[13]。然后利用带有掩模信息的二值化图像,使用边缘寻找函数findContours 提取牛体轮廓曲线,最后使用函数drawContours 提取出牛的轮廓。相比于经典的边缘检测方法如Sobel 算子、Canny算子、拉普拉斯算子等[14-15],使用A-Unet 算法分割牛体轮廓曲线再进行边缘提取的方法,不需要进行轮廓优化和轮廓拟合,提高了提取精度,极大地缩短了轮廓提取时间,并且更适用于复杂的背景。图7A 为原始图像,图7B 为A-Unet 算法分割后的图像,图7C 为提取出的牛体边缘轮廓图像。
图7 目标牛体轮廓图
1.4.2 动态网格法提取牛体尺测量点
首先,对二值化的牛体轮廓图像使用boundingRect 函数获取牛体轮廓图像的最大外接矩阵。最大外接矩阵是一个包括图像中所有关键点的水平直角矩形。该函数返回的值中,(x,y)代表矩形的左上角坐标,(w,h)代表矩形的宽度和高度。以(x,y)为坐标原点建立坐标系,为后续体尺测量做好准备(见图8A)。
图8 体尺测量点的提取过程
在牛体轮廓图像处理中,像素点坐标均值是指图像中轮廓线像素点的坐标位置的平均值。针对体型不同的牛体,动态网格中各测量点的提取均建立在其轮廓线像素点的坐标基础之上[16],因此,对于不同的牛体轮廓曲线,可以提取到对应的牛体尺测量点。
①体高测量点鬐甲点A 的获取
如图8B 所示,竖直方向的中部竖线Wm表示牛体像素点横坐标的动态均值,计算方式为xm=x。网格中Wu线表示横坐标像素均值线Wm与其右边界线的等分线,其公式如下:
式中,牛体水平朝左时flag=1,朝右时flag=-1。用于标定体高的鬐甲点A 恰好为Wu线与牛体轮廓的相交点中纵坐标较小的点。与此同时,鬐甲点到最大外接矩阵下边的垂直距离,即为牛体的体高。
②体长测量点肩胛前端点C 的获取
如图8C 所示,动态网格中水平方向的中部横线Hm表示牛体像素点纵坐标的动态均值,计算方式为ym=y。肩胛前端点C 为Hm与其轮廓交点中横坐标较小的点。
③体斜长测量点牛尻点B 的获取
在获取体长测量点基础上,Hu表示Hm均值线以上像素纵坐标的动态均值,计算方式如下:
如图8D 所示,牛尻点B 为Hu与其轮廓交点中横坐标较大的点。
1.5 体尺计算
规定摄像头距离牛体200cm,采用20cm×20 cm的棋盘格在此处进行标定,确定相机的内参和外参,以便将像素坐标转换为实际物体坐标,此处的像素比例记为P。根据上小节提取的4 个体尺测量点,通过欧氏距离计算牛体长、体高以及体斜长的像素长度,随后进一步将像素长度转换为牛的真实体尺数据,采用下述公式计算:
式中,(X1,X2)、(Y1,Y2)是体尺测量点的坐标,L 为体尺长度。计算体高时选取鬐甲点A 到最大外接矩阵的下边的垂直距离为体高的像素长度。测量体长时,选取鬐甲点A 和牛尻点B 的水平距离作为体长的像素长度。计算体斜长时,牛尻点B 到肩端点C 的直线距离为体斜长的像素长度。
2 结果与分析
对采集的21 头牛体图像分别进行试验,对基于A-Unet 的牛体尺测量方法进行验证。首先,采用人工测量方式获取牛只的体高、体长、体斜长3项数据作为试验样本的参考值。接着,使用该研究提出的方法进行轮廓提取和特征点提取,并计算每张图像的体尺数据,作为该方法得出的牛只体尺数据。最后,将自动测量结果与人工测量结果进行比较后,给出了针对牛体的测量误差分析表,详见表2。
表2 牛体测量实验结果表
经过验证,该研究所提出的基于A-Unet 的牛体尺测量方法与人工测量的结果相比,体高平均相对误差为4.16%,体长平均相对误差为4.05%,体斜长相对误差为4.27%。与此同时,该方法测量时不需接触牛只,从而避免了与牛只接触所引发的其他问题。该方法在提取牛只轮廓方面,相较于传统边缘检测处理方法,具有更加精准的提取结果,并且简化了提取步骤,更具有广泛的适用性。结果表明,该方法能够满足设计的所有需求。
3 讨论
牛体尺数据是衡量牛只体型大小和生长发育状况的重要指标。通过测量牛只的身体尺寸,可以了解其体型大小、肉质状况、生长发育水平以及潜在的育种价值,从而为牛只的管理、饲养和育种提供科学依据。此外,牛体尺数据也是进行肉牛生产的必要条件,是评定肉牛肉质等级和肉牛的定级、分类的重要依据之一,因此,牛体尺数据的准确性和可靠性对于农牧业生产和肉牛行业的发展至关重要。
该研究设计了一套基于A-Unet 算法的牛体尺测量方法。该方法通过目标分割、轮廓提取、体尺测量点提取以及体尺计算实现了牛体尺的自动测量,能够有效地替代人工测量的方式。但是,该方法也存在一些局限性,如对于牛站姿不平行于镜头时会存在站姿偏角,导致测得的体尺数据会有偏差。未来的研究可以进一步探讨如何通过改进算法对检测成功率与精准度进行提升,以达到准确无误的牛体尺自动测量的目的,以及如何将该方法应用于实际生产中。
4 结论
与现有牛体尺测量方案相比,该研究提出了一种新的轮廓提取与牛体尺计算的非接触式测量方法,通过与人工测量结果进行对比试验,测得的牛体高、体长和体斜长平均相对误差分别为4.16%、4.05%、4.27%,验证了该方法的可行性。该方法能够满足牧户对于牛体尺测量误差在8%以内的需求,为机器视觉在牛体尺测量方面应用提供了新的参考。