赞
踩
YOLOV3 作为无需区域提名的目标检测算法中的代表算法,可以很好地适应基于视频流的指针式仪表检测任务,能够准确地从复杂生产环境中检测识别出指针式仪表并返回其位置信息,结合OpenCV 就可以从视频流中将指针式仪表的表盘截取出来,便于进行进一步的图像处理并读数。
1 YOLO算法特点
YOLO 算法在整体的实现思路上采用卷积层实现特征的提取,池化层进行特征的筛选,接着在划分好的区域上生成候选框,由候选框实现目标识别与分类,最后用全局平均池化(Global AVG Pool)进行预测[24]。随着YOLO 版本的不断迭代,算法结构的具体实现上也进行了一些优化[25,26]。
1)增加了锚点(anchor boxes)预测:锚点是一组矩阵的集合,在这个矩阵中的每一行都存放着四个值(x1, y1, x2, y2),其中x1、y1 代表了一个矩形框的左上角与右下角的坐标,x2、y2则对应着这个矩形框左上角与右下角坐标相对于划分好的区域中心点的偏移量,通过设置不同的锚点,可以在生成的候选框上实现多尺度的偏移来进行目标的预测与分类。
YOLOV1 采用全连接层直接生成候选框,这使得YOLOV1 在对目标进行预测时,生成的候选框位置非常局限,容易丢失目标的位置信息,因此在YOLOV2 中引入了锚点预测,一共设置了五个锚点,使得每一个划分好的区域所生成的候选框可以在五个尺度上进行偏移,避免了预测时丢失目标的位置信息,锚点预测同样也沿用在YOLOV3 中。
2)增加了残差模块:YOLOV3 在网络结构中引入了残差模块,使得网络的层数得到进一步的加深。YOLOV2 中采用的网络结构中只含有19 层卷积层,在引入残差模块后YOLOV3中的网络结构可以包含53 个卷积层,也被称为Darknet-53。卷积层与卷积层之间采用3*3 与1*1 的卷积核交替使用的方法降低模型的计算量和参数,最后利用全局平均池化进行预测,具体的网络结构如下:
3)增加了批量正则化(Batch Normalization,下面简称为BN)层:随着网络层数的不断加深,网络的输出值output 的分布会逐渐趋于两极化:越来越接近1 或者越来越接近0,输出值的两极化会导致反向传播函数中梯度消失。而BN 层可以让上层传入的输出值在0-1 之间呈正态分布,使得梯度不会消失。同时为了避免因数据正则化而导致上层特征的消失,BN 层引入了学习重构参数γ和β,使得下层的网络可以根据BN 层的学习重构参数还原出上层的特征。
在YOLOV2 和YOLOV3 中,每个卷积层后都会紧跟一个BN 层,可以有效地提高模型的收敛速度,避免模型出现梯度下降导致过拟合。在前向传播中,假设CNN 中的一层BN 层正在对上一层卷积层中m 个卷积核做批量正则化处理,记第i 个卷积核的特征值为xi(此时尚未进入激活函数),求出其批量梯度下降均值记作μB 和批量梯度下降标准差记,经过批量正则处理后的特征值记为,引入学习重构参数γ和β,将该层向下层传递的输出值记作,具体的计算公式如下:
2 YOLOV3算法实现
在Python 环境下利用YOLOV3 进行指针式仪表检测识别模型训练的过程主要包括以下几步:
1)构建训练集与测试集;
2)训练集图像数据标注;
3)模型多轮训练;
4)通过测试集检验训练效果。
2.1 构建训练集与测试集
在进行模型训练之前,需要构建一个合适数量的训练集和测试集。构建训练集的主要图像来自于企业以及学校中相关仪器仪表的拍摄,其中的指针式仪表按形状进行划分主要有两种:圆形的指针式仪表和矩形的指针式仪表。
同时,考虑到生产环境的复杂性,在训练集中还搜集了一部分暗光环境以及表盘存在偏转的指针式仪表图片。
在测试集的数量上,选择以训练集的20%为上限,一共搜集了2062 张相关图片,其中包括:800 张训练集中的原图(用于检验训练集的训练效果)、800 张不存在于训练集中的图片(用于检验训练集的学习能力)以及462 张类似于圆形与矩形指针式仪表的图片(用于评价训练后的模型学习效果)。
2.2 训练集图像数据标注
为了能够进行YOLOV3 模型的训练,利用LabelImg 对训练集中的图像进行标注,主要对以下两种常见形状的指针式仪表进行了标注:圆形的指针式表(常为气压表,标注为meter)和矩形的指针式表(常为电压电流表,标注为vameter),标注效果如下图所示:
2.3 模型多轮训练
使用GPU 对模型进行整体训练,所用的GPU 型号为GTX1660ti,显存大小为6GB,最开始的训练是在基础模型yolo.h5 上进行训练,训练的轮数(epochs)设置为10 轮,每次迭代的图片数量(batch size)设置为4,当batch size 为4 时完成1 个epoch 需要大概20 分钟时间,通过损失值(loss)在代表预测的目标位置与目标实际存在的位置的坐标误差。在完成第一次训练后,将训练轮数为10 轮的模型保存为trained_weights_final.h5,后续的训练均在前一次训练保存后的模型上进行,通过每次训练少量的轮数,使得最终的模型训练的轮数是之前训练轮数的叠加,保证了较好的训练效果,同时也尽可能避免了训练时,因显存大小不够而导致程序崩溃。以10309 张训练集图片作为输入,一共完成了120 轮训练,训练的整体时间与结果记录于表4.1。
2.4 通过验证集检验训练结果
为了可以较为直观地感受每轮训练后模型的检测识别效果,可以搭建一个小型测试集,该测试集中包括了六张训练集中的图像以及八张训练集以外的图像,通过对测试集进行测试,来观察当前模型的识别效果。
搭建的测试集如下图所示:
图4.12 中(a)、(b)、(c)、(d)、(e)、(f)为训练集中的原图,其预测框的置信度越高证明模型训练的越好;(g)、(k)为不在训练集中的指针式仪表图片,其预测框置信度越高说明模型的学习能力越好;(h)、(i)、(j)、(l)、(m)、(n)为类似指针式仪表的非仪表图片,其预测框置信度越低说明模型的对指针式仪表识别效果越好,可以区分出哪些不是指针式仪表。对测试集中图像进行测试,测试效果如下所示:
1)10轮:
2)30轮:
3)50轮:
4)60轮:
5)70轮:
6)80轮:
7)90轮:
8)100轮:
9)110轮:
10)120轮:
将每次测试集中图像是否被正确识别以及识别出的置信分数统计如下表:
根据表4.3 可知当训练轮数为10 轮时,训练集与测试集中存在正常仪表无法识别,非仪表图像错误识别的问题,这主要是因为在基础模型上进行训练时loss 较大,有很多特征并没有被提取到。当训练轮数为30 轮、50 轮和60 轮时,训练好的模型已经可以正常识别指针式仪表,但其学习到的特征只是外壳的形状,这使得模型将许多外形为圆形与矩形的非仪表图像也预测为仪表图像。当训练轮数为70 轮、80 轮、90 轮和100 轮时,模型已经可以很好地识别指针式仪表图像,同时也逐渐从训练集图像中提取了更多高阶特征,可以对非仪表图像进行区分。当训练轮数达到110 轮和120 轮时,虽然仍然有一张非仪表图像被误识别,但模型已经可以较好地分辨哪些是目标图像哪些只是形状相似但并不是目标物。由于在120 轮时非仪表图像的置信度得分又出现了一定的上升,因此,在之后用于检测识别指针式仪表的模型上选择训练轮数为110 轮时的模型。
1.3 识别效果评价
1.3.1 交并比
所谓交并比(IOU),指的就是目标的实际外接矩形框与目标的预测外接矩形框的相交的面积,与两者相交后所围成的图形面积之比。
因此IOU 的计算公式为:
1.3.2 查准率与查全率
为了能进一步对训练好的模型进行评价,通过用完整的2062 张测试集对训练好的110 轮
模型进行测试,并计算其查准率(precision)和查全率(recall)。
在2062 张图片组成的测试集中包括了:
1)1600 张指针式仪表的图片,称之为正样本(positives);
2)462 张非指针式仪表的图片,称之为负样本(negatives)。
如果指针式仪表被识别为指针式仪表,称之为真正样本(true positives, 记为tp);如果指
针式仪表没有被识别出,则称之为伪正样本(false positives, 记为fp)。
如果一张图片的预测框与实际框的交并比大于50%,则可认为是真正样本(tp),反之则认为是伪正样本(fp)。
如果非指针式仪表没有被识别出,称之为真负样本(true negatives, 记为tn);如果非指针式仪表被识别为指针式仪表,则称之为伪负样本(false negatives, 记为fn)。
查准率指的是在识别的所有正样本中,真正样本在其中所占的比例,表达式如下:
查全率指的是在所有被识别为正样本的样本中,真正样本所占的比例,表达式如下:
对2062 张图片在不同的置信阈值下进行测试后,统计相关数据于下表:
当置信阈值设为0.5 时,查准率达到了98.50%,但同时其查全率只有88.94%,这意味着此时的模型可以识别几乎所有的指针式仪表,却也将许多非仪表的物体误判为仪表;当置信阈值设为0.9 时,其查准率达到96.67%,但其查准率只有92.56%,这说明此时的检测模型虽然可以很好的区分出哪些不是指针式仪表,但也遗漏了许多本应检测到的目标。
综上所述,在实际检测指针式仪表时设置置信阈值为0.8 较为合适,此时的查准率为95.56%、查全率为94.15%,对于待检测图像中是否包含指针式仪表具有较好的辨别能力。
采用YOLOV3 对图像进行检测后会返回预测框的坐标值,通过该坐标就可以从输入图像中截取出只包含指针式仪表的部分,可以有效避免复杂背景对之后的读数造成影响。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。