赵建敏,文博,李琦
(内蒙古科技大学信息工程学院,内蒙古 包头 014010)
牛的体尺参数能够反应牛的生长发育状况、生产性能及遗传特性,可以作为衡量牛生长发育情况的一个主要指标。在选种、肉质评价以及饲养管理等方面,牛体体尺也是一个重要指标[1]。传统的牛体尺测量主要是通过手杖、皮尺进行直接测量,这种测量方法工作量大,而且直接接触牛体,会使牛产生应激反应,极大地影响测量精度和测量效率。
近年来基于计算机视觉的家畜体尺测量改变了接触式的测量方法。主要有利用背景减法、去噪声算法、背景差分法以及自动阈值分割针对家畜进行体尺测量[2-4]。然而,当家畜与背景环境的颜色相近时,利用此类方法测量很难单纯地分割出目标家畜,干扰较强。随后国内相关研究提出利用Kinect相机采集家畜图像。利用Kinect深度传感器获取荷斯坦奶牛的三维点云数据以及使用投影法和差分法识别家畜头部和尾部位置,并利用最小外接矩形法调整牲畜的水平方向[5-7]。此外在猪体尺机器视觉技术研究中,国外相关研究利用VIA系统对猪生长过程进行监测,获取猪体背部体长、体宽、面积参数和形状信息[8-10]。Banhazi等[11]基于单摄像机构建了猪的体宽、体长及面积检测系统,此研究为动物的测量提供了一种新型的工具,通过摄像头获取视频及图像数据,利用一系列的图像处理手段实现目标物尺寸和面积的研究。胡志伟等[12]采用一种基于VGG16与UNET相结合的全卷积神经网络模型,实现对图像语义级别的分割,提取出生猪的轮廓。
在实际图像采集过程中,由于牛的采食习性,很难采集到满足测量要求的理想图像。为了能够更加精确地获取到目标物体的轮廓曲线,在Ubuntu系统下,使用Pytorch深度学习框架、利用Pyqt5搭建了牛体尺测量系统。该系统使用单只摄像头采集牛体图像,利用Mask R-CNN[13-14]模型提取牛体轮廓,结合部位特征对轮廓进行分区,在局部区域根据几何特征提取体尺测点,最终在牛体轮廓线找到体尺部位、体尺特征点,并且结合牛体尺测点计算数据。
采用型号为Intel E5-2680的CPU以及Nvidia 1080Ti的显卡搭建服务器,模型训练采用已公开的COCO、VOC数据集,筛选数据集中牛这一类的全部图像并用于训练分割模型,其中COCO数据集包含2 055张,VOC数据集951张。测试采用实验室仿真测试和实地测试,实验室环境中安装仿真模型牛进行模拟仿真,实地测试环境选择在内蒙古苏尼特左旗合作牧场,随机挑选大小不同的5只牛,实时进行采集图像、体尺计算。
体尺测量系统试验平台主要由摄像头、服务器、测量区域以及体尺测量显示界面组成,测量系统主要包含:目标分割、特征部位特征点的提取以及体尺计算。数据采集层利用摄像头采集牛站姿图片;数据处理层将采集到的牛图片送入Mask R-CNN分割模型中输出具有掩模的图片并且提取出当前牛的轮廓曲线,针对提取出的牛体轮廓曲线进行几何分析得到体尺测点,进一步根据体尺测点计算当前牛的体尺数据;功能展现层则将每一部分的效果图以及体尺信息显示在利用pyqt5搭建的体尺测量系统界面,并最终将每只牛按照各自的ID编号存储至数据库建立牛的档案,设计出基于Mask R-CNN的牛体尺测量系统,系统框架如图1所示。
图1 系统框架
根据生成的具有掩模信息的图像最终提取出闭合牛体侧面轮廓线[15-17]。首先对得到的牛体轮廓线进行滤波得到较好的轮廓曲线,利用分区法提取特征区域,进一步利用U弦长曲率方法[18]计算特征区域中曲率最大点得到牛体尺测点,最终根据像素长度与像素比例之间的比值,计算出牛体体尺数据[19-28]。牛体特征点如图2所。
注:A为臀部特征点,B为髻甲点,E为前足点,D为肩胛前端点,C点为B点的垂点;AB两点之间横坐标的距离为牛体体长,BC之间的垂直距离为体高,AD长为体斜长
数据处理采用Mask R-CNN分割算法。Mask R-CNN是以Faster R-CNN[29]为原型,在此结构上增加了1个分支用于图像分割,整体可以看作是1个通用实例分割架构。Mask R-CNN结构图如图3所示。算法模型使用深度残差网络ResNet101替代传统的AlexNex网络作为特征提取模块,同时将特征金字塔网络(feature pyramid networks, FPN)引入算法中,使用ResNet101和FPN结合的算法进行特征提取,可以在不增加计算量的同时,提升多尺度下小像素的精准快速检测能力。将提取到的特征图(feature map)送入区域候选网络(region proposal network, RPN)提取可能存在的目标区域(region of interest, ROI)。通过对目标区域进行ROI Align池化操作,将特征图与输入图像像素进行对齐,在经过分类、像素分割完成对目标区域的分割。Mask R-CNN 最后的输出有3个分支,其中2个分支经过全连接层进行分类和边框回归,另1个Mask分支经过全卷积网络进行上采样得到分割图。
图3 Mask R-CNN结构示意
1.4.1 轮廓曲线的提取
牛的轮廓提取采用读取Mask R-CNN模型处理原始图像后生成的掩码图像的掩码信息,从而提取出牛的轮廓。掩码的生成是由分割模型对目标物体进行分割,然后构建颜色填充器将目标物体填充颜色。利用摄像头对现场牛彩色图像的采集,将彩色图像送入Mask R-CNN模型生成具有掩码信息的图像,随后读取图像的掩码信息并以坐标的形式存入txt文件中,最后重新读取txt文件并利用plt.show()函数将掩码坐标重新绘制。相比于经典的边缘检测方法,用提取掩码的坐标信息绘制轮廓曲线更为简单快捷,提高了提取精度,极大地缩短了轮廓提取的时间并且更适用于复杂背景。原始图像、掩码图像以及轮廓图像如图4所示。
图4 目标牛体轮廓图像
1.4.2 特征区域的提取
对于得到的曲线采用分区法,将牛的轮廓曲线图分为3个区域,由牛体轮廓图像观察可看到,采集到的牛前、后蹄点处于所得的图像中最下方位置,且前、后蹄点轮廓线分辨明显,易于提取。对前、后足点提取时采用像素逐点扫描的方法。
在寻找前、后足点过程中,为了能够尽可能准确地搜索到前后足点,给定限定条件,即:在测量牛体尺数据时,必须保持牛平行站立于镜头,并且牛的头部在尾部的左侧。因此,在搜索到第1个足点后,此时整个图像会自动被分为A、B、C 3个区域,其中A区域的宽度为牛前足点的横坐标到牛的轮廓最小横坐标的距离,B区域的宽度为前足点的横坐标到牛的轮廓最大横坐标1/2的距离,而C区域的宽度为牛的轮廓整体长度的一半到牛的轮廓最大横坐标的距离。其中,尾部区域位于C区域,利用牛的轮廓横坐标最大点、纵坐标最小的点扩大或减小一定比例作为尾部特征区域的宽度和高度。即利用轮廓曲线横坐标的最大值的0.85至1.1倍的距离作为尾部特征区域的宽度,利用轮廓曲线纵坐标最小值的0.95至1.1倍的距离作为尾部特征区域的高度。髻甲点区域位于B区域内,利用A、B区域分界线的横坐标和轮廓曲线纵坐标最小值采用相同的方法,横坐标的0.95至1.1倍的距离作为髻甲点区域的宽度,纵坐标最小值的0.95至1.1倍的距离作为特征区域的高度。对于肩端区域,根据牛不同的站姿,可能存在A区域内,也可能存在B区域内。利用轮廓曲线纵坐标的平均值做一条水平基线,这条水平基线与牛的轮廓曲线相交的横坐标最小点的0.95至1.05倍作为肩端区域宽度;与此同时利用A区域中纵坐标的平均值的0.95至1.05倍作为肩端区域的高。采用这种方法,可以解决不同大小的牛按照各自身高体长提取自身的特征区域。
1.4.3 体尺测点的提取
体尺测点的测量采用U弦长曲率法计算曲率最大点提取出体尺测点。计算U弦长曲率时,应用与支持领域前后臂矢量夹角相关的一个余弦值作为离散曲率,具体计算公式如下式:
(式1),
对于尾部区域、髻甲点区域、肩端区域,采集各个特征区域内的所有离散点,利用U弦长曲率法计算特征区域内的曲率最大点,曲率最大点即为体尺测点。体尺测点的提取结果如图5所示。
图5 体尺测点提取效果
体尺测量原理示意图如图6所示,测量步骤如下:
①划分测量区域,实际测量之前固定摄像头位置,选取牛圈出口通道作为测量区域,将测量区域按照60 cm间隔分区,并按区域进行标定,获取每个区域的图像像素和实际长度的转换参数;
②牛通过出口进入测量区域后,对图像进行目标分割、提取轮廓曲线;
③对轮廓曲线进行体尺测点的提取得到髻甲点、牛尻点、肩端点;
④利用步骤③得到的特征点计算体尺数据的像素长度,其中计算体长选取髻甲点和牛尻点;体高利用髻甲点进行计算;体斜长选取肩端点和牛尻点进行计算;
⑤判定牛站立区域,其中牛站立区域的判定方法是通过轮廓曲线中牛左前蹄处的像素坐标与步骤①划分的测量区域分界线的像素坐标进行比较,即可判定牛当前所处区域;
⑥根据步骤⑤判定出牛站立区域,进而图像中相应区域的计算参数随即固定,后续步骤采用标定好的参数;
⑦根据公式计算。
图6 体尺测量示意
本文在距离摄像头150 cm处依次间隔60 cm划分4个测量区域,分界线和测量区域的编号按离摄像头的距离从近到远依次排列。分界线采用20 cm×20 cm的棋盘格进行标定,得到该分界线上的像素比例Pn(n=1,2,3,4,5),分区i(i=1,2,3,4)中不同位置呈现的像素比例Pp在本区内进行线性计算,具体计算公式如下式:
(式2),
式中,Yv代表牛所在位置距离第一条分界线的像素长度,Yn、Yn+1分别代表牛所在区域的左右分界线距离第一条分界线的像素长度。进而计算牛体长、体高以及体斜长的像素长度,随后进一步计算牛的真实体尺数据。牛实际体高、体长、体斜长采用下述公式计算:
(式3),
式中,(X1,Y1)、(X2,Y2)是体尺测点的坐标,Pp为牛站立位置的像素比例,其中计算体高时选取髻甲点,利用髻甲点到轮廓曲线最低点的垂直距离作为体高的像素长度;测量体长时,选取髻甲点和牛尻点横坐标的距离作为体长的像素长度;计算体斜长时,体斜长的像素长度为牛尻点与肩端点的直线距离。进而根据实际长度等于像素距离与像素比例的比值计算出实际的牛体尺数据。
牛体尺测量试验主要分为两部分:一部分试验选择以仿真模型牛作为试验样本,在模拟试验环境中测量模型牛站在不同测量区域时的体尺信息;另一部分试验环境选择在内蒙古苏尼特左旗养殖场中,随机选取5只大小不同的牛作为试验样本,在饲养员的干预下使牛站姿尽可能平行镜头时采集当前图片,用于后续体尺测量。
在试验测量中,以皮尺分别测取仿真牛以及真实牛的体高、体长、体斜长3项数据各10次,以每项数据的平均值作为试验样本的真实值。然后利用体尺测量系统将采集到的牛图片分别送入分割模型进行轮廓提取,特征部位、特征点的提取,进一步对每一张图片进行体尺数据计算,然后对同一只牛计算到的体尺数据进行平均,以此作为本系统测得的牛体尺数据,如图7所示为试验测量效果图。
图7 试验测量效果示意
图7左侧为在模拟环境中测量模型牛站在不同测量区域内的体尺信息,以人工方法测量结果为真值,比较系统测量结果与人工测量结果,给出本系统针对模型牛的测量相对误差,见表1。同理,图7右侧为在实际养殖场中进行牛体尺测量,将系统测量结果与人工测量结果进行比较,给出系统测量误差,见表2。
表1 模型牛测量结果
表2 实际牛测量结果
由试验结果可以发现,本系统针对模型牛在不同区域内测量的体长数据与人工测量的数据信息平均相对误差不超过3.56%,体高测量数据与真实数据信息平均相对误差不超过2.48%,体斜长平均相对误差不超过3.81%。进行实地测量时,经验证对牛体体高的实测值平均相对误差较小,其平均相对误差为4.94%;其次为体长,平均相对误差为6.84%;而对牛体体斜长检测误差较大,平均相对误差为8.36%。利用本系统测量时不与牛接触,避免了因接触牛而造成的其他问题,在提取牛轮廓时,与传统方法相比较本系统轮廓提取更加精确,简化了轮廓提取的步骤,适用性更强。试验结果表明此方法满足此次系统设计的需求。
测量系统利用pyqt5搭建显示界面,通过使用槽函数给每一个按钮添加相应的功能使得测量系统每一部分得到的效果都可以展示。系统界面如图8所示。其中ID编号为牛的身份编号,当对活体牛进行体尺测量后,点击保存按钮,即会将不同的牛按照各自的ID编号将体尺信息存储到后台数据库中,建立电子档案,便于查看。
图8 系统主界面
系统采用多线程方法设计应用程序,线程1进行摄像头的采集,调用摄像头的RTSP协议读取视频流,当牛进入测量区域观察后采集10张牛站姿的图片,用于后续试验计算体尺数据信息,当牛未进入测量区域时则不采集图像,因为测量区域相对处于镜头中心位置,在此位置,图像畸变较小,采集的图片明显优于其他位置采集的图像,后续的测量误差会较小。在软件界面的显示窗口中,显示采集图像的其中1张即可。线程2负责将采集到的所有图像送入分割模型提取轮廓曲线,并将处理过后的图像显示在界面的相应窗口,接下来根据数字分析找到体尺测点进行体尺计算,输出10张图像计算后的体尺信息的平均值。最终,将当前测量的牛体尺信息以及处理后的图像按照各自的ID编号存入数据库中,便于建立牛的体尺档案。
本文针对传统测量牛体尺数据、传统提取轮廓耗时耗力等问题,提出了一种基于Mask R-CNN的牛体尺测量系统。试验结果表明,相比较于用背景减法、去噪声算法、背景差分法以及自动阈值分割针对家畜进行体尺测量,采用Mask R-CNN分割模型可以在复杂的背景中有效地提取出牛的轮廓曲线,抗干扰性强同时也提高了轮廓曲线的提取精度,并且对于Mask R-CNN目标分割模型经过训练后,可以使分割模型根据人们的需求对于不同的物体进行目标识别、目标分割,也可达到对于特定物体的轮廓提取。在体尺数据实际测量中,针对模型牛与实际牛不同的试验样本,模型牛的特征部位以及体尺测点明显凸出,并且相对位置固定,不会存在其他外界条件的干扰所以测量精度相对较高。而活体牛,由于毛发以及牛的生态习性、身体姿态相对不固定,所以在寻找特征区域以及体尺测点的过程中误差较大。
本系统在进行牛的体尺测量时,要求牛进入测量区域站姿较好时开始采集图像,并且通过试验测量体长测量误差在6.84%之内,体高测量误差在4.94%之内,体斜长测量误差在8.36%之内。相较于利用Kinect相机采集家畜理想姿态图像后进行体尺计算,本系统采集家畜图像后直接对家畜的轮廓曲线进行体尺计算。本系统对机器视觉技术在家畜体尺测量方面具有积极的意义,为我国牛养殖业的精准化、精细化、智能化提供技术支撑。但在自然状态下,牛的站姿变化对体长、体斜长测量有较大影响。在牛站姿不平行于镜头时会存在站姿偏角,提取体尺测点存在测量误差。针对本系统测量误差以及存在站姿偏角问题,接下来应解决站姿纠偏以及进一步提高体尺测点的提取精度。