基于改进Mask R-CNN的花白鲢去鳞率计算方法研究
2022-06-06肖哲非郑晓伟徐文其
肖哲非,沈 建,郑晓伟,徐文其
(1中国水产科学研究院渔业机械仪器研究所,上海 200092;2 农业农村部远洋渔船与装备重点实验室,上海 200092;3 国家水产品加工装备研发分中心,上海 200092;4 大连工业大学海洋食品精深加工关键技术省部共建协同创新中心,辽宁 大连,116034)
随着经济的发展和人民生活质量的提高,人们越来越重视饮食健康,淡水鱼作为一种低价且优质的蛋白质来源,广受消费者青睐。2020年,中国淡水水产品总量达到了3 234.64万t,但加工转化率仅为12.72%[1],相比于海水产品50.66%的加工率,淡水产品的加工率明显偏低。其原因在于,国内大部分的淡水鱼生产线还存在机械化程度低的问题[2-3]。
近年来,有很多学者投入到淡水鱼加工设备的研发中。去鳞是淡水鱼加工前处理过程中非常重要的一个环节,目前已有各种去鳞设备[4-6]。实时快速的去鳞率计算模块不但可以应用于去鳞设备中,作为运行状态监控,还可以将其结果作为设备验收或评估时的参考之一。上述这些去鳞设备的去鳞率检测都是基于操作者感官评价或在坐标纸上标记剩余鱼鳞面积,不但效率低下而且受操作者主观意识影响,还有可能在测量过程中对鱼体造成损坏。为了更客观准确地检测去鳞率,张军文等[7]提出了使用三维激光扫描仪检测罗非鱼的去鳞率,在罗非鱼体表贴上标靶点贴纸,并将扫描后的模型导入ProE计算,该方法精度高、成像快,但需要应用第三方软件且对操作人员要求较高。
随着计算机科学的不断发展以及工业相机成本的下降,机器视觉识别和检测等技术逐渐引起关注,由于其对鱼体无损、检测快速等特点,在水产行业得到了越来越广泛的应用[8-10]。如通过鱼体图像实现对质量的检测[11-12]、品种分类[13-16]、鱼体损伤区域检测[17]。上述方法都以完整的鱼体作为研究对象,并不能对鱼体的不同部分做精确检测。近些年,越来越多的基于深度学习的实例分割算法被提出,它们可对图像做像素级的检测,预测出输入图像哪一个像素属于待检测目标物体,并且具有良好抗干扰能力以及多维特征提取能力,可应用于复杂的环境里[18-22]。
针对目前国内缺少高效且准确的去鳞率检测方法的情况,本研究将实例分割算法(Mask Region Convolution Neutral Network,Mask R-CNN)进行改进,平衡其运算速度与准确性,以花白鲢作为试验对象,实现对鱼体中有鱼鳞区域与无鱼鳞区域精细分割,并根据分割结果计算去鳞率,为后续智能去鳞机的研发提供参考。
1 改进Mask R-CNN模型结构分析
1.1 Mask R-CNN结构分析
选取实例分割算法(Instance Segmentation)分割有鱼鳞区域与无鱼鳞区域,原因是实例分割算法不仅能输出目标物体的检测框(Bounding Box),而且可以输出图像中属于目标物体的像素点。因此,在多个目标物体距离接近的情况下可大幅降低识别不清,相互重叠的情况[23]。Mask R-CNN是由Hue等[24]提出的一种实例分割算法,该算法使用了Ren等[25]提出的两阶段(Two Stage)目标检测算法Faster R-CNN的总体框架,即阶段一的区域建议(Region Proposal)以及阶段二的边界框回归(Bounding Box Regression)以及分类(Classification)。Mask R-CNN将原算法中用于提取特征图(Feature Map)的VGG网络替换成了ResNet[26]和FPN(Feature Pyramid Networks)[27]结合的网络,ResNet解决了深度学习中层数太多而梯度消失的问题, FPN网络在多尺度目标检测上有更好表现;将Faster R-CNN中的ROI Pooling改进为ROI Align,解决了特征图与原图不对准的问题,提高了检测精度;并在Faster R-CNN的基础上添加了一条与边界框的回归和分类并行的掩膜(Mask)分支,在完成目标检测任务的同时对目标进行像素级别的分割。
Mask R-CNN的结构如图1所示,输入的图像先经过骨架网络(Backbone)提取特征图像(Feature Map),特征图像上的每一点会生成若干个锚框(Anchor)并进入区域建议网络(Region Proposal Network,RPN)进行二分类以及边界框的回归,去掉一部分无用的锚框,ROI Align将剩余的感兴趣区域(ROI,Region of Interest)尺寸统一并与原图对应,最终在得到的感兴趣区域上进行分类,边界框回归以及掩膜生成。
图1 Mask R-CNN模型结构
Mask R-CNN使用的骨架网络包括3个部分,自下而上、自上而下以及横向连接[28-29]。自下而上,即图1中C1至C5层,使用ResNet对原图进行不同尺度的特征图提取,每一层的步长(Stride)都为2,每个阶段输出的特征图分辨率都是上一层的1/4。中间的M5层是由C5层经过1x1的卷积计算得到的,之后的自上而下是使用FPN网络将M5层逐步上采样,得到M4到M1层。最后的横向连接是C2、C3、C4、C5的每一层都经过一个1x1的卷积计算,再分别于M2、M3、M4、M5相加,得到P2、P3、P4、P5,并通过一个3×3的卷积处理消除混叠效应,得到特征图。P6则是由M5经最大池化得到的,P6只用于后续的区域建议网络中,并不作为特征图输出。ResNet和FPN相结合的特征提取网络在计算量保持不变的前提下,提高了对小尺度物体的检测能力。
经过骨架网络提取的特征图上的每一点会自动生成大量的锚框,锚框由RPN中的一个分支softmax进行二分类,包括目标物体的为正例,不包含目标物体的为负例。 区域建议网络中另一个分支用于计算锚框的边界框回归偏移量。两个分支的计算结果结合以获得精确的建议锚框。从精确的建议锚框中剔除超出边界以及太小的锚框,再通过非极大值抑制(Non-Maximum Suppression)对包含目标物体的锚框进行筛选,得到感兴趣区域。
当目标物的边界框对应到特征图上时,以及得到感兴趣区域映射成固定尺寸时,得到的值通常是浮点数。在Faster R-CNN中,这两个浮点数被量化取整,而产生的误差导致了特征图上的感兴趣区域在对应到原图上出现很大的偏差[20]。为了消除这部分误差,Mask R-CNN提出了ROI Align,引入了双线性插值的概念,取消了量化操作,保留了小数[30-31]。
图2展示的是Faster R-CNN中使用的ROI Pooling和Mask R-CNN中使用的ROI Align的对比。假设原图大小为800×800,目标物体在原图中大小为665×400,得到的特征图大小为32×32,包含着目标物体的边界框对应到特征图上时,得到的结果是(665/32)×(400/32)=20.78×12.5,ROI Pooling将其量化为20×12,之后再次将20×12的ROI映射成大小为7×7的ROI时,结果为(20/7)×(12/7)=2.86×1.71,ROI Pooling将其再次量化为2×1。两次量化过程造成了数据量丢失,导致了特征图上的感兴趣区域在对应到原图上出现偏差。
图2 ROI Pooling 和ROI Align的对比
而ROI Align则通过双线性插值将浮点数保留下来。双线性插值的本质是通过x和y两个方向上分别做线性插值来计算二维区间上某一点的值[33]。如图3中左图所示,已知Q11、Q12、Q21和Q22的值,计算P点的值可先在x方向上对Q11和Q21做线性插值,得到R1的值,再在x方向上对Q12和Q22做线性插值,得到R2的值,随后在y方向上对R1和R2做线性插值,得到P的值:
(1)
(2)
(3)
式中:Q11、Q21、Q12和Q22图中已知值的像素点,坐标分别为(x1,y1)、(x2,y1)、(x1,y2)和(x2,y2)。R1、R2以及P是数值为未知的像素点,坐标分别为(x,y1)、(x,y2)和(x,y)。
图3右图为ROI Align的示意图,图中虚线部分表示特征图,实线部分表示感兴趣区域,这里将感兴趣区域切分成2×2的单元格,假设采样点数为4,将每个单元格分成2×2的小单元格,中心点则是采样点。但采样点的坐标一般都为浮点数,于是使用双线性插值得到中心点的值,然后再对每个单元格内的四个采样点做最大池化处理,即可得到ROI Align的结果。
图3 双线性插值(左图)和ROI Align(右图)
得到的感兴趣区域通过3个分支分别进行边界框回归,分类以及掩膜的生成,最终同时得到目标识别以及实例分割的结果。
1.2 Backbone改进
1.2.1 注意力机制模块SENet
本研究目的是实现去鱼鳞率的识别,实际应用中需要分割的实例只有2个,即鱼体上无鱼鳞的区域和有鱼鳞的区域。对于鱼体的其余部分,比如鱼头鱼尾不需要给予特别的关注。并且需要分割的实例相对于整张图像只是小部分。并且考虑到在实际应用中,检测的快速与准确同时重要,针对这种情况对骨架网络进行改进,使用层数较小的ResNet50保证计算速度,并加入注意力机制模块SENet提高检测精度。
Squeeze-and-Excitation Net (SENet)是由Hu等[32]提出的一种网络,它改变了传统卷积神经网络(convolutional Neural Networks,CNN)对每一个通道同等关注的特点,对不同的通道赋予了权重,使得网络更加重视有价值的通道。SENet的基本结构如图 4所示。
图4 注意力机制SENet结构
在得到大小为H×W×C的特征图U之后,首先对其进行挤压操作(Squeeze):对U进行全局平均池化(Global Average Pooling),得到大小为1×1×C的数列,计算公式为:
(4)
U=[u1,u2,…,uc]
(5)
式中:zc表示挤压操作的计算结果,uc表示构成U的第c个二维矩阵,其高和宽分别为H和W。
选择全局平均池化,可以保留了全局感受野,使网络的低层也可使用全局信息。
之后将挤压操作的结果做非线性变化,即激活操作(Excitation),为每一个通道生成权重。激活操作的计算公式如下:
s=Fex(z,W)=σ[g(z,W)]=σ[W2δ(W1z)]
(6)
(7)
式中:sc为各个通道对应的权重。
1.2.2 改进Backbone结构
将SENet作为模块插入到ResNet50的stage2、stage3和stage4中。加入SENet后,输出的特征图每一层都会被赋予相应的权重。而stage5由于层数较多,如果加入SENet需要较大的计算量,为了保证计算速度,本研究中没有在stage5中加入SENet。
由上文可知,加入SENet后多出的计算量主要来源于2个全连接层,为了平衡加入SENet而增加的计算量,减少了stage4的层数,并且为了提高模型的泛化能力与鲁棒性,防止过拟合,在最后一个全连接层前加入dropout。
图 5为原ResNet50的结构与经过本文改进后的结构。
图5 原ResNet50与改进后的ResNet50结构图
1.3 改进损失函数
Mask R-CNN的损失函数由3个部分构成,分别是分类误差Lcls,边界框误差Lbox以及掩膜误差Lmask,公式如下所示:
L=Lcls+Lbox+Lmask
(8)
本研究中去鳞率的计算完全取决于掩膜的分割,为了使模型学习过程中更加侧重掩膜的分割,本研究在掩膜误差Lmask前乘以1.05,改进后的损失函数如下式所示:
L=Lcls+Lbox+1.05Lmask
(9)
2 试验验证
2.1 样本采集
图像采集使用Basler acA1920-155ucMED,拍摄的图像分辨率为1 920×1 200,使用两条24 W白色条形LED背光光源作为辅助。
使用自制的数据集训练花白鲢去鳞率的检测。 选用36条1.1~1.8 kg的花白鲢,购于上海当地市场。使用电动去鳞工具对鱼体进行去鳞处理后拍摄照片,每一条鱼在不同的角度下拍摄10到15张图像,共采集435张图像。使用Labelme对图像中鱼体的无磷区域(图6a中红色区域)和有鳞区域(绿色区域)进行标注,其余部分为背景,标注图如图6a所示。为了防止训练过程中的过拟合,采用水平翻转、垂直翻转、高斯模糊等方法扩充数据集,将原图中一半数量的图像水平翻转,剩余图像水垂直翻转,再每次从原图中随机抽取270张图像,分别进行高斯模糊,加噪声,增强饱和度和对比度的操作,将数据集扩充到1 950张。数据增强图像如图6b~图6g所示。
图6 标注图与数据增强
增强后的数据集按照8∶1∶1的比率划分为训练集、验证集和测试集。其中1 560张图像为训练集,用于训练模型。195张图像作为验证集,在训练过程中调整参数。195张图像被用作测试集,用于最终的模型评估。训练中分类为2+1,即无鱼鳞区域、有鱼鳞区域以及背景。
2.2 环境搭建
深度学习的训练环境包括Intel Xeon© W-2158 CPU的处理器和内存为8G的NVIDIA GeForce RTX 2080 Ti显卡。操作系统为64的Ubuntu 18.04,使用Python编程语言以及开源的Pytorch框架构建深度学习网络。
2.3 模型训练
将Labelme标注后的数据集转化为COCO数据集格式,并且在预训练模型上做迁移训练,batch size设为4,动量因子为0.9,初始学习率设为0.001,在80个epoch(所有的样本都送入网络训练一编,称为一个epoch)时权重衰减为0.000 1,使用随机梯度下降算法对网络进行优化,一共训练 200个epoch。
图7中展示的是Backbone为ResNet50的Mask R-CNN与改进后的Mask R-CNN在训练过程中的损失值对比。
图7 训练过程中总损失值与掩膜损失值
从图7中可以看出,原Mask R-CNN一开始的总损失值和掩膜损失都小于改进Mask R-CNN,这是因为改进Mask R-CNN的损失函数中掩膜分支前加了系数,所以一开始损失函数较大。但随着训练的进行,大约在40个epoch之后,改进Mask R-CNN的损失值开始小于原Mask R-CNN,持续下降直至最终收敛。在训练200个epoch后,改进Mask R-CNN的总损失值和掩膜损失值都小于原Mask R-CNN。
模型最终会输出检测的目标物体的分类以及属于该分类的掩膜。掩膜的大小为图像大小,属于该目标物体的像素即为1,不属于的记为0。分别统计属于有鱼鳞分类的像素总数以及无鱼鳞分类的像素总数,通过公式(10)可得到去鳞率。
(10)
式中:D为去鳞率,M1为无鱼鳞区域像素总数,M2为有鱼鳞区域像素总数。
为了定量评价算法的综合性能,选取精确率(Precision)以及召回率(Recall)作为评价标准。精确率表示在所有检测出来的目标物体中,有多少是真正的目标物体,召回率则表示所有被标记的目标物体有多少被检测出来。
(11)
(12)
式中:XTP(True Positive)为人工标记和算法预测都为目标物体的样本数量,XFN(False Negative)表示人工标记为目标物体而算法未能预测为目标物的样本数量,XFP(False Positive)为人工未标记为目标物体而算法预测成目标物体的样本数量,PR表示精确率,R表示召回率。
3 结果与分析
3.1 改进模型与原模型结果对比
表1展示了原Mask R-CNN模型、改进的Mask R-CNN模型的评价结果以及平均检测每张图片所需要的时间(平均运行时间均由本文中提到的实验平台测量得出)。在同样的试验平台下训练了以ResNet101为Backbone的Mask R-CNN作为对比。可以看出,在原ResNet50基础上改进的模型相比于原ResNet50,查准率与查全率都有明显提升,分别提高了19.7%和16.8%,并且运行时间仅增加了1 ms,即2.12%。原ResNet101模型的查准率和查全率比改进模型分别提高1.2%和1.3%,但是运行时间增加了50%。由此可见,本文改进模型在检测精度和运行速度上达到了较好的平衡,在运行时间基本没有增加的情况下精度接近于更复杂的模型。
表1 对比试验结果
图8a为改进模型输出的特征图,图8d为ResNet50作为Backbone的原模型输出的特征图,图8b和图8c为改进模型的检测结果,图8e和图8f为原模型的检测结果。从图8中可以看出,改进模型的结果明显优于原模型。改进模型的特征图中包含了更加丰富的语义信息,并且仅图8c中在大片无鱼鳞的鱼体上有零星的鱼鳞没有被识别出来。原Mask R-CNN的检测结果中有明显的错误,图8e中靠近鱼体腹部以及尾部的无鱼鳞部分被错误识别为有鱼鳞鱼体,图8f中也有大面积的有鱼鳞鱼体被识别为无鱼鳞鱼体。
图8 原Mask R-CNN与改进Mask R-CNN的特征图与结果图
本模型分别与基于改进Mask R-CNN电力设备锈蚀识别[34]和改进Deeplab v3+网络的手术器械分割方法[35]中的结果作对比,改进模型精确率分别提高4.9%和3.2%。 基于DeepLab V3模型的图像语义分割速度优化研究[36]主要以提高运算速度为主要研究目的,本模型的运算速度比其快53%。
3.2 误差分析
将训练后的模型与人工测量结果进行对比,共检测了8组样本,经去鳞处理的鱼体分别通过相机拍摄图像,放入模型中计算结果,以及在坐标纸上描画出无鱼鳞区域以及有鱼鳞区域并计算面积。改进的Mask R-CNN在去鳞率计算上平均相对误差为4.5%。此外,模型检测结果相比于人工检测结果都有偏高的现象。经分析,产生误差的因素主要有两点:一是二维图像无法完全拍摄到鱼体腹背部弯曲的部分;二是分割结果在边缘部分有缺失或不平整的现象。
表2 平均相对误差结果
与人工测量结果作对比,检测误差主要来源于两个方面,一是鱼体中背部、腹部由于其弯曲的表面,相机无法完全拍摄到这部分鱼体以及鱼鳍下覆盖的面积,鱼体中背部和腹部的实际面积大于图像中呈现的像素面积;二是当无磷区域面积小于3 cm2时,发现很难识别出无磷区域。
4 结论
提出了一种基于深度学习的无接触去鳞率检测方法,在特征提取网络中插入注意力机制,并修改损失函。在相同的训练集以及训练环境中,改进模型将精准率从70.9%提高到90.6%,召回率从75.1%提高到91.9%。在基本没有增加运算时间的前提下,提高了检测精度。 本模型对面积小于3 cm2左右的鱼鳞仍有识别不清的情况,并且普遍有掩膜边界分割不精细的情况。但相比于费时费力的人工检测,本模型实现了便捷、快速、无损、低成本和较高准确率的去鳞率计算。通过进一步优化模型,得到更加准确耗时更小的模型是下一步研究目标。将本研究的方法应用于去鳞设备中,实时监测并反馈去鳞效果,或作为检测模块用于评估一台去鳞设备的优劣,为智能农机提供参考。
□