基于SSD的棋子检测算法研究

2020-01-07 10:43刘帅郭滨陈亮张晨洁
关键词:置信度棋子光线

刘帅,郭滨,陈亮,张晨洁

(长春理工大学 电子信息工程学院,长春 130022)

人类能很容易判别图像中的不同目标,关注其中的关键部分而计算机很难。计算机理解的图像是二维(灰度图)或者多维(RGB,RGBA)的像素数值矩阵,计算机需要从一个不同的像素数值区域识别不同数字区域代表的含义。传统算法基于计算机视觉理论,以计算机视觉理论为基础提取图像信息进行识别。如:HOG[1]、DPM[2]等,在目标检测领域取得了重大突破。随着深度学习的流行,以深度学习为基础的目标检测算法在识别的准确度和速度上有了重大突破。RCNN[3]开启深度学习检测先河,在此算法基础上Fast RCNN[4]通过引入ROI共享计算结果让模型检测的速度有了很大提高,随后的Faster RCNN[5]引入RPN网络,在速度上有了更大提高的同时提升了精度。R-FCN[6]在输出间共享计算,同时能处理位置不变性,提高速度的同时还能保证准确度。YOLO[7]在速度上有了极大提升,在Titan X上检测VOC帧率30,最高帧率200左右,能在视频流中流畅检测物体。这些检测框架庞大,实现起来也较复杂。迁移学习[8]的流行使得训练一个超大型网络变得简单,不同网络之间相互借鉴,优势互补使得快速构建优异性能的网络的工作变得容易。本文目标是识别小型简单物体:象棋。该问题的难点在于象棋棋子数据简单,数据容易重复。另外检测的目的是为了实现人机对弈,尽管使用不同种类的象棋数据能提高算法对于象棋目标检测的适应能力,但是对检测本论文提供的象棋这个任务来讲除了加大了数据标注的任务量外并不能产生其它好处。而直接识别每个棋子究竟是什么需要大量差异化的棋子样本。例如:每个类别300张,总共标注图像就达到了4 200张,每张图像摆满32个棋子(单图多目标),单目标标注超过12万(4 200×32)张。测试中每个类别64张左右的数据在训练长达10小时后能在训练集以接近100%的检测置信度检测目标,但是在新的图像下识别却经常出错。于是本文改变思路追求准确定位,通过将每个象棋棋子分别标记为“chess”扩大单目标“chess”的数据规模,然后通过标签映射实现将无差别的“chess”分别映射上对应的具体棋子类别,最终获得了不错的检测结果。

1 相关工作

检测任务中一个重要的工作是识别,近几年的识别网络的发展呈现的趋势是深度越来越深,网络结构越来越复杂。从AlexNet[9]、VGG[10]、GoogLenet[11-13]、ResNet[14]、DensNet[15]神经网络的层数从AlexNet的7层到甚至上千层的DenseNet。网络性能有了很大提高。但是网络的深度越深优化难度越大且越容易导致过拟合,残差网络的出现改变了这种状况,残差网络特殊的“跳过”结构让其在保证网络深度的同时依然容易训练。本文检测框架在SSD[16]原始论文的基础上通过修改骨干网络VGG为ResNet101获得。

2 SSD原理

SSD原理图如图1,输入图像经过骨干卷积神经网络(ResNet)输出高维特征,高维特征通过卷积融合,将特征图汇聚,汇聚的位置为检测目标的激活(表示此区域能检测目标),如图1输出的矩形区域表示检测到的棋子目标所在的激活区域。如果图像中有多个目标将输出多个矩形区域代表多个目标。

图1 SSD原理

不同的骨干网络有着不同的网络性能,同样的算法下性能优异的骨干网络能获得更加优异的效果。网络深度越深网络的抽象能力越强,简单数据提取的信息越多,越容易分类。而网络深度越深,网络的训练越困难。卷积神经网络层层处理的过程可以理解为是用一个高维非线性函数拟合高次多项式的过程,训练过程需要寻找最优输出。深度越深,非线性函数越复杂,越难优化。残差网络通过特殊的“building block”,使用F(X)+X联合输入减少参数数目,在加深网络的同时减少参数,降低网络复杂度以提升网络的抽象能力。完整的ResNet101网络结构如图2。网络由基本的卷积,缩放,batch normalization(Google提出BN训练以减小由不同层之间的联动变化导致的参数调整困难的问题同时使用两个小卷积3×3代替大卷积5×5,优化检测结果),激活函数组成。网络的主体部分由这些基本单元构成。不同之处为通过网络生成的函数F(X)和输入X求和(这里的X表示某一残差单元的输入),为了防止F(X)可能和X的形状不匹配,这样通过WX转化其形状。残差部分由F(X)+X和F(X)+WX的叠加组成。ResNet通过输出残差预测避免网络退化问题,残差连接的网络将网络的级联乘法操作转化成了加法操作,级联乘法会产生梯度消失和梯度爆炸的问题,而转化成加法操作后这些问题将得到避免。

图2 ResNet101框架图

骨干网络提取的高维语义特征通过增加的卷积层来构造网络结构。对其中不同的卷积层的输出特征图分别用两个不同的卷积核进行卷积,一个输出分类用的置信度,每个默认框生成c个类别置信度。一个输出回归用的定位,每个默认框生成4个坐标值(x,y,w,h)。此外,这些特征图还经过prior box层生成prior box(生成的是坐标)。上述特征图中每一层的默认框的数量是给定的。最后将前面计算结果分别合并然后传给loss层。

图3 特征图

这里假定图3有8×8和4×4两种不同的特征图。这里的第一个概念是特征图单元,特征图单元是指特征图中每一个格子,如上图3中分别有64和16个单元。默认框是指在特征图的每个小格上都有一系列固定大小的框,如上图3有4个(虚线框)。假设每个特征图单元有k个默认框,那么对于每个默认框都需要预测c个类别得分和4个偏移,那么如果一个特征图的大小是m行n列,也就是有m×n个特征图单元。那么这个特征图就一共有(c+4)×k×m×n个输出。这些输出个数的含义是:采用3×3的卷积核对该层的特征图卷积时卷积核的个数,其包含两部分:数量c×k×m×n是置信度输出,表示每个默认框的置信度即类别的概率;数量4×k×m×n是定位输出,表示每个默认框回归后的坐标)。训练中的prior box,是指实际中选择的默认框(每一个特征图单元不是k个默认框都选取)。即:默认框是一种概念,prior box是实际的选取。训练中一张完整的图片送入网络获得各个特征图,对于正样本训练来说,需要先将prior box与真实框做匹配,匹配成功说明此prior box所包含的是目标,但离正确的框还有距离,训练的目的是保证默认框的分类置信度的同时将prior box尽可能回归到真实框位置。例如:假设一个训练样本中有2个真实框,所有的特征图中获取的prior box一共有8732个(原始论文)。可能分别有10、20个prior box能分别与这2个真实匹配上。

训练的损失包含定位损失和回归损失两部分,这里的默认框和Faster RCNN中的anchor类似,在Faster RCNN中anchor只用在最后一个卷积层,但是在本文中,默认框是应用在多个不同层的特征图上以识别不同的aspect ratio(横纵比)和scale(大小)的目标。默认框的大小和横纵比定义中,假设用m个特征图s做预测,那么对于每个特征图而言其默认框的大小是按以下公式计算的:

这里Smin=0.2,表示最底层的大小是0.2;Smax=0.9,表示最高层的大小是0.9。

至于比例,用ar表示共有5种比例

因此每个默认框的宽的计算公式为:

高的计算公式为:(宽和高的乘积是scale的平方)

另外当aspect ratio为1时,原论文作者还增加一种scale的默认框:

因此,对于每个特征图单元而言,一共有6种默认框。

可以看出这种默认框在不同的特征层有不同的大小,在同一个特征层又有不同的比例,因此基本上可以覆盖输入图像中的各种形状和大小的目标。损失函数定义如下(交叉验证的时候α=1):

式中x表示是否有目标,c表示置信度,l表示预测框,g表示真实框,Lconf表示置信损失,Lloc表示定位损失,N为匹配的默认框的数量,N=0时损失为0。

置信度损失(Softmax损失):

3 训练与测试

3.1 训练网络

训练过程中框架图如图4所示。

图4 SSD框架

图5 训练进程

训练进程如图5所示,训练在接近6×105步的时候接近损失收敛,训练速度稳定在14.6 global_step/sec左右。训练过程中不同损失的变化如图6所示。

图6 损失图

训练进程中特征提取器(CNN部分)卷积核的参数变化情况。可以看出训练过程中前几层特征提取参数变化几乎不变,这是因为训练基于预训练权重,网络会更新后层定位分类层的卷积参数。

图7 特征提取层CNN参数变化

CNN中参数的分布情况

图8 训练过程中各层参数分布

训练进程中图片数据在三维空间中的变化情况,其数值代表图像ID。

图9 图像高维空间可视化

3.2 棋子映射

对弈的时候,摄像头的位置是固定的。在固定的图像中预先分配指定的区域,这个区域的目标会被标记为它的类别。“兵”周围的框代表了目标中心坐标允许出现的范围,如果目标框中心坐标在棋子“兵”的允许范围内(“兵”应该在的位置),这个棋子被认为是“兵”。相同的棋子被以颜色加上棋子命名,例如红炮,黑炮(实际代码中标签为pao_hong和pao_hei)。映射框范围大约是一个框像素的1/3。这样是为了防止棋子摆放不规整和镜头边缘畸变导致的错误。真正对弈的时候摄像头获取的画面是连续的,摄像头通过对比前后帧目标变动确定移动的棋子是哪一个,然后更新其到新的位置。(实际使用过程中的前后帧是0.1 s间隔获取图像而不是视频流中的前后帧(1/25),因为直接获取连续视频中的每一帧会导致计算复杂。)在下文的测试过程中并没有添加测试类别进行测试,所有测试均在神经网络输出结果下测试,以下图保证测试结果能完全反应神经网络性能。

图10 标签映射过程

3.3 检测效果

在不同的环境条件下获取检测结果,图11是常规条件下的单目标和多目标检测。可以看出在光线正常情况下,模型以99%的置信度完成检测。

图11 检测过程

为了验证模型的适应能力,在不同强度光线条件下检测,结果如图12所示。

在四种不同的光线强度条件下多棋子检测结果,检测置信度均为99%。体现出模型对于光线变化的适应性。极端黑暗光线条件下的检测结果如图13所示。

图12 不同光线条件下检测效果

图13 极端黑暗条件测试结果

可以看出模型对光线的抗干扰能力极强,在这样的光线条件下人眼已经分辨不出棋子但模型依然正确检测到了大部分的棋子。

图14 形状检测

从单目标图像检测的结果可以看出在光线好的情况图14(a)轮廓检测的结果图14(b)霍夫变换的结果下,基于轮廓检测方法和霍夫变换方法都取得了非常不错的结果。因为人工标注存在误差,这两种图像处理算法的处理结果甚至比基于深度学习算法的目标检测方法更优异。虽然图像处理方法光线条件较好的时候检测准确、快速,但是与神经网络算法相比均容易受到环境影响,主要体现在:

对光线敏感,不同光线条件下,图14(b)检测的轮廓或者图14(a)霍夫圆不同。

对参数敏感,不同二值边界下,图14(b)检测到轮廓数量不同,不同霍夫参数下图14(a)霍夫圆不同。

两种方法在多目标下无法配置参数使图像各个部分的检测最佳,只能局部最优。

在光线比较暗的条件下使用本文的模型,其结果如图15所示。

图15 模型对比

看到基于轮廓检测的方法在光线较差的条件下,即使是单目标也很难找到目标轮廓,而本文提出的模型能准确的找到目标。

尽管本文的模型的检测准确度相比于传统算法有较大优势,但是速度相对于传统算法,却不占任何优势。轮廓检测和霍夫变换检测都能做到对单一物体的实时检测,对单一物体而言,本文模型检测时间几乎在3 s级别(没有优化网络结构和权重)。为了加速计算,本文使用OpenVINO优化引擎进行网络剪枝(将整个网络中对整体精度影响很小的层删除以节省推理时间),同时通过多层融合将多个层间的计算合并为一个操作提高计算效率。权重压缩可以压缩存储空间,以提高推理速度。压缩网络后的结果如表1所示。

表1 不同硬件条件下测试性能

4 结论

本文提出修改的SSD框架很好的克服了象棋数据简单容易过拟合的问题。同时为了能在实际上使用,借助图融合,剪枝网络,量化权重等方法缩小模型文件尺寸和网络结构的复杂度,使得推理速度能在普通双核CPU上达到1 s左右的速度。但是因为数据量的问题,本文需要检测结果进行进一步处理,映射标签的过程依赖于摆放棋子的位置,如果摆错映射将出错。在未来将扩展直接对棋子的识别,省去进一步处理,同时结合TensorRT优化工具进一步提高推理速度。

猜你喜欢
置信度棋子光线
置信度辅助特征增强的视差估计网络
一种基于定位置信度预测的二阶段目标检测方法
硼铝复合材料硼含量置信度临界安全分析研究
棋子多少颗
摆棋子
有趣的棋子
消失的光线
“你看不见我”
正负关联规则两级置信度阈值设置方法