YOLO可以一次性预测多个目标框的位置和类别,其设计理念遵循端到端(原始图像输入到CNN网络中,直接输出图像中所有目标的位置和类别)训练和实时检测。
目标检测的本质实际上是回归,即建立数学模型(CNN网络结构)并计算其中的未知参数,Tiny-yolo的网络结构如下:
模型训练可以独立进行,应用中只需考虑测试过程的计算,下面主要分析对于给定的输入图片,如何计算得到目标框位置及其类别。
测试流程如下:
主要的计算量在于网络预测,YOLO网络主要用到卷积层和池化层,不同的计算层执行的计算如下:
卷积层(Conv.Layer)计算:
离散卷积的计算过程是利用卷积模板(卷积核、滤波器)在原图像上滑动,把对应位置上的元素相乘后加起来,得到最终的结果,即实现滑动-相乘-叠加的操作。
一个卷积核作用于图像,可以得到一个特征图,不同的卷积核可以提取不同的图像特征,在神经网络中,一般会利用多个卷积核充分提取图像的特征,如上图,对于416*416*3的输入图像,采用16个3*3的卷积核,可以得到16个特征图。
池化层(Pooling Layer)计算
池化层主要是对图像不同位置的特征进行聚合统计,例如,人们可以计算图像一个区域上的某个特定特征的平均值 (或最大值)。这些概要统计特征不仅具有低得多的维度 (相比使用所有提取得到的特征),同时还会改善结果(不容易过拟合),这种聚合的操作叫做池化,根据不同的计算池化的方法,又分为平均池化(Average Poolin)和最大池化(Max Pooling)。最大池化(Max Pooling)计算如下图所示:
池化层一般位于卷积层之后。
Tiny-yolo网络模型的前几层为卷积层和池化层的交替连接,后跟三个卷积层,模型的输出即为125个13*13的特征图。filters数目(这里为125)视具体地数据集而定,对于VOC数据集,我们需要预测5个boxes,每个boxes包含5个适应度值(x,y,width,height,confidence),每个boxes预测20类别。因此,输出为125=(20+5)*5 filters。
网络模型的输出即包含了目标框的位置和类别概率信息,接下来根据网络输出信息整合数据得到一系列box,并设置阈值,滤掉得分低的boxes,最后对保留的boxes进行非极大抑制(NMS)处理,去除重复框,得到最终的检测结果。